我正在开发一个 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
接口(interface)的实现,可以在 here 找到。 .
关于c# - 有没有办法将 .mp4 格式音频转换为内存中的 .wav 格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57056115/