1 查看FFmpeg版本是否支持dshow设备

C:\Users\admin>ffmpeg -formats |findstr dshow
ffmpeg version git-2020-08-16-5df9724 Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 10.2.1 (GCC) 20200805
configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libsrt --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libgsm --enable-librav1e --enable-libsvtav1 --disable-w32threads --enable-libmfx --enable-ffnvcodec --enable-cuda-llvm --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt --enable-amf
libavutil 56. 58.100 / 56. 58.100
libavcodec 58.100.100 / 58.100.100
libavformat 58. 51.100 / 58. 51.100
libavdevice 58. 11.101 / 58. 11.101
libavfilter 7. 87.100 / 7. 87.100
libswscale 5. 8.100 / 5. 8.100
libswresample 3. 8.100 / 3. 8.100
libpostproc 55. 8.100 / 55. 8.100
D dshow DirectShow capture

2 列举该计算机下所有视频捕捉设备(包括虚拟设备)

C:\Users\admin>ffmpeg -list_devices true -f dshow -i dummy
ffmpeg version git-2020-08-16-5df9724 Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 10.2.1 (GCC) 20200805
configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libsrt --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libgsm --enable-librav1e --enable-libsvtav1 --disable-w32threads --enable-libmfx --enable-ffnvcodec --enable-cuda-llvm --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt --enable-amf
libavutil 56. 58.100 / 56. 58.100
libavcodec 58.100.100 / 58.100.100
libavformat 58. 51.100 / 58. 51.100
libavdevice 58. 11.101 / 58. 11.101
libavfilter 7. 87.100 / 7. 87.100
libswscale 5. 8.100 / 5. 8.100
libswresample 3. 8.100 / 3. 8.100
libpostproc 55. 8.100 / 55. 8.100
[dshow @ 0000017cd910dec0] DirectShow video devices (some may be both video and audio devices)
[dshow @ 0000017cd910dec0] "Chicony USB2.0 Camera"
[dshow @ 0000017cd910dec0] Alternative name "@device_pnp_\\?\usb#vid_04f2&pid_b59e&mi_00#6&20cea5e4&2&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global"
[dshow @ 0000017cd910dec0] DirectShow audio devices
[dshow @ 0000017cd910dec0] Could not enumerate audio only devices (or none found).
dummy: Immediate exit requested

当前笔记本电脑只有摄像头(名称:Chicony USB2.0 Camera),没有音频设备

3 查看设备支持选项

C:\Users\admin>ffmpeg -list_options true -f dshow -i video="Chicony USB2.0 Camera"
ffmpeg version git-2020-08-16-5df9724 Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 10.2.1 (GCC) 20200805
configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libsrt --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libgsm --enable-librav1e --enable-libsvtav1 --disable-w32threads --enable-libmfx --enable-ffnvcodec --enable-cuda-llvm --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt --enable-amf
libavutil 56. 58.100 / 56. 58.100
libavcodec 58.100.100 / 58.100.100
libavformat 58. 51.100 / 58. 51.100
libavdevice 58. 11.101 / 58. 11.101
libavfilter 7. 87.100 / 7. 87.100
libswscale 5. 8.100 / 5. 8.100
libswresample 3. 8.100 / 3. 8.100
libpostproc 55. 8.100 / 55. 8.100
[dshow @ 000001d7f561de80] DirectShow video device options (from video devices)
[dshow @ 000001d7f561de80] Pin "捕获" (alternative pin name "0")
[dshow @ 000001d7f561de80] vcodec=mjpeg min s=1280x720 fps=30 max s=1280x720 fps=30
[dshow @ 000001d7f561de80] vcodec=mjpeg min s=1280x720 fps=30 max s=1280x720 fps=30
[dshow @ 000001d7f561de80] vcodec=mjpeg min s=640x480 fps=30 max s=640x480 fps=30
[dshow @ 000001d7f561de80] vcodec=mjpeg min s=640x480 fps=30 max s=640x480 fps=30
[dshow @ 000001d7f561de80] vcodec=mjpeg min s=640x360 fps=30 max s=640x360 fps=30
[dshow @ 000001d7f561de80] vcodec=mjpeg min s=640x360 fps=30 max s=640x360 fps=30
[dshow @ 000001d7f561de80] vcodec=mjpeg min s=352x288 fps=30 max s=352x288 fps=30
[dshow @ 000001d7f561de80] vcodec=mjpeg min s=352x288 fps=30 max s=352x288 fps=30
[dshow @ 000001d7f561de80] vcodec=mjpeg min s=320x240 fps=30 max s=320x240 fps=30
[dshow @ 000001d7f561de80] vcodec=mjpeg min s=320x240 fps=30 max s=320x240 fps=30
[dshow @ 000001d7f561de80] vcodec=mjpeg min s=176x144 fps=30 max s=176x144 fps=30
[dshow @ 000001d7f561de80] vcodec=mjpeg min s=176x144 fps=30 max s=176x144 fps=30
[dshow @ 000001d7f561de80] vcodec=mjpeg min s=160x120 fps=30 max s=160x120 fps=30
[dshow @ 000001d7f561de80] vcodec=mjpeg min s=160x120 fps=30 max s=160x120 fps=30
[dshow @ 000001d7f561de80] vcodec=mjpeg min s=1280x720 fps=30 max s=1280x720 fps=30
[dshow @ 000001d7f561de80] vcodec=mjpeg min s=1280x720 fps=30 max s=1280x720 fps=30
[dshow @ 000001d7f561de80] pixel_format=yuyv422 min s=1280x720 fps=10 max s=1280x720 fps=10
[dshow @ 000001d7f561de80] pixel_format=yuyv422 min s=1280x720 fps=10 max s=1280x720 fps=10
[dshow @ 000001d7f561de80] pixel_format=yuyv422 min s=640x480 fps=30 max s=640x480 fps=30
[dshow @ 000001d7f561de80] pixel_format=yuyv422 min s=640x480 fps=30 max s=640x480 fps=30
[dshow @ 000001d7f561de80] pixel_format=yuyv422 min s=640x360 fps=30 max s=640x360 fps=30
[dshow @ 000001d7f561de80] pixel_format=yuyv422 min s=640x360 fps=30 max s=640x360 fps=30
[dshow @ 000001d7f561de80] pixel_format=yuyv422 min s=352x288 fps=30 max s=352x288 fps=30
[dshow @ 000001d7f561de80] pixel_format=yuyv422 min s=352x288 fps=30 max s=352x288 fps=30
[dshow @ 000001d7f561de80] pixel_format=yuyv422 min s=320x240 fps=30 max s=320x240 fps=30
[dshow @ 000001d7f561de80] pixel_format=yuyv422 min s=320x240 fps=30 max s=320x240 fps=30
[dshow @ 000001d7f561de80] pixel_format=yuyv422 min s=176x144 fps=30 max s=176x144 fps=30
[dshow @ 000001d7f561de80] pixel_format=yuyv422 min s=176x144 fps=30 max s=176x144 fps=30
[dshow @ 000001d7f561de80] pixel_format=yuyv422 min s=160x120 fps=30 max s=160x120 fps=30
[dshow @ 000001d7f561de80] pixel_format=yuyv422 min s=160x120 fps=30 max s=160x120 fps=30
[dshow @ 000001d7f561de80] pixel_format=yuyv422 min s=1280x720 fps=10 max s=1280x720 fps=10
[dshow @ 000001d7f561de80] pixel_format=yuyv422 min s=1280x720 fps=10 max s=1280x720 fps=10
video=Chicony USB2.0 Camera: Immediate exit requested

