前言
重新安装所有依赖
1 | Update-Package –reinstall |
音视频分开录制,音频如果麦克风和扬声器都录制的话,也要分开录制,最后再合并所有的流。
官方文档
NAudio
https://github.com/naudio/NAudio
安装
视频库
OpenCvSharp4
1 | Install-Package OpenCvSharp4 -Version 4.7.0.20230115 |
OpenCvSharp3
1 | Install-Package OpenCvSharp3-AnyCPU -Version 4.0.0.20181129 |
使用OpenCvSharp4在保存视频的时候老是报错或无法生成视频文件,换成OpenCvSharp3就一切正常。
音频库
音频录制使用了NAudio库,它既能录制麦克风也能录制扬声器
安装
1 | Install-Package NAudio -Version 1.9.0 |
音视频合并库
目前未找到好的合并方案。
合并的库大多都是FFmpeg的封装,FFmpeg本身也比较大,不建议使用,所以未找到更好的替代方案。
音频处理
使用NAudio
安装
1 | Install-Package NAudio -Version 1.9.0 |
麦克风列表
1 | using NAudio.Wave; |
打印如下
-1: Microsoft Sound Mapper
0: 麦克风 (Realtek(R) Audio)
注意上面是从-1开始遍历的,我们获取麦克风设备的时候可以从0遍历。
方式2
1 | using NAudio.CoreAudioApi; |
扬声器列表
获取默认的扬声器及其声音大小
1 | using NAudio.CoreAudioApi; |
结果
PHL 271V8 (NVIDIA High Definition Audio) 声音大小:100
扬声器/听筒 (Realtek(R) Audio) 声音大小:29
默认的麦克风和扬声器
1 | var defaultCaptureDevice = WasapiCapture.GetDefaultCaptureDevice(); |
获取麦克风实时音量
xaml
1 | <ProgressBar |
代码
1 | // 定义 |
停止
1 | // 停止时调用 |
获取麦克风列表
1 | for (int n = -1; n < WaveIn.DeviceCount; n++) |
打印如下
-1: Microsoft 声音映射器
0: 麦克风 (Realtek(R) Audio)
注意上面是从-1开始遍历的,我们获取麦克风设备的时候可以从0遍历。
设置麦克风
设置对应的索引
1 | waveIn.DeviceNumber = 0; |
官方文档
https://github.com/naudio/NAudio/blob/master/Docs/RecordingLevelMeter.md
获取扬声器实时音量
1 | // 定义 |
注意
获取扬声器声音大小不受系统声音设置大小影响,所以要想获取真实用户听到的声音大小要用
采集的声音大小
*扬声器设置的声音大小
设置扬声器的音量
1 | private void SetCurrentSpeakerVolume(int volume) |
录制麦克风和扬声器
录制麦克风
1 | using System; |
注意
这里在初始化类的时候就直接调用录制了,原因在于,如果同时录制音视频的时候,同时开启的时候,由于硬件原因导致启动的时间有先后从而会导致声画不同步。
后文中的视频录制也是同样的原因。
录制扬声器
1 | using System; |
音频混音
1 | public static void MixAudio |
音频状态获取
改变系统音量
1 | [ ] |
改变软件音量
改变软件音量 但不改变系统音量
1 | [ ] |
设置默认音频设备
目前还没有用代码设置默认音频设备的方法
打开系统声音设置,让用户操作
1 | Process.Start("mmsys.cpl"); |
摄像头
摄像头列表
获取摄像头列表
1 | ``` |
视频录制
桌面录制
工具类
1 | using System; |
调用方式
1 | // 当前窗体指针 |
视频写入
1 | private VideoWriter _videoWriter; |
桌面流读取
1 |
组件录制
1 | /// <summary> |
摄像头录制
录制控制帧间隔
1 | private WaveFileWriter _audioWriter; |
取帧和写帧分离
1 | private WaveFileWriter _audioWriter; |
音视频合并
1 |
生成缩略图
1 | /// <summary> |
获取视频时长
1 | /// <summary> |
打开系统声音设置
1 | Process.Start("mmsys.cpl"); |
调用本地播放
1 | Process pro = new Process |
音频参数计算
采样率和比特率(码率)之间的公式如下:
比特率 = 采样率 × 样本深度 × 声道数
AudioBitRate = SampleRate × bits × channels
其中,采样率表示每秒钟采集的样本数,单位为Hz(赫兹);样本深度表示每个采样值所占的位数,通常为16或24位;声道数表示音频信号的通道数,通常为单声道或立体声。
例如,对于一段立体声音乐,采样率为44100Hz,样本深度为16位,声道数为2,则它的比特率为:
比特率 = 44100 × 16 × 2 = 1411200 bit/s = 1.41 Mbps
采样率为44100Hz,样本深度为16位,声道数为1,则它的比特率为:
比特率 = 44100 × 16 × 1 = 705600 bit/s
因为
1 byte = 8 bits
所以上面的示例1s产生的byte为
1411200 / 8 = 176400
音频计算中使用到的参数
1 | //帧率 |
音频的比特率
1 | 比特率 = 采样率 * 位深 * 声道数 |
音频帧大小
1 | 音频帧大小 = 比特率 * 1秒 / 8 / 声道数 / 帧率 |
其中比特率 * 1秒 / 8
为1秒的byte数。
运行时间
1 | Stopwatch sw = Stopwatch.StartNew(); // 开始计时 |