簡體   English   中英

流和循環MS ADPCM(WAVE_FORMAT_ADPCM)

[英]Stream and loop MS ADPCM (WAVE_FORMAT_ADPCM)

我正在嘗試使用XAudio2流式傳輸MS ADPCM文件(在C ++中,但是此問題似乎與語言無關)。

該文件使用ADPCMEncode.exe編碼,這將提供一個WAV文件,其格式標記為WAVE_FORMAT_ADPCM。

像任何流一樣,我創建一個IXAudio2SourceVoice(從文件的開頭開始是完整的ADPCMWAVEFORMAT),並在請求它們時將其以塊對齊的形式提供給緩沖區。 數據看起來運行良好,直到時間到了。

循環讀取器是您所期望的:如果發生短讀取,則將偏移量返回到起始位置,然后再進行一次讀取以填充緩沖區的其余部分。 適用於PCM,但適用於MS ADPCM,有時聲音會停止。 它似乎不再需要更多的緩沖區,因此用完並停止。

錯誤的時間會有所不同。 有時,它在數據循環后立即發生,有時在循環幾次后發生。 很顯然,我還需要通過XAUDIO2_BUFFER傳遞一些其他信息,但是我找不到任何文檔可以告訴我什么。

有人能指出我正確的方向嗎?

再次,對互聯網的尊嚴犧牲取得了成果。 ;)

我意識到我為ADPCM錯誤地使用了示例循環WAV段。 它仍然位於SAMPLES中而不是字節中,因此它需要轉換為字節(由於ADPCM大約有25%的壓縮率,而立體聲采樣為4字節,所以兩個值相似,這就是讓我> __ <愚弄的)。

通過塊對齊可輕松計算出每個塊的樣本:

unsigned int samplesPerBlock = m_format.nBlockAlign - 12;

unsigned int startBlock = sampleLoop.start / samplesPerBlock;
unsigned int startBlockOffset = sampleLoop.start % samplesPerBlock;

unsigned int endBlock = sampleLoop.end / samplesPerBlock;
unsigned int endBlockOffset = sampleLoop.end % samplesPerBlock;

unsigned int loopStart = startBlock * m_format.nBlockAlign;
unsigned int loopLength = (endBlock - startBlock) * m_format.nBlockAlign;

如果循環點未完全對齊,則可以使用XAUDIO2_BUFFER的Play / LoopBegin / Length成員進行一些額外的擺弄,但前提是您將它​​們正確地對齊在原始WAV中(就像您對其他ADPCM風格所做的那樣)您將不需要,提交的壓縮數據的塊對齊就足夠了。

暫無
暫無

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

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