nAudio WAV到MP3 muLaw错误

时间:2015-08-19 15:48:27

标签: naudio

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

WaveStream PCMStream = WaveFormatConversionStream.CreatePcmStream(reader);

将此muLaw转换为PCM。

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

我错过了什么? 编码器             private void WriteMP3(string iNum,string CallId)         {             //使用iNum构建重播URL             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","消息":"发生错误。"," ExceptionMessage&#34 ;:"不是WAVE文件 - 没有RIFF标题"," ExceptionType":" System.FormatException"," StackTrace":&#34 ; at NAudio.FileFormats.Wav.WaveFileChunkReader.ReadRiffHeader(BinaryReader br)\ r \ n at NAudio.FileFormats.Wav.WaveFileChunkReader.ReadWaveHeader(Stream stream)\ r \ n at NAudio.Wave.WaveFileReader..ctor(Stream inputStream)\ r \ n at NAudio.Wave.WaveFileReader..ctor(String waveFile)\ r \ n at 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,

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

谢谢马克。我现在成功地将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;
    }