日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NAudio 播放流、字节数组(非wav、mp3、aiff格式)

發(fā)布時(shí)間:2024/3/26 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NAudio 播放流、字节数组(非wav、mp3、aiff格式) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

NAudio 播放流、字節(jié)數(shù)組(非wav、mp3、aiff格式)

1. 問題

http或websocket通信返回的音頻數(shù)據(jù)流,導(dǎo)出到音頻文件,然后再用AudioFileReader讀取文件流,可以播放比較多格式的音頻(例如:webm)。但是如果不創(chuàng)建臨時(shí)文件,改如何直接播放流MemoryStream?

2. 舉例

  • 1、返回的音頻流是webm時(shí),臨時(shí)文件法可以正常播放,猜測(cè)可以分析讀取文件流的方式,取消掉多余的步驟;
var filename = "./tmp.webm"; using (var audioFile = new AudioFileReader(filename))using (var waveOut = new WaveOutEvent()){waveOut.Init(audioFile);waveOut.Play();while (waveOut.PlaybackState == PlaybackState.Playing)Thread.Sleep(100);}
  • 2、查看AudioFileReader構(gòu)造函數(shù),其中CreateReaderStream方法是成功播放wav、mp3、aiff這3類音頻的關(guān)鍵,所以需要找到能MediaFoundationReader相關(guān)聯(lián)的類;
// 摘要: // Creates the reader stream, supporting all filetypes in the core NAudio library, // and ensuring we are in PCM format // // 參數(shù): // fileName: // File Name private void CreateReaderStream(string fileName) {if (fileName.EndsWith(".wav", StringComparison.OrdinalIgnoreCase)){readerStream = new WaveFileReader(fileName);if (readerStream.WaveFormat.Encoding != WaveFormatEncoding.Pcm && readerStream.WaveFormat.Encoding != WaveFormatEncoding.IeeeFloat){readerStream = WaveFormatConversionStream.CreatePcmStream(readerStream);readerStream = new BlockAlignReductionStream(readerStream);}}else if (fileName.EndsWith(".mp3", StringComparison.OrdinalIgnoreCase)){if (Environment.OSVersion.Version.Major < 6){readerStream = new Mp3FileReader(fileName);}else{readerStream = new MediaFoundationReader(fileName);}}else if (fileName.EndsWith(".aiff", StringComparison.OrdinalIgnoreCase) || fileName.EndsWith(".aif", StringComparison.OrdinalIgnoreCase)){readerStream = new AiffFileReader(fileName);}else{// 一切其他格式音頻IO流讀取方式readerStream = new MediaFoundationReader(fileName);} }
  • 3、借助vs代碼智能提示,找到了MediaFoundationReader的子類StreamMediaFoundationReader
public class StreamMediaFoundationReader : MediaFoundationReader {private readonly Stream stream;public StreamMediaFoundationReader(Stream stream, MediaFoundationReaderSettings settings = null){this.stream = stream;Init(settings);}// 省略 }

3. 代碼修改

byte[] buffer; using (var ms = new MemoryStream(buffer))using (var media = new StreamMediaFoundationReader(ms))using (var waveOut = new WaveOutEvent()){waveOut.Init(media);waveOut.Play();while (waveOut.PlaybackState == PlaybackState.Playing)Thread.Sleep(100);}

總結(jié)

以上是生活随笔為你收集整理的NAudio 播放流、字节数组(非wav、mp3、aiff格式)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。