簡體   English   中英

wav 文件中的字節序

[英]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);
}

我的問題是:

  1. 在 soundData 向量中,為什么短褲向量的字節序很重要,而浮點數向量不重要? 在我的代碼中,我顛倒了短褲的字節順序,但沒有顛倒浮點數。

  2. 最初我試圖在不顛倒字節順序的情況下編寫短褲。 當我編寫文件時,它最終只有它應該大小的一半(即丟失了一半的音頻數據,但那里的一半聽起來是正確的),為什么會這樣?

  3. 我沒有顛倒其他單個變量中短和長的字節順序,這些變量基本上是構成 wav 文件的所有其他字段,例如 sampleRate、numOfChannels 等,但這似乎不會影響 wav 文件的播放。 這僅僅是因為媒體播放器不使用這些字段(因此我不能說我弄錯了)還是因為這些變量的字節順序無關緊要?

在 soundData 向量中,為什么短褲向量的字節序很重要,而浮點數向量不重要? 在我的代碼中,我顛倒了短褲的字節順序,但沒有顛倒浮點數。

實際上,如果您仔細查看您的代碼,您會發現您根本沒有反轉短褲的字節序。 在 Intel CPU(或任何其他低端 CPU)上,您也不需要這樣做。

最初我試圖在不顛倒字節順序的情況下編寫短褲。 當我編寫文件時,它最終只有它應該大小的一半(即丟失了一半的音頻數據,但那里的一半聽起來是正確的),為什么會這樣?

我不知道沒有看到代碼,但我懷疑還有其他一些因素在起作用。

我沒有顛倒其他單個變量中短和長的字節順序,這些變量基本上是構成 wav 文件的所有其他字段,例如 sampleRate、numOfChannels 等,但這似乎不會影響 wav 文件的播放。 這僅僅是因為媒體播放器不使用這些字段(因此我不能說我弄錯了)還是因為這些變量的字節順序無關緊要?

這些字段實際上非常重要,也必須是小端的,但是,正如我們所見,您也不需要交換它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM