我正在开发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
文件的任何建议,都将是有帮助的。
答案 0 :(得分:1)
您可以使用NAudio转换任何音频格式
查看示例:How to convert a MP3 file to WAV with NAudio in WinForms C# 使用几种方法,例如 MediaFoundationReader
答案 1 :(得分:0)
最后,我找到了一种转换为.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
接口的实现,可以在here处找到。