Как преобразовать WAV-файл в mp3 в памяти?
У меня есть приложение, написанное с использованием C# на вершине Asp.Net MVC 5 Framework.
Моя цель - позвонить в сторонний сервис, чтобы загрузить волновой файл. Затем я хочу конвертировать этот файл в mp3. Наконец, я хочу вернуть mp3-файл как (byte[]), чтобы позволить пользователю загружать его прямо из памяти.
Вот как закончится мой код, который позволит пользователю загружать преобразованный файл из памяти
public ActionResult Download(int? id)
{
// Download and convert the file
// the variable "someUri" is generated based on the provided id value
byte[] filedata = ConvertToMp3(someUri);
var cd = new System.Net.Mime.ContentDisposition
{
FileName = "filename.mp3",
Inline = true,
};
Response.AppendHeader("Content-Disposition", cd.ToString());
return File(filedata, "audio/mpeg");
}
Но у меня проблема с ConvertToMp3
метод.
Я использую библиотеку NAudio для преобразования файлов преобразования. Вот мой код до сих пор
public void ConvertToMp3(Uri uri)
{
using (var client = new WebClient())
{
byte[] file = client.DownloadData(uri);
string wavFileFullName = GetFullDirectory() + "filename.wav";
string mp3FileFullName = GetFullDirectory() + "filename.mp3";
WaveFormat target = new WaveFormat(8000, 16, 1);
using (WaveStream stream = new WaveFileReader(new MemoryStream(file)))
using (WaveFormatConversionStream str = new WaveFormatConversionStream(target, stream))
{
WaveFileWriter.CreateWaveFile(wavFileFullName, str);
using (var reader = new WaveFileReader(wavFileFullName))
using (var writer = new LameMP3FileWriter(mp3FileFullName, reader.WaveFormat, bitRate))
{
reader.CopyTo(writer);
}
}
File.Delete(wavFileFullName);
}
}
Вышеуказанный метод преобразует файл. Но этот метод записывает волновой файл на рабочий стол, преобразует его в mp3 и затем удаляет волновой файл. Кроме того, этот метод записывает mp3-файл на стол вместо возврата byte[]
содержание.
Как я могу преобразовать файл в память без необходимости записи на стол? Кроме того, как я могу конвертировать mp3 файл в byte[]
?
1 ответ
Может быть как то так
Примечание: полностью не проверено, я просто посмотрел на источник.
Синхронизация
public byte[] ConvertToMp3(Uri uri)
{
using (var client = new WebClient())
{
var file = client.DownloadData(uri);
var target = new WaveFormat(8000, 16, 1);
using (var outPutStream = new MemoryStream())
using (var waveStream = new WaveFileReader(new MemoryStream(file)))
using (var conversionStream = new WaveFormatConversionStream(target, waveStream))
using (var writer = new LameMP3FileWriter(outPutStream, conversionStream.WaveFormat, 32, null))
{
conversionStream.CopyTo(writer);
return outPutStream.ToArray();
}
}
}
асинхронный
public async Task<byte[]> ConvertToMp3Async(Uri uri)
{
using (var client = new WebClient())
{
var file = await client.DownloadDataTaskAsync(uri);
var target = new WaveFormat(8000, 16, 1);
using (var outPutStream = new MemoryStream())
using (var waveStream = new WaveFileReader(new MemoryStream(file)))
using (var conversionStream = new WaveFormatConversionStream(target, waveStream))
using (var writer = new LameMP3FileWriter(outPutStream, conversionStream.WaveFormat, 32, null))
{
await conversionStream.CopyToAsync(writer);
return outPutStream.ToArray();
}
}
}