最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#播放short或者byte類型的音頻

 更新時間:2024年12月23日 15:25:04   作者:rbigbearr  
這篇文章主要為大家詳細介紹了如何使用C#實現(xiàn)播放short或者byte類型的音頻,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下

一、通過Nuget安裝NAudio包

開發(fā)工具:vs2019

點擊Visual Studio 2019的工具->NuGet包管理器-》管理解決方案的NuGet的程序包-》瀏覽-》在搜索框中輸入NAudio-》點擊安裝

二、獲取short類型或者byte類型的音頻數(shù)據(jù)

我的數(shù)據(jù)是一組short類型的正弦波信號,存儲在txt中,如下圖所示:

通過C#讀取文檔并存儲在short數(shù)組中

string filePath = "20500Left.txt"; // txt文件路徑
short[] audioData = new short[48000 * 2]; //雙聲道數(shù)據(jù) 
int index = 0;
// 讀取txt文檔并按逗號分割文本
using (StreamReader reader = new StreamReader(filePath))
{
    string line;
    while ((line = reader.ReadLine()) != null)
    {
        string[] parts = line.Split(',');
        foreach (string part in parts)
        {
            //Console.WriteLine(part);
            audioData[index] = Convert.ToInt16(part);
            index++;
        }
    }
              
}

將short變?yōu)閎yte類型的數(shù)據(jù)(如果本身你的音頻數(shù)據(jù)就是byte類型就不需要執(zhí)行下邊操作)

// 將short[]音頻數(shù)據(jù)轉(zhuǎn)換為byte[]數(shù)據(jù)
byte[] byteData = new byte[audioData.Length * 2]; // short類型占2個字節(jié)
Buffer.BlockCopy(audioData, 0, byteData, 0, byteData.Length);

三、循環(huán)播放自己的音頻數(shù)據(jù),重寫WaveStream類

主要是重寫了Read這個函數(shù),讀到數(shù)據(jù)流末尾,就從開頭讀取。

 class LoopingWaveStream : WaveStream
    {
        private WaveStream sourceStream;
 
        public LoopingWaveStream(WaveStream sourceStream)
        {
            this.sourceStream = sourceStream;
        }
 
        public override WaveFormat WaveFormat => sourceStream.WaveFormat;
 
        public override long Length => sourceStream.Length;
 
        public override long Position
        {
            get => sourceStream.Position;
            set => sourceStream.Position = value;
        }
 
        public override int Read(byte[] buffer, int offset, int count)
        {
            int bytesRead = 0;
 
            while (bytesRead < count)
            {
                int read = sourceStream.Read(buffer, offset + bytesRead, count - bytesRead);
                if (read == 0)
                {
                    // 如果讀取到末尾,重新從頭開始讀取
                    sourceStream.Position = 0;
                }
                bytesRead += read;
            }
 
            return bytesRead;
        }
    }

將上邊的byte類型的數(shù)據(jù)轉(zhuǎn)換為Stream類型,并填入WaveOut對象中,進行播放

 // 創(chuàng)建內(nèi)存流
            using (MemoryStream stream = new MemoryStream(byteData))
            {
                // 從內(nèi)存流中創(chuàng)建RawSourceWaveStream   //采樣率設(shè)置為48000,位深設(shè)置位16位,通道為雙聲道
                RawSourceWaveStream rawStream = new RawSourceWaveStream(stream, new WaveFormat(48000, 16, 2));
                LoopingWaveStream loopingWaveStream=new LoopingWaveStream(rawStream); 
                // 使用WaveOutEvent播放音頻數(shù)據(jù)
                WaveOut waveOut = new WaveOut();
                waveOut.Init(loopingWaveStream);//想要循環(huán)播放
                //waveOut.Init(rawStream);      //不想要循環(huán)播放
                waveOut.Play();
 
                //下邊兩種方式的循環(huán)播放會有爆音,不采用。
                //waveOut.PlaybackStopped += (sender, e) =>
                //   {
                //       if (waveOut.PlaybackState == PlaybackState.Stopped)
                //       {
                //           rawStream.Position = 0;
                //           waveOut.Play();
                //       }
                //   };
                //while (waveOut.PlaybackState == PlaybackState.Playing)
                //{
                //    if (rawStream.Position >= rawStream.Length)
                //    {
                //        rawStream.Position = 0;
                //        //Console.WriteLine("Audio stream reached the end.");
                //        //break;
                //    }                    
                //}
 
                Console.WriteLine("Press Enter to stop playback.");
                Console.ReadLine();   //阻塞線程
 
                waveOut.Stop();  //停止播放
                waveOut.Dispose();
            }

