【问题标题】:acmStreamConvert - destination buffer is always emptyacmStreamConvert - 目标缓冲区始终为空
【发布时间】:2014-08-20 12:51:03
【问题描述】:

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

附:如果有什么不同,我实际上也用 SampleProvider 封装了流。

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

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

编辑

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

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

  1. 我有一个原始 pcm 文件(没有 wav 标头)采样率 = 9600,每个采样的位数 = 16,通道 = 单声道
  2. 我从原始文件创建了一个 wav 文件
  3. 我读取了这个 wav 文件并将其转换为 adpcm 文件 sample rate=9600, bits per sample=4, channels=mono
  4. 我读取了编码的 adpcm 文件并尝试播放,但没有成功

使用 NAudio 完成所有步骤。

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

我也尝试使用 WaveFileReader 读取 adpcm,但在 WavFormatConversionStream 的读取方法中,“计数”始终为零(因为块对齐检查)。

原始采样率为 9600 会出问题吗?

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

【问题讨论】:

  • 9600 是一个非常不寻常的采样率。你确定它是正确的?
  • @MarkHeath mark 你能看看我的帖子编辑吗?

标签: c# audio naudio pcm adpcm


【解决方案1】:

文件很可能是由第三方打包程序压缩的。如果您尝试解码游戏音频,请尝试在启动期间挖掘游戏的转储。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-27
    • 2020-11-27
    • 1970-01-01
    • 2017-11-11
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多