广告位联系
返回顶部
分享到

C#播放short或者byte类型的音频

C#教程 来源:互联网 作者:佚名 发布时间:2024-12-24 22:34:54 人浏览
摘要

一、通过Nuget安装NAudio包 开发工具:vs2019 点击VisualStudio 2019的工具-NuGet包管理器-》管理解决方案的NuGet的程序包-》浏览-》在搜索框中输入NAudio-》点击安装 二、获取short类型或者byte类型的音频

一、通过Nuget安装NAudio包

开发工具:vs2019

点击Visual Studio 2019的工具->NuGet包管理器-》管理解决方案的NuGet的程序包-》浏览-》在搜索框中输入NAudio-》点击安装

二、获取short类型或者byte类型的音频数据

我的数据是一组short类型的正弦波信号,存储在txt中,如下图所示:

通过C#读取文档并存储在short数组中

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

string filePath = "20500Left.txt"; // txt文件路径

short[] audioData = new short[48000 * 2]; //双声道数据

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变为byte类型的数据(如果本身你的音频数据就是byte类型就不需要执行下边操作)

1

2

3

// 将short[]音频数据转换为byte[]数据

byte[] byteData = new byte[audioData.Length * 2]; // short类型占2个字节

Buffer.BlockCopy(audioData, 0, byteData, 0, byteData.Length);

三、循环播放自己的音频数据,重写WaveStream类

主要是重写了Read这个函数,读到数据流末尾,就从开头读取。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

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类型的数据转换为Stream类型,并填入WaveOut对象中,进行播放

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

// 创建内存流

           using (MemoryStream stream = new MemoryStream(byteData))

           {

               // 从内存流中创建RawSourceWaveStream   //采样率设置为48000,位深设置位16位,通道为双声道

               RawSourceWaveStream rawStream = new RawSourceWaveStream(stream, new WaveFormat(48000, 16, 2));

               LoopingWaveStream loopingWaveStream=new LoopingWaveStream(rawStream);

               // 使用WaveOutEvent播放音频数据

               WaveOut waveOut = new WaveOut();

               waveOut.Init(loopingWaveStream);//想要循环播放

               //waveOut.Init(rawStream);      //不想要循环播放

               waveOut.Play();

 

               //下边两种方式的循环播放会有爆音,不采用。

               //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();

           }

四、完整代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

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]; //双声道数据

            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[]音频数据转换为byte[]数据

            byte[] byteData = new byte[audioData.Length * 2]; // short类型占2个字节

            Buffer.BlockCopy(audioData, 0, byteData, 0, byteData.Length);

            //方式1///

             

            // 创建内存流

            using (MemoryStream stream = new MemoryStream(byteData))

            {

                // 从内存流中创建RawSourceWaveStream   //采样率设置为48000,位深设置位16位,通道为双声道

                RawSourceWaveStream rawStream = new RawSourceWaveStream(stream, new WaveFormat(48000, 16, 2));

                LoopingWaveStream loopingWaveStream=new LoopingWaveStream(rawStream);

                // 使用WaveOutEvent播放音频数据

                WaveOut waveOut = new WaveOut();

                waveOut.Init(loopingWaveStream);//想要循环播放

                //waveOut.Init(rawStream);      //不想要循环播放

                waveOut.Play();

  

                //下边两种方式的循环播放会有爆音,不采用。

                //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();

            }

  

  

        }

    }

}


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • C#使用录音并导出录音数据

    C#使用录音并导出录音数据
    一、枚举电脑录音设备,指定设备录音 1、使用Vs2019的Nuget包管理器安装NAudio包 NAudio包 如图所示: 2、创建录音对象并指定录音格式 1 2 3 4
  • C#播放short或者byte类型的音频

    C#播放short或者byte类型的音频
    一、通过Nuget安装NAudio包 开发工具:vs2019 点击VisualStudio 2019的工具-NuGet包管理器-》管理解决方案的NuGet的程序包-》浏览-》在搜索框中输入
  • C# winfrom异步加载数据不影响窗体UI的操作方法
    在数字浪潮汹涌澎湃的时代,程序开发宛如一座神秘而宏伟的魔法城堡,矗立在科技的浩瀚星空中。代码的字符,似那闪烁的星辰,按照特
  • 使用C#实现AES加密与解密
    1. AES 加密简介 AES(Advanced Encryption Standard,高级加密标准)是一种对称加密算法,意味着加密和解密使用相同的密钥。AES 支持不同的密钥长
  • 在idea中利用maven实现多环境配置自动打包的流程

    在idea中利用maven实现多环境配置自动打包的流程
    spring的多环境配置 spring提供了多环境配置文件的功能,只需要根据配置文件后缀即可加载对应的配置文件 1 2 3 4 spring: profiles: # 修改后缀即
  • Java实现自定义重试工具类介绍
    Spring-retry、guava的Retry都提供有重试工具,但二者均存在一个确缺点,即如果重试等待过程中会一直阻塞工作线程,这对于在生产环境使用是
  • C#中SetStyle的具体使用介绍
    在C#的Windows Forms应用程序中,SetStyle方法是Control类的一个成员,用于启用或禁用特定的控件样式。这些样式控制控件的不同行为和外观。以
  • C# WinForm实现画笔签名功能介绍

    C# WinForm实现画笔签名功能介绍
    实现效果 签名功能的显示界面如下图: 该效果主要实现如下功能: 1、提供画布,设计画笔类,实现画笔签名 2、点击重签按钮清空画布
  • C#文字识别API场景解析、表格识别提取功能实现
    在快节奏的工作与生活环境中,如何提高企业工作效率、提升用户体验成为了人们追求的共同目标。针对市场发展需求,一种将任意场景图
  • c#线性回归和多项式拟合示例详解
    1. 线性回归 公式:线性回归的目标是拟合一条直线,形式为: y=mx+by=mx+b 其中: yy是因变量(目标值) xx是自变量(特征值) mm是斜率(s
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计