1

我正在开发一个 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从字节数组或流中播放文件的建议都会有所帮助?

4

2 回答 2

1

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

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

于 2019-07-16T22:21:33.347 回答
0

Finally I found a solution which converts to an .mp3 format, but it can also convert to .wav. I could use the uwp transcode API the following way:

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);
    }
}

The imports:

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

And the MemoryRandomAccessStream is just an implementation of the IRandomAccesStream interface and can be found here.

于 2019-07-29T10:23:45.877 回答