【发布时间】: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