有什么方法可以仅在内存中将.mp4格式的音频转换为.wav格式吗?

时间:2019-07-16 11:22:07

标签: c# wpf audio audio-converter

我正在开发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文件的任何建议,都将是有帮助的。

2 个答案:

答案 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处找到。