[英]Endianness in wav files
我試圖制作一個簡單的 wav 作家。 我想這樣做,以便我可以讀取 wav 文件(使用預先存在的 wav 閱讀器),重新采樣音頻數據,然后將重新采樣的數據寫入另一個 wav 文件。 輸入文件可以是 16 bitsPerSample 或 32 bitsPerSample,我想用相同數量的 bitsPerSample 保存重新采樣的音頻。
作者正在工作,但有幾件事我不明白與字節序有關,我希望有人能夠幫助我?
我以前沒有讀寫二進制文件的經驗。 我首先在網上查找 wav 文件格式,並嘗試按照正確的格式寫入數據。 起初,寫入不起作用,但后來我發現 wav 文件是小端的,它試圖使我的文件編寫器與此一致,從而引起了我的大部分問題。 我現在已經讓 wav 編寫器開始工作了(通過一個測試,我讀入了一個 wav 文件並檢查我可以編寫未采樣的音頻並重現完全相同的文件)但是有幾點我仍然不確定用字節順序做,我希望有人可以幫助我?
假設相關變量已經設置在這里是我的 wav 編寫器代碼:
// Write RIFF header
out_stream.write(chunkID.c_str(),4);
out_stream.write((char*)&chunkSize,4);
out_stream.write(format.c_str());
// Write format chunk
out_stream.write(subchunk1ID.c_str(),4);
out_stream.write((char*)&subchunk1Size,4);
out_stream.write((char*)&audioFormat,2);
out_stream.write((char*)&numOfChannels,2);
out_stream.write((char*)&sampleRate,4);
out_stream.write((char*)&byteRate,4);
out_stream.write((char*)&blockAlign,2);
out_stream.write((char*)&bitsPerSample,2);
// Write data chunk
out_stream.write(subchunk2ID.c_str(),4);
out_stream.write((char*)&subchunk2Size,4);
// Variables for writing 16 bitsPerSample data
std::vector<short> soundDataShort;
soundDataShort.resize(numSamples);
char theSoundDataBytes [2];
// soundData samples are written as shorts if bitsPerSample=16 and floats if bitsPerSample=32
switch( bitsPerSample )
{
case (16):
// cast each of the soundData samples from floats to shorts
// then save the samples in little-endian form (requires reversal of byte-order of the short variable)
for (int sample=0; sample < numSamples; sample++)
{
soundDataShort[sample] = static_cast<short>(soundData[sample]);
theSoundDataBytes[0] = (soundDataShort[sample]) & 0xFF;
theSoundDataBytes[1] = (soundDataShort[sample] >> 8) & 0xFF;
out_stream.write(theSoundDataBytes,2);
}
break;
case (32):
// save the soundData samples in binary form (does not require change to byte order for floats)
out_stream.write((char*)&soundData[0],numSamples);
}
我的問題是:
在 soundData 向量中,為什么短褲向量的字節序很重要,而浮點數向量不重要? 在我的代碼中,我顛倒了短褲的字節順序,但沒有顛倒浮點數。
最初我試圖在不顛倒字節順序的情況下編寫短褲。 當我編寫文件時,它最終只有它應該大小的一半(即丟失了一半的音頻數據,但那里的一半聽起來是正確的),為什么會這樣?
我沒有顛倒其他單個變量中短和長的字節順序,這些變量基本上是構成 wav 文件的所有其他字段,例如 sampleRate、numOfChannels 等,但這似乎不會影響 wav 文件的播放。 這僅僅是因為媒體播放器不使用這些字段(因此我不能說我弄錯了)還是因為這些變量的字節順序無關緊要?
在 soundData 向量中,為什么短褲向量的字節序很重要,而浮點數向量不重要? 在我的代碼中,我顛倒了短褲的字節順序,但沒有顛倒浮點數。
實際上,如果您仔細查看您的代碼,您會發現您根本沒有反轉短褲的字節序。 在 Intel CPU(或任何其他低端 CPU)上,您也不需要這樣做。
最初我試圖在不顛倒字節順序的情況下編寫短褲。 當我編寫文件時,它最終只有它應該大小的一半(即丟失了一半的音頻數據,但那里的一半聽起來是正確的),為什么會這樣?
我不知道沒有看到代碼,但我懷疑還有其他一些因素在起作用。
我沒有顛倒其他單個變量中短和長的字節順序,這些變量基本上是構成 wav 文件的所有其他字段,例如 sampleRate、numOfChannels 等,但這似乎不會影響 wav 文件的播放。 這僅僅是因為媒體播放器不使用這些字段(因此我不能說我弄錯了)還是因為這些變量的字節順序無關緊要?
這些字段實際上非常重要,也必須是小端的,但是,正如我們所見,您也不需要交換它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.