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

标签 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 文件,任何建议都会有所帮助?

最佳答案

最后我找到了一个可以转换为.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/

相关文章:

c# - 如何将 'System.Windows.Media.Imaging.BitmapImage' 转换为 'System.Drawing.Image' ?

wpf - 首次加载时的验证绑定(bind)

c++ - C::PlaySound循环开始端的循环声音

c# - SendMessage 到窗口句柄

javascript - 如何从 JQuery Dialog 调用 C# 按钮事件

c# - 如何在 C# 中手动构建 SOAP 信封?

android - 一次播放两个媒体播放器

c# - 在 C# 中使用 bool 字段映射的 Tinyint

c# - MVC 通过 C#/WPF : how to notify view?

ios - AVPlayer 未使用 Swift3 播放文档目录中的音频