簡體   English   中英

有沒有辦法將 .mp4 格式的音頻僅在內存中轉換為 .wav 格式?

[英]Is there any way to convert .mp4 format audio to .wav format just in memory?

我正在開發一個 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文件,任何建議都會有所幫助?

您可以使用 NAudio 轉換任何音頻格式

請參閱以下示例: 如何在 WinForms C# 中使用MediaFoundationReader等多種方法使用 NAudio 將 MP3 文件轉換為 WAV

最后我找到了一個可以轉換為.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接口的一個實現,可以在這里找到。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM