【问题标题】:Using NAudio to decode mu-law audio使用 NAudio 解码 mu-law 音频
【发布时间】:2010-11-20 19:51:23
【问题描述】:

我正在尝试使用 NAudio 将 mu-law 编码的音频解码为 pcm 音频。我的服务发布了原始 mu-law 编码的音频字节,我从 NAudio 收到一个错误,即数据没有 RIFF 标头。我需要以某种方式添加它吗?我使用的代码是:

WaveFileReader reader = new WaveFileReader(tmpMemStream);
using (WaveStream convertedStream = WaveFormatConversionStream.CreatePcmStream(reader))
{
    WaveFileWriter.CreateWaveFile(recordingsPath + "/" + outputFileName, convertedStream);
}

我还将原始数据保存到磁盘并在 Matlab 中进行解码,这没有问题。谢谢。

【问题讨论】:

    标签: c# .net audio naudio


    【解决方案1】:

    由于您只有原始的 mu-law 数据,因此您不能在其上使用 WaveFileReader。相反,创建一个继承自 WaveStream 的新类。

    在其Read 方法中,从 tmpMemStream 返回数据。作为 WaveFormat 返回一个 mu-law WaveFormat。

    这是一个您可以使用的通用帮助器类:

    public class RawSourceWaveStream : WaveStream
    {
        private Stream sourceStream;
        private WaveFormat waveFormat;
    
        public RawSourceWaveStream(Stream sourceStream, WaveFormat waveFormat)
        {
            this.sourceStream = sourceStream;
            this.waveFormat = waveFormat;
        }
    
        public override WaveFormat WaveFormat
        {
            get { return this.waveFormat; }
        }
    
        public override long Length
        {
            get { return this.sourceStream.Length; }
        }
    
        public override long Position
        {
            get
            {
                return this.sourceStream.Position;
            }
            set
            {
                this.sourceStream.Position = value;
            }
        }
    
        public override int Read(byte[] buffer, int offset, int count)
        {
            return sourceStream.Read(buffer, offset, count);
        }
    }
    

    现在您可以像以前一样继续创建转换后的文件,将 RawSourceWaveStream 作为您的输入传递:

    var waveFormat = WaveFormat.CreateMuLawFormat(8000, 1);
    var reader = new RawSourceWaveStream(tmpMemStream, waveFormat);
    using (WaveStream convertedStream = WaveFormatConversionStream.CreatePcmStream(reader))
    {
        WaveFileWriter.CreateWaveFile(recordingsPath + "/" + outputFileName, convertedStream);
    }
    

    【讨论】:

    • 如果我的 tmpMemStream 是一个文件怎么办?
    猜你喜欢
    • 1970-01-01
    • 2012-06-04
    • 2019-07-19
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多