🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # MacOS ## 设备枚举 查看设备列表 ``` $ ffmpeg -hide_banner -devices Devices: D. = Demuxing supported .E = Muxing supported -- D avfoundation AVFoundation input device D lavfi Libavfilter virtual input device E sdl,sdl2 SDL2 output device ``` 可以看到输入设备有:avfoundation,lavfi 输出设备有:sdl ` ` 设备采集举例: ``` $ ffmpeg -f avfoundation -list_devices true -i " " ``` 看到了 如下设备 ``` [AVFoundation input device @ 0x7fac75c048c0] AVFoundation video devices: [AVFoundation input device @ 0x7fac75c048c0] [0] FaceTime高清摄像头(内建) [AVFoundation input device @ 0x7fac75c048c0] [1] Capture screen 0 [AVFoundation input device @ 0x7fac75c048c0] AVFoundation audio devices: [AVFoundation input device @ 0x7fac75c048c0] [0] Built-in Microphone ``` ## 采集摄像头 采集内置摄像头 ``` $ ffmpeg -f avfoundation -i "FaceTime高清摄像头" out.mp4 //或者使用索引号 0 来代替摄像头设备名称 ffmpeg -f avfoundation -i 0 out.mp4 [avfoundation @ 0x7fbf16808200] Selected framerate (29.970030) is not supported by the device. [avfoundation @ 0x7fbf16808200] Supported modes: [avfoundation @ 0x7fbf16808200] 640x480@[30.000030 30.000030]fps [avfoundation @ 0x7fbf16808200] 640x480@[29.000049 29.000049]fps [avfoundation @ 0x7fbf16808200] 640x480@[28.000067 28.000067]fps [avfoundation @ 0x7fbf16808200] 640x480@[27.000027 27.000027]fps [avfoundation @ 0x7fbf16808200] 640x480@[26.000026 26.000026]fps [avfoundation @ 0x7fbf16808200] 640x480@[25.000000 25.000000]fps ``` 日志告诉我们 *Selected framerate (29.970030) is not supported by the device* ,默认的framerate 不被设备支持,下面也给出了支持的分辨率和framerate 所以我们要改一下命令,选取第一个吧 *640x480@\[30.000030 30.000030\]fps* ``` ffmpeg -f avfoundation -video_size 640x480 -framerate 30 -i "FaceTime高清摄像头" out.mp4 ``` 把摄像头和麦克风的数据存到一个文件里 ``` ffmpeg -f avfoundation -video_size 640x480 -framerate 30 -video_device_index 0 -i ":0" out.mp4 //或者 ffmpeg -f avfoundation -video_size 640x480 -framerate 30 -i "0:0" out.mp4 ``` 播放录制的视频数据 ``` ffplay out.mp4 ``` ## 采集桌面 ``` ffmpeg -f avfoundation -i "Capture screen 0" -r:v 30 screen.mp4 //或者使用索引号1 来代替屏幕设备名称 ffmpeg -f avfoundation -i 1 -r:v 30 screen.mp4 ``` 播放采集到的桌面数据 ``` ffplay screen.mp4 ``` 参数"Capture screen 0"指定了输入设备,我们也可以将桌面图像带上鼠标一起录制下来,加上参数-capture_cursor ``` ffmpeg -f avfoundation -capture-cursor 1 -i "Capture screen 0" -r:v 30 screen.mp4 ``` 然后播放screen.mp4验证。`ffplay screen.mp4` # Windows ## 概述 FFmpeg Windows 设备操作 Windows 采集设备的主要方式是 dshow vfwcap gdigrab 其中 * **dshow 可以用来抓 取摄像头、采集卡、麦克风等**, * **vfwcap 主要用来采集摄像头类设备**, * **gdigrab 则是抓取 Windows 窗口程序** ## FFmpeg 使用 dshow 采集音视频设备 使用 dshow 枚举设备 ``` ffmpeg -f dshow -list_devices true -i dymmy ``` 输出 ``` [dshow @ 000002622302e340] DirectShow video devices (some may be both video and audio devices) [dshow @ 000002622302e340] "Altair USB2.0 Camera" [dshow @ 000002622302e340] Alternative name "@device_pnp_\\?\usb#vid_0ac8&pid_3450&mi_00#6&3b01315a&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global" [dshow @ 000002622302e340] DirectShow audio devices ``` ` ` 使用 dshow 展示摄像头, 摄像头的参数为 video="摄像头名称" ``` ffplay -f dshow -i video="Altair USB2.0 Camera" ``` ` ` 获得摄像头支持的分辨率 ``` ffmpeg -list_options true -f dshow -i video="Altair USB2.0 Camera" ``` 输出 ``` [dshow @ 000001b88b90e380] DirectShow video device options (from video devices) [dshow @ 000001b88b90e380] Pin "捕获" (alternative pin name "0") [dshow @ 000001b88b90e380] pixel_format=yuyv422 min s=640x480 fps=15 max s=640x480 fps=30 [dshow @ 000001b88b90e380] pixel_format=yuyv422 min s=640x480 fps=15 max s=640x480 fps=30 [dshow @ 000001b88b90e380] pixel_format=yuyv422 min s=352x288 fps=15 max s=352x288 fps=30 [dshow @ 000001b88b90e380] pixel_format=yuyv422 min s=352x288 fps=15 max s=352x288 fps=30 [dshow @ 000001b88b90e380] pixel_format=yuyv422 min s=320x240 fps=30 max s=320x240 fps=60.0002 [dshow @ 000001b88b90e380] pixel_format=yuyv422 min s=320x240 fps=30 max s=320x240 fps=60.0002 [dshow @ 000001b88b90e380] pixel_format=yuyv422 min s=176x144 fps=30 max s=176x144 fps=60.0002 [dshow @ 000001b88b90e380] pixel_format=yuyv422 min s=176x144 fps=30 max s=176x144 fps=60.0002 [dshow @ 000001b88b90e380] pixel_format=yuyv422 min s=160x120 fps=30 max s=160x120 fps=60.0002 [dshow @ 000001b88b90e380] pixel_format=yuyv422 min s=160x120 fps=30 max s=160x120 fps=60.0002 ``` 可以加上分辨率的参数 **-video_size** ``` ffplay -f dshow -video_size 640x480 -i video="Altair USB2.0 Camera" ``` ## FFmpeg 使用 vfwcap 采集视频设备 vfwcap 主要支持两个参数 video_size framerate ,分别指示采集图像的大小和帧率 使用 vfwcap 枚举支持采集的设备 ``` ffmpeg -f vfwcap -i list ``` 输出 ``` [vfwcap @ 0000025a6d60d080] Driver 0 [vfwcap @ 0000025a6d60d080] Microsoft WDM Image Capture (Win32) [vfwcap @ 0000025a6d60d080] Version: 10.0.17134.1 list: I/O error ``` 使用 vfwcap 生成 MP4 文件 ``` ffmpeg -f vfwcap -i 0 -r 25 -vcodec libx264 out.mp4 ``` 我们通过 -i 指定了待录像的摄像头 索引号,-r 则指定了 需要录像 的帧, -vcodec 指定了录像视频的编码格式,输出 out.mp4 ## FFmpeg 使用 gdigrab 采集窗口 Windows 平台, FFmpeg 支持采集基于 gdi 的屏幕采集设备,这个设备同时支持采 集显示器的某 块区域, gdigrab 支持的主要参数如表 7-5 所示 ![wQ5oqg.png](https://s1.ax1x.com/2020/09/08/wQ5oqg.png) gdigrab 的输入主要有两种方式: 1. desktop title = window_title ,其中 desktop 代表采 集整个桌面, 2. ttitle = window title 则是采集标题为 window title 的窗口 使用 gdigrab 采集整个桌面 ``` ffmpeg -f gdigrab -framerate 6 -i desktop screen.mp4 ``` 使用gdigrab采集某个窗口 ``` ffmpeg -f gdigrab -framerate 6 -i title="60.191.222.70 - @TTR-TEST: ~/DetectAV/src/LiveDetect - Xshell 6" gdi.mp4 ``` 该窗口是我用spy++抓的 ![w1PKVH.png](https://s1.ax1x.com/2020/09/09/w1PKVH.png)