四、完整代碼

using NAudio.Wave;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Media;
using System.Text;
using System.Threading.Tasks;
 
namespace 播放short
{
    class LoopingWaveStream : WaveStream
    {
        private WaveStream sourceStream;
 
        public LoopingWaveStream(WaveStream sourceStream)
        {
            this.sourceStream = sourceStream;
        }
 
        public override WaveFormat WaveFormat => sourceStream.WaveFormat;
 
        public override long Length => sourceStream.Length;
 
        public override long Position
        {
            get => sourceStream.Position;
            set => sourceStream.Position = value;
        }
 
        public override int Read(byte[] buffer, int offset, int count)
        {
            int bytesRead = 0;
 
            while (bytesRead < count)
            {
                int read = sourceStream.Read(buffer, offset + bytesRead, count - bytesRead);
                if (read == 0)
                {
                    // 如果讀取到末尾,重新從頭開始讀取
                    sourceStream.Position = 0;
                }
                bytesRead += read;
            }
 
            return bytesRead;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("開始");
 
            string filePath = "20500Left.txt"; // txt文件路徑
            short[] audioData = new short[48000 * 2]; //雙聲道數(shù)據(jù) 
            int index = 0;
            // 讀取txt文檔并按逗號分割文本
            using (StreamReader reader = new StreamReader(filePath))
            {
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    string[] parts = line.Split(',');
                    foreach (string part in parts)
                    {
                        //Console.WriteLine(part);
                        audioData[index] = Convert.ToInt16(part);
                        index++;
                    }
                }
              
            }
            // 將short[]音頻數(shù)據(jù)轉(zhuǎn)換為byte[]數(shù)據(jù)
            byte[] byteData = new byte[audioData.Length * 2]; // short類型占2個字節(jié)
            Buffer.BlockCopy(audioData, 0, byteData, 0, byteData.Length);
            //方式1///
            
            // 創(chuàng)建內(nèi)存流
            using (MemoryStream stream = new MemoryStream(byteData))
            {
                // 從內(nèi)存流中創(chuàng)建RawSourceWaveStream   //采樣率設(shè)置為48000,位深設(shè)置位16位,通道為雙聲道
                RawSourceWaveStream rawStream = new RawSourceWaveStream(stream, new WaveFormat(48000, 16, 2));
                LoopingWaveStream loopingWaveStream=new LoopingWaveStream(rawStream); 
                // 使用WaveOutEvent播放音頻數(shù)據(jù)
                WaveOut waveOut = new WaveOut();
                waveOut.Init(loopingWaveStream);//想要循環(huán)播放
                //waveOut.Init(rawStream);      //不想要循環(huán)播放
                waveOut.Play();
 
                //下邊兩種方式的循環(huán)播放會有爆音,不采用。
                //waveOut.PlaybackStopped += (sender, e) =>
                //   {
                //       if (waveOut.PlaybackState == PlaybackState.Stopped)
                //       {
                //           rawStream.Position = 0;
                //           waveOut.Play();
                //       }
                //   };
                //while (waveOut.PlaybackState == PlaybackState.Playing)
                //{
                //    if (rawStream.Position >= rawStream.Length)
                //    {
                //        rawStream.Position = 0;
                //        //Console.WriteLine("Audio stream reached the end.");
                //        //break;
                //    }                    
                //}
 
                Console.WriteLine("Press Enter to stop playback.");
                Console.ReadLine();   //阻塞線程
 
                waveOut.Stop();  //停止播放
                waveOut.Dispose();
            }
 
 
        }
    }
}

