簡體   English   中英

acmStreamConvert - 目標緩沖區始終為空

[英]acmStreamConvert - destination buffer is always empty

我有一個編碼的 adpcm 文件(采樣率為 9600,位深度為 4),我想用 NAudio 播放它。

我使用 RawSourceWaveStream 讀取文件,然后執行以下操作:

var reader = new RawSourceWaveStream(new MemoryStream(File.ReadAllBytes(path)), new AdpcmWaveFormat(9600,1));
var convert = WaveFormatConversionStream.CreatePcmStream(reader);
waveOut.Init(new BlockAlignReductionStream(convert));

PS 如果它有什么不同,我實際上也用 SampleProvider 包圍了流。

當我嘗試播放文件時,在 acmStreamConvert 中,目標緩沖區始終為空,因此沒有緩沖區填充到 waveOut 緩沖區。

我在所有 acm 函數中都沒有錯誤,包括轉換函數,所以我知道格式(來源和建議)是正確的,那么為什么從 acmConvert 返回的緩沖區是空的?

編輯

我添加了一些可能會有所幫助的信息。

我嘗試播放的那個 adpcm 文件是我通過以下步驟創建的文件:

  1. 我有一個原始 pcm 文件(沒有 wav 標頭)采樣率 = 9600,每個樣本的位數 = 16,通道 = 單聲道
  2. 我從原始文件創建了一個 wav 文件
  3. 我閱讀了這個 wav 文件並將其轉換為 adpcm 文件采樣率 = 9600,每個樣本的位數 = 4,通道 = 單聲道
  4. 我閱讀了編碼的 adpcm 文件並嘗試播放它但沒有成功

所有步驟都是用 NAudio 完成的。

我檢查了所有輸出文件(raw、wav、adpcm)的信號,信號看起來是正確的。 通過 Audacity 完成的檢查。

我還嘗試使用 WaveFileReader 讀取 adpcm 但隨后在 WavFormatConversionStream 的讀取方法中,“計數”始終為零(因為塊對齊檢查)。

原始采樣率為 9600 會出問題嗎?

還有一件事,我剛剛看到 WaveFileWriter 無法創建每個樣本位 = 4 的文件,所以我的編碼文件實際上是用每個樣本 16 位而不是 4 位創建的。

該文件很可能是由第三方打包程序壓縮的。 如果您正在嘗試解碼游戲音頻,請嘗試在啟動期間挖掘游戲的轉儲。

暫無
暫無

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

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