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程序效果

posted @ 2023-02-07 14:35  xhubobo  阅读(1626)  评论(0编辑  收藏  举报