[英]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.