Loading... ## 1、介绍DirectShow Windows下录制屏幕和Linux和Mac有所不同,需要通过DirectShow来完成屏幕的录制。 什么是DirectShow?DirectShow是DirectX组件的一部分,是Windows提供的对于媒体文件的各种操作的一个通用接口。例如,我们可以直接通过DirectShow API来获取某个视频的解码流,从而送到播放器中供用户观看,目前绝大多数基于Windows的播放器默认的播放方式都是如此。作为对比我们来看一下跨平台的开源播放器mplayer,其解码方式是自行调用libav库,获得解码数据流和其它必需的信息之后显示给屏幕观看,解码过程中没有DirectShow接口的参与。 DirectShow基于模块化的方式进行设计.每一个组件都被称为一个Filter。例如,众所周知FFMpeg的库可以进行视频音频的分离解码前处理等工作,而于是我们就可以将其修改代码制作成一个FIlter。这样,当DirectShow接口获取要解码一个视频文件的请求的时候,DirectShow便可以调用这个Filter,获取需要的信息从而返回给发起请求的应用程序。 而更重要的是,我们可以注册一个DirectShow Filter,获取其它的视频源信息,依旧可以通过DirectShow接口返回给需要的程序。比如,如果有一个DirectShow接口能够获得当前计算机屏幕上的动态图像信息并且作为视频流返回给DirectShow接口,那么只要我们有程序能够获得这段视频流,我们就能实现在Windows下的屏幕录制。 总结起来我们的屏幕录制方法基本原理如下: 注册用于屏幕录像的DirectShow滤镜,然后运行DirectShow滤镜获取屏幕动态图像,将获取到的动态图像流通过视频转换程序转换成需要的视频格式。 **以上内容转自:[在Windows下通过directshow录制屏幕的教程](https://www.geek-share.com/detail/2584949901.html)**。 总结: > 注册录频dshow滤镜(如screen-capture-recorder),然后通过dshow获取录屏图像然后编码处理。 因此,在使用FFmpeg屏幕录像之前,需要先安装dshow滤镜。在这里推荐一个工具:**screen capture recorder**。安装这个软件之后,就可以通过FFmpeg屏幕录像了。 提供的**screen capture recorder**下载地址(Note:安装需要Java环境): <button class="btn m-b-xs btn-info btn-addon" onclick='window.open("https://sourceforge.net/projects/screencapturer/files/","_blank")'><i><i data-feather="2"></i></i>screen capture recorder</button> <button class="btn m-b-xs btn-info btn-addon" onclick='window.open("https://pan.baidu.com/s/15lpktU6kPpF6HlmS-_xf2g","_blank")'><i><i data-feather="2"></i></i>screen capture recorder</button> 提取码:1234 ## 2、列出系统支持的媒体捕获设备 使用下面的命令: ```shell ffmpeg -list_devices true -f dshow -i dummy ```  在我的机器上列出了如下设备: - DirectShow video devices(视频捕获设备) - [dshow @ 0000029c91d7d940] "Integrated Webcam" - [dshow @ 0000029c91d7d940] "screen-capture-recorder" - DirectShow audio devices(音频捕获设备) - [dshow @ 0000029c91d7d940] "麦克风 (Realtek Audio)" - [dshow @ 0000029c91d7d940] "virtual-audio-capturer" 其中,`screen-capture-recorder`和`virtual-audio-capturer`就是安装软件**screen capture recorder**之后带有的录制屏幕和录制系统声音的工具。而`Integrated Webcam`和`麦克风 (Realtek Audio)`分别对应我设备上的摄像头和麦克风。这两者对于不同的设备会有不同的设备名称。 ## 3、录制屏幕 - 只录制屏幕,不录制系统声音,不录制麦克风声音 ``` ffmpeg -f dshow -i video='screen-capture-recorder' -c:v libx264 -preset:v ultrafast -tune:v zerolatency -r 24 screen_capture.mp4 ``` > Note:使用screen-capture-recorder录频只能录到屏幕左上的一部分区域,这个问题我在是没有解决,这里我推荐使用gdigrab来录制屏幕。 ```shell ffmpeg -f gdigrab -i desktop -preset ultrafast -crf 20 screen_capture.mp4 ``` - 录制屏幕,录制系统声音,不录制麦克风声音 ```shell ffmpeg -f gdigrab -i desktop -f dshow -i audio='virtual-audio-capturer' -c:v libx264 -c:a libmp3lame -preset:v ultrafast -tune:v zerolatency -y output.mp4 ``` - 录制屏幕,录制麦克风,不录制系统声音 ```shell ffmpeg -f dshow -i audio="麦克风 (Realtek Audio)" -f gdigrab -i desktop -c:v libx264 -c:a aac -preset:v ultrafast -tune:v zerolatency -r 24 -y output.mp4 ``` - 录制屏幕,录制麦克风,录制系统声音 ```shell ffmpeg -rtbufsize 2048M -f dshow -i audio="麦克风 (Realtek Audio)" -f dshow -i audio="virtual-audio-capturer" -f gdigrab -i desktop -c:v libx264 -c:a aac -b:a 128k -preset:v ultrafast -tune:v zerolatency -r 15 -threads 5 -y output_5.mp4 ``` > Note:这种方法目前有问题,录制会报错: real-time buffer [virtual-audio-capturer] [audio input] too full or near too full (69% of size: 3041280 [rtbufsize parameter])! frame dropped! - 录制摄像头,录制麦克风声音 ```shell ffmpeg -f dshow -i audio="麦克风 (Realtek Audio)" -f dshow -i video="Integrated Webcam" -c:v libx264 -c:a aac -preset:v ultrafast -tune:v zerolatency -r 24 output.mp4 ``` ## 3、参考资料 [1] [在Windows下通过directshow录制屏幕的教程](https://www.geek-share.com/detail/2584949901.html) [2] [FFmpeg获取DirectShow设备数据(摄像头,录屏)](https://blog.csdn.net/leixiaohua1020/article/details/38284961) [3] [H.264 Video Encoding Guide](https://trac.ffmpeg.org/wiki/Encode/H.264) Last modification:June 15th, 2021 at 06:08 pm © 允许规范转载