以上就是C#播放short或者byte類型的音頻的詳細內(nèi)容,更多關(guān)于C#播放音頻的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • WPF利用TextBlock實現(xiàn)查找結(jié)果高亮顯示效果

    WPF利用TextBlock實現(xiàn)查找結(jié)果高亮顯示效果

    在應(yīng)用開發(fā)過程中,經(jīng)常遇到這樣的需求:通過關(guān)鍵字查找數(shù)據(jù),把帶有關(guān)鍵字的數(shù)據(jù)顯示出來,同時在結(jié)果中高亮顯示關(guān)鍵字,所以本文就來和大家介紹一下如何利用TextBlock實現(xiàn)查找結(jié)果高亮顯示效果吧
    2023-08-08
  • Unity中EventTrigger的幾種使用操作

    Unity中EventTrigger的幾種使用操作

    這篇文章主要介紹了Unity中EventTrigger的幾種使用操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • C#對象與XMl文件之間的相互轉(zhuǎn)換

    C#對象與XMl文件之間的相互轉(zhuǎn)換

    本文是對C#中對象與XMl文件之間的相互轉(zhuǎn)換進行了詳細的介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-10-10
  • C#中SQL Command的基本用法

    C#中SQL Command的基本用法

    今天小編就為大家分享一篇關(guān)于C#中SQL Command的基本用法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • C# Winform實現(xiàn)表格復(fù)制粘貼效果

    C# Winform實現(xiàn)表格復(fù)制粘貼效果

    這篇文章主要為大家學習介紹了如何通過C# Winform實現(xiàn)表格復(fù)制粘貼效果,文中的示例代碼講解詳細,具有一定的參考價值,需要的可以了解一下
    2023-07-07
  • C# 進行圖片壓縮的示例代碼(對jpg壓縮效果最好)

    C# 進行圖片壓縮的示例代碼(對jpg壓縮效果最好)

    這篇文章主要介紹了C# 進行圖片壓縮的示例代碼,幫助大家更好的利用c# 處理圖片,提高辦公效率,感興趣的朋友可以了解下
    2020-11-11
  • TortoiseSVN使用教程

    TortoiseSVN使用教程

    TortoiseSVN 是 Subversion 版本控制系統(tǒng)的一個免費開源客戶端,可以超越時間的管理文件和目錄。本文給大家介紹TortoiseSVN使用教程,對tortoisesvn使用相關(guān)知識感興趣的朋友一起學習吧
    2015-12-12
  • Unity3D游戲-鼠標點擊使角色移動避開障礙物

    Unity3D游戲-鼠標點擊使角色移動避開障礙物

    在Unity的世界里,當你輕點鼠標,角色仿佛被賦予了新的使命,沿著一條無形的軌跡,向著地圖上的目標點進發(fā),每一次移動,不僅是簡單的位移,更是對未知的探索,這種交互,讓玩家與游戲世界緊密相連,仿佛自己就是那個掌控命運的魔法師,用指尖繪制出角色的冒險之路......
    2025-08-08
  • unity 鼠標懸停事件操作

    unity 鼠標懸停事件操作

    這篇文章主要介紹了unity 鼠標懸停事件操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • c#完美截斷字符串代碼(中文+非中文)

    c#完美截斷字符串代碼(中文+非中文)

    c#完美截斷字符串代碼(中文+非中文),需要的朋友可以參考下
    2012-08-08

最新評論

望城县| 临朐县| 湖南省| 曲松县| 佛教| 桃江县| 大城县| 海林市| 永新县| 金溪县| 韶关市| 虞城县| 大理市| 从化市| 慈利县| 孟津县| 百色市| 雅江县| 宁阳县| 黎平县| 济源市| 桐乡市| 廊坊市| 陆良县| 仁怀市| 霍邱县| 丰台区| 屏山县| 日照市| 南涧| 蓬安县| 太和县| 黔西| 遂溪县| 东丰县| 绿春县| 都昌县| 平度市| 太白县| 商河县| 昭苏县|