![](/img/trans.png)
[英]unsigned long , unsigned char in Objective C to Swift
[英]Buffer (unsigned char *) concatenation in C
對於C開發人員來說,這可能是一個非常簡單的問題,但是,我是C的新手,我還沒有完全掌握C背后的所有概念。 因此,現在,我使用以下代碼來連接2個緩沖區(audioData和silenceData),然后使用它們來傳輸一些音頻:
typedef struct {
unsigned char * data;
UInt32 size;
} SoundData;
SoundData audioData;
audioData.data = audioFiles[currentSoundDataIndex];
audioData.size = audioFilesSize[currentSoundDataIndex];
SoundData silenceData;
silenceData.size = 44100*2*fabs(silenceDuration-0.049f);
silenceData.data = malloc(silenceData.size);
memset(silenceData.data,0,silenceData.size);
//beat data
SoundData beatData;
beatData.size = (audioData.size + silenceData.size);
beatData.data = malloc(beatData.size);
for (int i=0; i<audioData.size; i++) {
beatData.data[i] = audioData.data[i];
}
for (int i=audioData.size; i<beatData.size; i++) {
beatData.data[i] = silenceData.data[i-audioData.size];
}
這可以正常工作,但是我感覺必須有更好的方法來實現,也許某些內置函數?
一次,您可以使用memcpy,而不是使用循環,這要快得多,即:
memcpy(beatData.data, audioData.data, audioData.size);
用memcpy
替換for
循環是有意義的。 否則沒關系。
memcpy(beatData.data, audioData.data, audioData.size);
memcpy(beatData.data + audioData.size, silenceData.data, silenceData.size);
實際上,您正在創建的靜音數據只是一堆零。 應該真正存儲它,以便稍后再附加到另一個緩沖區。 因此,應將第二個memcpy
替換為memset
。
memcpy(beatData.data, audioData.data, audioData.size);
memcpy(beatData.data + audioData.size, 0, beatData.size - audioData.size);
我肯定會使用memcpy()
…它會快得多,因為該標准庫函數使用編譯器內部函數或手工編碼的程序集,以最大程度地加快將一個字節緩沖區復制到另一個緩沖區的速度。可以針對您的處理器平台進行優化。 這比for循環快得多...
例如:
unsigned char* temp_buffer_loc = beatData.data;
memcpy(temp_buffer_loc, audioData.data, audioData.size);
//now put silence data at the end of the buffer
temp_buffer_loc += audioData.size;
memset(temp_buffer_loc, 0, silenceData.size);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.