acmStreamConvert - 目标缓冲区始终为空

时间:2014-08-20 12:51:04

标签: c# audio naudio pcm adpcm

我有一个编码的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));

P.S。如果它有任何区别,我实际上也用SampleProvider封装了流。

当我尝试播放该文件时,在acmStreamConvert中,目标缓冲区始终为空,因此没有缓冲区填充到waveOut缓冲区。

我在所有acm函数中都没有错误包括转换函数所以我理解格式(源和建议)是正确的,为什么从acmConvert返回缓冲区 - 空?

修改

我添加了一些可能有帮助的信息..

我尝试播放的adpcm文件是我使用以下步骤创建的文件:

  1. 我有一个原始pcm文件(没有wav标头)采样率= 9600,每个样本的比特数= 16,通道=单声道
  2. 我从原始
  3. 创建一个wav文件
  4. 我读了这个wav文件并将其转换为adpcm文件采样率= 9600,每个样本的比特数= 4,channels = mono
  5. 我阅读了已编码的adpcm文件并尝试播放但未成功
  6. 使用NAudio完成的所有步骤。

    我检查了所有输出文件(raw,wav,adpcm)的信号,信号看起来正确。使用Audacity完成检查。

    我还尝试用WaveFileReader读取adpcm,但是在WavFormatConversionStream的read方法中读取' count'始终为零(因为块对齐检查)。

    原始采样率是9600是否会出问题?

    还有一件事,我刚看到WaveFileWriter无法创建每个样本位= 4的文件,因此我的编码文件实际上是每个样本创建16位而不是4位。

1 个答案:

答案 0 :(得分:0)

该文件很可能是由第三方打包程序压缩的。如果您要解码游戏音频,请尝试在启动过程中深入研究游戏转储。