c# - acmStreamConvert - 目标缓冲区始终为空

标签 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));

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

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

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

编辑

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

我尝试播放的 adpcm 文件是我通过以下步骤创建的文件:
  • 我有一个原始 pcm 文件(没有 wav 头)采样率 = 9600,每个采样的位数 = 16, channel = 单声道
  • 我从原始
  • 创建一个 wav 文件
  • 我读了这个 wav 文件并将其转换为 adpcm 文件采样率 = 9600,每个样本的位数 = 4, channel = 单声道
  • 我读取了编码的 adpcm 文件并尝试播放但没有成功

  • 使用 NAudio 完成的所有步骤。

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

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

    原始采样率为 9600 会不会有问题?

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

    最佳答案

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

    关于c# - acmStreamConvert - 目标缓冲区始终为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25405226/

    相关文章:

    c# - 带有 F# 的 Service Fabric 不工作

    video - 在软件中解码曼彻斯特双相标记(代表 SMPTE 时间码音频流)

    uwp - 在 UWP 中玩 OGG 的可能性

    c# - '' Unable to load DLL ' mfplat.dll' : The specified module could not be found.(HRESULT 异常:0x8007007E)”

    c# - Linq 选择某些属性到另一个对象?

    c# - 是否有用于在 C# 应用程序中查找未引用函数(死的、过时的代码)的工具?

    c# - C#/XNA在不同游戏状态下停止播放歌曲

    c# - 如何将声音的音量从听不见(0db)增加到响亮(60db)

    c# - 自定义 FTP 客户端 PASV 数据连接被拒绝

    java - 如何在 Java Sound API 中重新启动播放音频?