C#中录制带有声音的视频并保存下来,使用OpenCVSharp和NAudio库或者是Accord.Net
using OpenCvSharp; using NAudio.Wave; // 定义视频和音频的参数 int fps = 30; Size videoSize = new Size(640, 480); WaveFormat audioFormat = new WaveFormat(44100, 16, 2); // 创建视频编码器 VideoWriter videoWriter = new VideoWriter("output.avi", FourCC.XVID, fps, videoSize, true); // 创建音频录制器 WaveFileWriter audioWriter = new WaveFileWriter("audio.wav", audioFormat); // 创建视频捕获器 VideoCapture videoCapture = new VideoCapture(0); videoCapture.Set(CaptureProperty.FrameWidth, videoSize.Width); videoCapture.Set(CaptureProperty.FrameHeight, videoSize.Height); videoCapture.Set(CaptureProperty.Fps, fps); // 创建音频捕获器 WaveInEvent audioCapture = new WaveInEvent(); audioCapture.WaveFormat = audioFormat; audioCapture.DataAvailable += (sender, e) => { audioWriter.Write(e.Buffer, 0, e.BytesRecorded); }; // 开始录制音频和视频 videoWriter.Open(); videoCapture.Start(); audioCapture.StartRecording(); while (true) { Mat frame = new Mat(); videoCapture.Read(frame); if (frame.Empty()) break; videoWriter.Write(frame); Cv2.ImShow("video", frame); if (Cv2.WaitKey(1) == 27) break; } // 停止录制音频和视频 videoCapture.Release(); videoWriter.Release(); Cv2.DestroyAllWindows(); audioCapture.StopRecording(); audioWriter.Close(); audioWriter.Dispose(); // 合并音视频 var videoFile = new MediaFile { Filename = "output.avi" }; var audioFile = new MediaFile { Filename = "audio.wav" }; var outputFile = new MediaFile { Filename = "output.mp4" }; using (var engine = new Engine()) { engine.Convert(videoFile, audioFile, outputFile); }
首先定义了视频和音频的参数。然后创建了视频编码器和音频录制器,以便能够将视频和音频写入文件。接下来创建了视频和音频的捕获器,以便能够从摄像头和麦克风捕获图像和声音。 在主循环中不断从摄像头中读取图像,并将其写入视频文件中。同时通过OpenCVSharp的ImShow函数将图像显示在屏幕上。当用户按下ESC键时,程序退出主循环。 最后,我们停止录制音频和视频,并将它们合并成一个MP4文件。这里我们使用了FFmpeg的C#封装库FFmpeg.NET来进行音视频合并。
如果是使用了Accord.Net
using Accord.Video.DirectShow; using Accord.Video.FFMPEG; // ... // 创建一个VideoCaptureDevice对象,用于捕获音频和视频 var videoSource = new VideoCaptureDevice(/* 设备名称 */); // 创建一个AudioCaptureDevice对象,用于捕获音频 var audioSource = new AudioCaptureDevice(/* 设备名称 */); // 创建一个AVIWriter对象,用于将音频和视频写入文件 var writer = new VideoFileWriter(); // 设置writer的参数 writer.FrameRate = /* 帧率 */; writer.VideoCodec = /* 视频编解码器 */; writer.AudioCodec = /* 音频编解码器 */; writer.AudioBitRate = /* 音频比特率 */; writer.AudioSampleRate = /* 音频采样率 */; writer.AudioChannels = /* 音频通道数 */; // 打开writer writer.Open(/* 文件路径 */, /* 视频宽度 */, /* 视频高度 */, /* 是否包含音频 */); // 开始捕获音频和视频 videoSource.Start(); audioSource.Start(); // 捕获音频和视频并写入文件 while (/* 是否继续录制 */) { // 捕获视频帧 var videoFrame = videoSource.WaitForFrame(); // 捕获音频帧 var audioFrame = audioSource.WaitForFrame(); // 将音频和视频帧写入文件 writer.WriteVideoFrame(videoFrame); writer.WriteAudioFrame(audioFrame); } // 停止捕获音频和视频 videoSource.Stop(); audioSource.Stop(); // 关闭writer writer.Close();
简单的示例代码