有没有办法在内存中将.mp4格式的音频转换为.wav格式?



我正在开发一个WPF应用程序,我必须在其中播放音频。我以.mp4格式(字节数组)接收音频数据,唯一的限制是我无法将其写出到硬盘。

我找到了几种播放.mp4格式的解决方案,例如使用WMPLib.WindowsMediaPlayer,但我无法提供字节数组或流到此库来播放音频。它只接受文件路径。

然后我找到了System.Media.SoundPlayer,它可以播放流中的音频,但只是.wav格式。我开始寻找从mp4转换为wav的解决方案。我找到了NAudio库,我可以通过以下方式进行转换:

using (var data = new MediaFoundationReader(filePath)) {
var stream = new MemoryStream();
WaveFileWriter.WriteWavFileToStream(stream, data);
}

这样做的问题是我只能使用文件路径参数实例化MediaFoundationReader。我没有找到任何不使用文件的方法来创建它。我认为这也是一个死胡同。

因此,任何建议都会有助于如何转换内存中的音频,或者如何直接从字节数组或流中播放.mp4文件?

最后,我找到了一个可以转换为.mp3格式的解决方案,但它也可以转换为.wav。我可以通过以下方式使用 uwp 转码 API:

public static async void ConvertMp4ToMp3(byte[] mp4Data, Action<Stream> doneCallback) {
MediaEncodingProfile profile = MediaEncodingProfile.CreateMp3(AudioEncodingQuality.High);
var inputStream = new MemoryRandomAccessStream(mp4Data);
var outputStream = new InMemoryRandomAccessStream();
MediaTranscoder transcoder = new MediaTranscoder();
PrepareTranscodeResult prepareOperation = await transcoder.PrepareStreamTranscodeAsync(inputStream, outputStream, profile);
if (prepareOperation.CanTranscode) {
//start to convert
var transcodeOperation = prepareOperation.TranscodeAsync();
//registers completed event handler 
transcodeOperation.Completed += (IAsyncActionWithProgress<double> asyncInfo, AsyncStatus status) => {
asyncInfo.GetResults();
var stream = outputStream.AsStream();
stream.Position = 0;
doneCallback(stream);
};
} else {
doneCallback(null);
}
}

进口:

using System;
using System.IO;
using Windows.Foundation;
using Windows.Media.MediaProperties;
using Windows.Media.Transcoding;
using Windows.Storage.Streams;

MemoryRandomAccessStream只是IRandomAccesStream接口的实现,可以在这里找到。

您可以使用NAudio转换任何音频格式

请参阅示例:如何在 WinForms C# 中使用 NAudio 将 MP3 文件转换为 WAV 使用多种方法,如MediaFoundationReader

相关内容

最新更新