C#使用FFmpeg录制视频
FFmpeg通过控制台命令可以方便地录制USB摄像头和屏幕,本文使用C#中的Process类调用FFmpeg命令,并通过获取控制台输出参数实现录制视频的完整功能。
Gitee完整代码:FFmpegWrappedSharpRecorder。
1、获取设备列表
FFmpeg命令:
ffmpeg.exe -list_devices true -f dshow -i dummy
关键输出:
[dshow @ 0000018b1a24c740] "USB2.0 HD UVC WebCam" (video) [dshow @ 0000018b1a24c740] "麦克风阵列 (Realtek(R) Audio)" (audio)
设备列表信息是在控制台的错误信息流中输出的,需要重定向错误信息。另外,可根据上述输出示例提取出音视频设备列表。
需要注意的是,需要设置输出编码为UTF8,防止中文显示乱码。
2、获取视频设备分辨率列表
FFmpeg命令:
ffmpeg.exe -list_options true -f dshow -i video="USB2.0 HD UVC WebCam"
关键输出:
[dshow @ 00000259a63dc680] DirectShow video device options(from video devices) [dshow @ 00000259a63dc680] Pin "捕获" (alternative pin name "捕获") [dshow @ 00000259a63dc680] vcodec=mjpeg min s=1280x720 fps = 30 max s = 1280x720 fps = 30 [dshow @ 00000259a63dc680] vcodec=mjpeg min s=800x600 fps = 30 max s = 800x600 fps = 30 [dshow @ 00000259a63dc680] vcodec=mjpeg min s=640x480 fps = 30 max s = 640x480 fps = 30 [dshow @ 00000259a63dc680] vcodec=mjpeg min s=352x288 fps = 30 max s = 352x288 fps = 30 [dshow @ 00000259a63dc680] vcodec=mjpeg min s=320x240 fps = 30 max s = 320x240 fps = 30 [dshow @ 00000259a63dc680] vcodec=mjpeg min s=176x144 fps = 30 max s = 176x144 fps = 30 [dshow @ 00000259a63dc680] vcodec=mjpeg min s=160x120 fps = 30 max s = 160x120 fps = 30 [dshow @ 00000259a63dc680] pixel_format=yuyv422 min s=640x480 fps = 30 max s = 640x480 fps = 30 [dshow @ 00000259a63dc680] pixel_format=yuyv422 min s=1280x720 fps = 10 max s = 1280x720 fps = 10 [dshow @ 00000259a63dc680] pixel_format=yuyv422 min s=800x600 fps = 20 max s = 800x600 fps = 20 [dshow @ 00000259a63dc680] pixel_format=yuyv422 min s=352x288 fps = 30 max s = 352x288 fps = 30 [dshow @ 00000259a63dc680] pixel_format=yuyv422 min s=320x240 fps = 30 max s = 320x240 fps = 30 [dshow @ 00000259a63dc680] pixel_format=yuyv422 min s=176x144 fps = 30 max s = 176x144 fps = 30 [dshow @ 00000259a63dc680] pixel_format=yuyv422 min s=160x120 fps = 30 max s = 160x120 fps = 30
设备列表信息是在控制台的错误信息流中输出的,需要重定向错误信息。另外,可根据上述输出示例提取出视频设备分辨率列表。
3、获取视频编码器列表
FFmpeg命令:
ffmpeg.exe configure -encoders
关键输出:
V....D libx264 libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (codec h264) V....D libx264rgb libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 RGB (codec h264) V....D libopenh264 OpenH264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (codec h264) V....D h264_amf AMD AMF H.264 Encoder (codec h264) V....D h264_mf H264 via MediaFoundation (codec h264) V....D h264_nvenc NVIDIA NVENC H.264 encoder (codec h264) V..... h264_qsv H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (Intel Quick Sync Video acceleration) (codec h264) V....D libx265 libx265 H.265 / HEVC (codec hevc) V....D hevc_amf AMD AMF HEVC encoder (codec hevc) V....D hevc_mf HEVC via MediaFoundation (codec hevc) V..... hevc_qsv HEVC (Intel Quick Sync Video acceleration) (codec hevc) V....D libkvazaar libkvazaar H.265 / HEVC (codec hevc)视频编码器列表信息
视频编码器列表信息是在控制台的标准输出流中输出的,需要重定向输出信息。另外,可根据上述输出示例提取出视频编码器列表。
4、录制视频
录制视频需要在开始录制时保留Process对象,在结束录制时退出该进程。
4.1 录制USB摄像头视频
FFmpeg命令:
ffmpeg.exe -f dshow -i video="USB2.0 HD UVC WebCam":audio="麦克风阵列 (Realtek(R) Audio)" -c:v libx264 -s 1280x720 -r 15 D:\test.mp4
其中,-c:v libx264表示使用libx264编码器,-s 1280x720表示设置视频分辨率为1280x720,-r 15表示设置视频帧率为15,最后的D:\test.mp4表示保存录制视频的文件。
4.2 录制屏幕
FFmpeg命令:
ffmpeg.exe -f dshow -i audio="麦克风阵列 (Realtek(R) Audio)" -f gdigrab -i desktop -c:v libx264 -r 15 D:\test.mp4
其中,-f gdigrab表示使用GDI抓屏,-i desktop表示录制屏幕。
注意:这种方式默认会将所有屏幕都录制进去,可以通过指定–offset_x(左上角偏移量X)、–offset_y(左上角偏移量Y)及–video_size(需要录制的宽度和高度)参数实现录制指定屏幕区域的视频。
4.3 停止录制
输入字母q,并等待ffmpeg退出。
_process.StandardInput.WriteLine("q"); _process.WaitForExit(); _process.Close();
5、FFmpegWrappedSharpRecorder程序效果