배경 : MIME 유형이 audio/wav 인 데이터를 반환하는 서비스를 사용하고 있습니다. 이 오디오 (현재 MVC 응용 프로그램으로 구축)에 대한 재생 메커니즘을 제공해야합니다. 예를 들어, 엔드 포인트는 https://audio.fooservice.com/GetAudio?audioId=123
오디오는 8kHz, 1 채널 U-law입니다.
HTML5 <audio> 태그를 사용할 때 브라우저에서 다양한 형식 지원으로 인해 Internet Explorer에서 재생할 수 없으므로 원래 u-law wav를 사용할 수 없습니다.
내 제안 솔루션은 소스 형식에서 mp3로 실시간 변환하는 것입니다.
여기 및 NAudio 포럼의 다양한 다른 질문에서 부분적으로 작동하는 솔루션을 함께 모았지만 아래 의견에 명시된 것처럼 예외가 발생합니다.
private void NAudioTest(string url)
{
Stream outStream = new MemoryStream();
var format = WaveFormat.CreateMuLawFormat(8000, 1);
using (Stream ms = new MemoryStream())
{
var request = (HttpWebRequest)WebRequest.Create(url);
request.KeepAlive = false;
request.ProtocolVersion = HttpVersion.Version10;
using (Stream stream = request.GetResponse().GetResponseStream())
{
using (var reader = new RawSourceWaveStream(stream, format))
{
// reader is not seekable; we need to convert to a byte array to seek
var bytes = reader.ToByteArray();
// create a new stream from the byte aray
var seekableStream = new MemoryStream(bytes);
// instantiating a WaveFileReader as follows will throw an exception:
// "System.FormatException: Not a WAVE file - no RIFF header"
using (var waveReader = new WaveFileReader(seekableStream))
{
using (var pcmStream = WaveFormatConversionStream.CreatePcmStream(waveReader))
{
var pcmBytes = pcmStream.ToByteArray();
var mp3 = pcmBytes.ToMp3();
}
}
}
}
}
}
public static class StreamExtensions
{
public static byte[] ToByteArray(this Stream stream)
{
var ms = new MemoryStream();
var buffer = new byte[1024];
int bytes = 0;
while ((bytes = stream.Read(buffer, 0, buffer.Length)) > 0)
ms.Write(buffer, 0, bytes);
return ms.ToArray();
}
}
public static class ByteExtensions
{
public static byte[] ToMp3(this byte[] bytes)
{
using (var outStream = new MemoryStream())
{
using (var ms = new MemoryStream(bytes))
{
using (var reader = new WaveFileReader(ms))
{
using (var writer = new LameMP3FileWriter(outStream, reader.WaveFormat, 64))
{
reader.CopyTo(writer);
return outStream.ToArray();
}
}
}
}
}
}
나는 하루 종일 이것에 대해 주위를 파고 있었고 나는 그것이 매우 간단 해야하는 것처럼 불필요한 복잡성을 소개하는 것처럼 느낍니다.
도움을 주시면 감사하겠습니다.
참고 : 소스 형식을 변경할 수 없으며 IE 지원이 필요합니다.
편집 : RIFF 예외를 해결하고 MP3 스트림을 생성 할 수는 있지만 백색 잡음 일뿐입니다. 잘하면 나는 그것을 해결할 수 있기를 바랍니다. 내 새 코드는 다음과 같습니다.
[HttpGet]
public ActionResult GetMp3(string url)
{
if (String.IsNullOrWhiteSpace(url))
return null;
var muLawFormat = WaveFormat.CreateMuLawFormat(8000, 1);
var compressedStream = new MemoryStream();
using (var ms = new MemoryStream())
{
var request = (HttpWebRequest)WebRequest.Create(url);
request.KeepAlive = false;
request.ProtocolVersion = HttpVersion.Version10;
using (Stream webStream = request.GetResponse().GetResponseStream())
{
var buffer = new byte[4096];
int read;
while (webStream != null && (read = webStream.Read(buffer, 0, buffer.Length)) > 0)
ms.Write(buffer, 0, read);
}
ms.Position = 0;
using (WaveStream wav = WaveFormatConversionStream.CreatePcmStream(new RawSourceWaveStream(ms, muLawFormat)))
using (var mp3 = new LameMP3FileWriter(compressedStream, new WaveFormat(), LAMEPreset.MEDIUM_FAST))
wav.CopyTo(mp3);
}
compressedStream.Seek(0, 0);
return new FileStreamResult(compressedStream, "audio/mpeg");
}
-----------------------------------------------------------------------------------------------------------------------
답
-----------------------------------------------------------------------------------------------------------------------
이것은 나를 위해 작동합니다 (그리고 나는 당신이하고 싶은 것을 정확하게해야했습니다). 이것이 다른 누군가에게도 도움이되기를 바랍니다. LAME과 함께 NAudio를 사용했습니다.
libmp3lamexx.dll 파일을 웹 서버의 BIN 위치 또는 % PATH % 변수의 일부 폴더에 복사해야합니다. 그렇지 않으면 작동하지 않습니다.
string sq = /* URL of WAV file (http://foo.com/blah.wav) */
Response.ContentType = "audio/mpeg";
using (WebClient wc = new WebClient())
{
if (!sq.ToLower().EndsWith(".wav"))
{
byte[] rawFile = wc.DownloadData(sq.Trim());
Response.OutputStream.Write(rawFile, 0, rawFile.Length);
}
else
{
using (var wavReader = new WaveFileReader(new MemoryStream(wc.DownloadData(sq.Trim()))))
{
try
{
using (var wavWriter = new LameMP3FileWriter(Response.OutputStream, wavReader.WaveFormat, LAMEPreset.ABR_128))
{
wavReader.CopyTo(wavWriter);
}
}
catch (ArgumentException)
{
var newFormat = new WaveFormat(wavReader.WaveFormat.SampleRate, 16, 2);
using (var pcmStream = new WaveFormatConversionStream(newFormat, wavReader))
{
using (var wavWriter = new LameMP3FileWriter(Response.OutputStream, pcmStream.WaveFormat, LAMEPreset.ABR_128))
{
pcmStream.CopyTo(wavWriter);
}
}
}
}
}
Response.Flush();
Response.End();
}
이 질문에 대해 Stack Overflow에서 비슷한 토론을 찾았습니다: https://stackoverflow.com/questions/24210306/
'개발언어 > NAudio' 카테고리의 다른 글
[C#] 리소스에 있는 mp3 재생하기 중복재생하기 (0) | 2021.07.09 |
---|---|
[Digital Audio] 4. Audio Signal Chains (0) | 2021.07.08 |
[Digital Audio] 3. Audio Effect (0) | 2021.07.08 |
[Digital Audio] 2. Audio File Format (0) | 2021.07.08 |
[Digital Audio] 1. Audio Sampling (0) | 2021.07.08 |