4 直接播放笔记本电脑摄像头数据

C:\Users\admin>ffplay -f dshow video="Chicony USB2.0 Camera"

5录制桌面+系统声音

这个功能需要安装一个组件包捕获视频和音频数据

安装Setup Screen Capturer Recorder v0.12.11.exe

下载地址:​​on screen capture recorder to video free - Browse Files at SourceForge.net​

查看视频捕获设备

ffmpeg -list_devices true -f dshow -i dummy
ffmpeg version git-2020-08-16-5df9724 Copyright (c) 2000-2020 the FFmpeg developers
[dshow @ 000002170b6fdec0] DirectShow video devices (some may be both video and audio devices)
[dshow @ 000002170b6fdec0] "Chicony USB2.0 Camera"
[dshow @ 000002170b6fdec0] Alternative name "@device_pnp_\\?\usb#vid_04f2&pid_b59e&mi_00#6&20cea5e4&2&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global"
[dshow @ 000002170b6fdec0] "screen-capture-recorder"
[dshow @ 000002170b6fdec0] Alternative name "@device_sw_{860BB310-5D01-11D0-BD3B-00A0C911CE86}\{4EA69364-2C8A-4AE6-A561-56E4B5044439}"
[dshow @ 000002170b6fdec0] DirectShow audio devices
[dshow @ 000002170b6fdec0] "virtual-audio-capturer"
[dshow @ 000002170b6fdec0] Alternative name "@device_sw_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\{8E146464-DB61-4309-AFA1-3578E927E935}"
dummy: Immediate exit requested

相比之前多了screen-capture-recorder桌面捕获设备和virtual-audio-capturer音频捕获设备(系统输出声音)

6 录制桌面视音频数据

ffmpeg -framerate 25  -thread_queue_size 4096 -f gdigrab -rtbufsize 670200k   -i desktop -thread_queue_size 4096  -f dshow -i audio="virtual-audio-capturer" -crf 18 -vf scale=iw*0.8:ih*0.8  -vcodec libx264 -pix_fmt yuv420p -preset:v ultrafast -tune:v zerolatency -y output.mp4

 

7 画面卡顿问题

性能较低,应该设置视频的码率,清晰度,音频采样率低一点,而不是盲目扩展内存

8参数说明

-preset:v ultrafast -tune:v zerolatency加快x264编码速度
-pix_fmt yuv420p 等同于 -vf format=yuv420p

命令行参数-crf

在优先保证画面质量(也不太在乎转码时间)的情况下,使用-crf参数来控制转码是比较适宜的。这个参数的取值范围为0~51,其中0为无损模式,数值越大,画质越差,生成的文件却越小。从主观上讲,18~28是一个合理的范围。18被认为是视觉无损的(从技术角度上看当然还是有损的),它的输出视频质量和输入视频相当

9 扩展缓存区

Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)

解决方案:-thread_queue_size 4096
real-time buffer [TTQ HD Camera] [video input] too full or near too full (101% of size: 3041280 [rtbufsize parameter])! frame dropped!

解决方案:rtbufsize 670200k

10参考资料

DirectShow 简介
​​​https://www.cnblogs.com/linuxAndMcu/p/12057723.html​​​https://blog.csdn.net/weixin_39140087/article/details/107564027
https://trac.ffmpeg.org/wiki/DirectShow