【问题标题】:Getting nAudio WAV to MP3 muLaw error during conversion在转换过程中将 nAudio WAV 转换为 MP3 muLaw 错误
【发布时间】:2015-08-19 15:48:27
【问题描述】:

我正在通过网络服务获取一个 WAV 文件(成功),并且能够在我的 Windows 7 机器上播放它。现在我需要获取相同的 WAV 文件并将其转换为 MP3 文件。这是失败的。我尝试将文件作为 WAV(上图)检索,然后使用 --

WaveStream PCMStream = WaveFormatConversionStream.CreatePcmStream(reader);

将此 muLaw 转换为 PCM。

这是失败的附加错误。我曾尝试使用 LameMP3FileWriter 直接进行转换,但这也无法告诉我“muLaw 格式无法转换为 MP3。

我错过了什么? 编码器片段

 private void WriteMP3(string iNum, string CallId)
    {
        //construct the replay URL using the iNum
        string url = "http://" + _VerintServer + "/searchapi?command=replay&id=" + iNum;

        // name the new mp3 file
        string mp3File =_basePath + "mp3\\" + CallId + ".mp3";
        string tempWav = _basePath + "mp3\\" + CallId + ".wav";
        string tempPCM = _basePath + "mp3\\" + CallId + "_PCM.wav";

        //issue the web service request
        HttpWebRequest request = (HttpWebRequest)System.Net.WebRequest.Create(url);

        //retrieve the content type as raw PCM (.wav)
        request.ContentType = "audio/wav";

        //encode and include the basic authentication credentials
        string encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(_username + ":" + _password));
        request.Headers.Add("Authorization", "Basic " + encoded);

        //retrieve the response
        HttpWebResponse response = (System.Net.HttpWebResponse)request.GetResponse();

        //copy the stream of bytes to the local directory using the CallId as the file name
        if (request.HaveResponse)
        {
            //create a temporary wav file 
            using (var receiveStream = response.GetResponseStream())
            {
                using (var PStream = new FileStream(tempWav, FileMode.Create,FileAccess.Write))
                {
                    receiveStream.CopyTo(PStream);
                }
            }

            WaveToPCM(tempWav, tempPCM);
            WaveToMP3(tempPCM, mp3File, 128);
        }
        return;
    }

    //Convert muLaw WAV to PCM
    private void WaveToPCM(string waveFileName, string pcmFileName)
    {
        using (var reader = new CueWaveFileReader(waveFileName))
        {
            WaveStream PCMStream = WaveFormatConversionStream.CreatePcmStream(reader);
            using (var PStream = new FileStream(pcmFileName, FileMode.Create, FileAccess.Write))
            {
               PCMStream.CopyTo(PStream);
            }            
        }           
        return;
    }

    // Convert WAV to MP3 using libmp3lame library
    public void WaveToMP3(string waveFileName, string mp3FileName, int bitRate = 128)
    {
        using (var reader = new WaveFileReader(waveFileName))
        using (var writer = new LameMP3FileWriter(mp3FileName, reader.WaveFormat, bitRate))
            reader.CopyTo(writer);
    }

堆栈跟踪:

{"$id":"1","Message":"发生错误。","ExceptionMessage":"不是 WAVE 文件 - 没有 RIFF 头","ExceptionType":"System.FormatException", "StackTrace":" 在 NAudio.FileFormats.Wav.WaveFileChunkReader.ReadRiffHeader(BinaryReader br)\r\n 在 NAudio.FileFormats.Wav.WaveFileChunkReader.ReadWaveHeader(Stream 流)\r\n 在 NAudio.Wave.WaveFileReader..ctor (流 inputStream)\r\n 在 NAudio.Wave.WaveFileReader..ctor(String waveFile)\r\n 在 DataServices.Controllers.RecordingsController.WaveToMP3(String waveFileName, String mp3FileName, Int32 bitRate) in c:\Codebank\DataAccess \DataServices\Controllers\RecordingsController.cs:第 179 行\r\n 在 DataServices.Controllers.RecordingsController.WriteMP3(String iNum,

【问题讨论】:

  • 编辑:代码 sn-p 有错字。 “CueWaveFileReader”实际上是“WaveFileReader”,但同样的“不是 WAVE 文件错误...”被抛出。
  • 编辑:当我绕过 WAV 到 PCM 转换器时,我收到以下错误:
  • {"$id":"1","Message":"发生错误。","ExceptionMessage":"不支持的编码格式 MuLaw\r\n参数名称: 格式","ExceptionType ":"System.ArgumentException","StackTrace":" at NAudio.Lame.LameMP3FileWriter..ctor(Stream outStream, WaveFormat format, Int32 bitRate)\r\n at NAudio.Lame.LameMP3FileWriter..ctor(String outFileName, WaveFormat格式,Int32 bitRate)\r\n 在 DataServices.Controllers.RecordingsController.WaveToMP3(String waveFileName, String mp3FileName, Int32 bitRate) in c:\\Codebank\\DataAccess\\DataServices\\Controllers\\RecordingsController.cs:line 179 \r\n 在

标签: naudio


【解决方案1】:

在您的WaveToPcm 函数中,您只是将原始样本写入文件。您需要使用WaveFileWriter.CreateWaveFile 传入PCMStream 来制作可以传递给LAME MP3 Writer 的16 位PCM WAV 文件

【讨论】:

  • 这是正确的吗?我很担心您关于“Waveprovider 必须返回 0...”的警告
【解决方案2】:

谢谢马克。我现在成功地将 muLaw 编码的 WAV 文件转换为原始 PCM,如下面的代码所示。

        //Convert muLaw WAV to PCM
    private void WaveToPCM(string waveFileName, string pcmFileName)
    {
        using (var reader = new WaveFileReader(waveFileName))
        {

           WaveStream PCMStream = WaveFormatConversionStream.CreatePcmStream(reader);
            WaveFileWriter.CreateWaveFile(pcmFileName, PCMStream);        
        }           
        return;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-22
    • 2017-08-23
    • 2019-03-11
    • 2017-07-06
    • 2013-01-17
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多