1. 概述
本文档介绍由 libavdevice 库提供的输入和输出设备。
2. 设备选项
libavdevice 库提供与 libavformat 相同的接口。具体来说,输入设备被视为解复用器,输出设备被视为复用器,其接口和通用设备选项与 libavformat 提供的一致(详见 ffmpeg-formats 手册)。
此外,每个输入或输出设备可能支持所谓的私有选项,这些选项是该组件所特有的。
在 FFmpeg 工具中,可通过指定-option value来设置选项;也可在设备的AVFormatContext选项中显式设置值,或通过 libavutil/opt.h API 以编程方式设置。
3. 输入设备
输入设备是 FFmpeg 中配置的组件,用于获取连接到系统的多媒体设备所传输的数据。
配置 FFmpeg 构建时,所有受支持的输入设备默认启用。可使用配置选项--list-indevs列出所有可用的输入设备。
可使用配置选项--disable-indevs禁用所有输入设备,并通过选项--enable-indev=INDEV选择性启用某个输入设备,或使用--disable-indev=INDEV禁用特定输入设备。
ff 系列工具的-devices选项将显示支持的输入设备列表。
以下是当前可用输入设备的详细说明。
3.1 高级 Linux 声音架构(alsa)
高级 Linux 声音架构(ALSA)输入设备。
配置阶段要启用此输入设备,系统需安装 libasound 库。
该设备支持从 ALSA 设备捕获音频,待捕获设备的名称需为 ALSA 声卡标识符。
ALSA 标识符的语法为:
hw:CARD[,DEV[,SUBDEV]]
其中 DEV 和 SUBDEV 为可选组件。
三个参数(顺序为 CARD、DEV、SUBDEV)分别指定声卡编号或标识符、设备编号和子设备编号(-1 表示任意)。
要查看系统当前识别的声卡列表,可查看/proc/asound/cards和/proc/asound/devices文件。
例如,要使用ffmpeg从声卡 ID 为 0 的 ALSA 设备捕获音频,可执行以下命令:
ffmpeg -f alsa -i hw:0 alsaout.wav
更多信息请参见:http://www.alsa-project.org/alsa-doc/alsa-lib/pcm.html
3.1.1 选项
- sample_rate:设置采样率(单位为赫兹),默认值为 48000。
- channels:设置声道数,默认值为 2。
3.2 安卓摄像头(android_camera)
安卓摄像头输入设备。
该输入设备使用安卓 Camera2 NDK API,此 API 在 API 级别 24 及以上的设备上可用。android_camera 的可用性会在配置阶段自动检测。
该设备可从安卓设备上所有集成到 Camera2 NDK API 的摄像头捕获数据。
可用摄像头会在内部枚举,可通过camera_index参数选择,输入文件字符串会被忽略。
通常后置摄像头索引为 0,前置摄像头索引为 1。
3.2.1 选项
- video_size:设置视频尺寸,格式为字符串(如 640x480 或 hd720)。若请求的视频尺寸不可用或未指定,将回退到安卓设备上报的首个可用配置。
- framerate:设置视频帧率。若请求的帧率不可用或未指定(设为 - 1),将回退到安卓设备上报的首个可用配置。
- camera_index:设置要使用的摄像头索引,默认值为 0。
- input_queue_size:设置最大缓冲帧数,默认值为 5。
3.3 音视频基础框架(avfoundation)
AVFoundation 输入设备。
AVFoundation 是苹果推荐用于 OSX≥10.7 及 iOS 系统的流采集框架。
输入文件名需遵循以下语法:
-i "[[VIDEO]:[AUDIO]]"
第一个参数选择视频输入,第二个参数选择音频输入。需通过设备名称或设备索引(可从设备列表中查看)指定流。此外,可使用-video_device_index <INDEX>和 / 或-audio_device_index <INDEX>按索引选择视频和 / 或音频输入设备,此方式会覆盖输入文件名中指定的设备名称或索引。
设置-list_devices true可枚举所有可用设备,列出设备名称及对应的索引。
有两个设备名称别名:
default:选择对应类型的 AVFoundation 默认设备。none:不录制对应媒体类型,等效于指定空设备名称或索引。
3.3.1 选项
AVFoundation 支持以下选项:
- -list_devices <TRUE|FALSE>:设为 true 时,列出所有可用输入设备(含名称和索引)后退出。
- -video_device_index <INDEX>:按索引指定视频设备,覆盖输入文件名中的设置。
- -audio_device_index <INDEX>:按索引指定音频设备,覆盖输入文件名中的设置。
- -pixel_format <FORMAT>:请求视频设备使用特定像素格式。若指定格式不被支持,将列出可用格式并使用列表中的首个格式。可用像素格式包括
monob、rgb555be、rgb555le、rgb565be、rgb565le、rgb24、bgr24、
0rgb、bgr0、0bgr、rgb0、bgr48be、uyvy422、yuva444p、yuva444p16le、
yuv444p、yuv422p16、yuv422p10、yuv444p10、yuv420p、nv12、yuyv422、gray
- framerate:设置采集帧率,默认值为
ntsc,对应帧率为30000/1001。 - video_size:设置视频帧尺寸。
- capture_cursor:是否捕获鼠标指针,默认值为 0(不捕获)。
- capture_mouse_clicks:是否捕获鼠标点击操作,默认值为 0(不捕获)。
- capture_raw_data:是否捕获原始设备数据,默认值为 0。启用此选项可能会获取交付给 AVFoundation 框架的底层数据。例如,对于向框架发送原始 DV 数据的复合设备(如磁带式摄像机),设为 false 时仅会以指定像素格式捕获提取的视频帧;设为 true 时将获取未经处理的原始 DV 流。
3.3.2 示例
- 打印 AVFoundation 支持的设备列表并退出:
$ ffmpeg -f avfoundation -list_devices true -i ""
- 从视频设备 0 和音频设备 0 录制音视频并保存为 out.avi:
$ ffmpeg -f avfoundation -i "0:0" out.avi
- 从视频设备 2 和音频设备 1 录制音视频并保存为 out.avi:
$ ffmpeg -f avfoundation -video_device_index 2 -i ":1" out.avi
- 使用 bgr0 像素格式从系统默认视频设备录制视频(不录制音频)并保存为 out.avi:
$ ffmpeg -f avfoundation -pixel_format bgr0 -i "default:none" out.avi
- 从适配的输入设备捕获原始 DV 数据并写入 out.dv:
$ ffmpeg -f avfoundation -capture_raw_data true -i "zr100:none" out.dv
3.4 黑魔法采集卡(decklink)
decklink 输入设备为 Blackmagic DeckLink 设备提供采集能力。
要启用此输入设备,需安装 Blackmagic DeckLink SDK,并在配置时指定相应的--extra-cflags和--extra-ldflags。在 Windows 系统中,需通过widl处理 IDL 文件。
DeckLink 设备对支持的格式要求严格。可通过raw_format设置输入像素格式,需使用-list_formats 1确定设备支持的帧率和视频尺寸。音频采样率固定为 48kHz,声道数可选 2、8 或 16,且所有音频声道会合并为单个音频轨道。
3.4.1 选项
- list_devices:设为 true 时,打印设备列表后退出,默认值为 false。该选项已废弃,建议使用 ffmpeg 的
-sources选项列出可用输入设备。 - list_formats:设为 true 时,打印支持的格式列表后退出,默认值为 false。
- format_code <FourCC>:将输入视频格式设为 FourCC 指定的格式,可通过
list_formats查看设备支持的值。注意存在 3 字符格式pal,等效于 4 字符 FourCCpal。默认行为为若硬件支持则自动检测输入视频格式。 - raw_format:设置捕获视频的像素格式,可选值如下:
auto:默认值,使用自动检测格式时为 8 位 YUV 422 或 8 位 ARGB,否则为 8 位 YUV 422。uyvy422:8 位 YUV 422。yuv422p10:10 位 YUV 422。argb:8 位 RGB。bgra:8 位 RGB。rgb10:10 位 RGB。
- teletext_lines:设为非零值时,将从垂直辅助数据中额外捕获图文电视流,支持标清 PAL(576i)和高清(1080i 或 1080p)源。高清源将解码 OP47 数据包。该选项为标清 PAL VBI 行(6-22 行和 318-335 行)的位图掩码,第 6 行为掩码最低位。未包含图文电视信息的选定行将被忽略。可使用特殊值
all选择所有可能行,或standard跳过不兼容所有接收器的 6、318、319 行。标清源需 FFmpeg 编译时启用--enable-libzvbi;旧款(4K 之前)DeckLink 卡采集高清源时需设为 10 位模式。 - channels:定义要捕获的音频声道数,必须为 2、8 或 16,默认值为 2。
- duplex_mode:设置 decklink 设备的双工 / 配置文件模式,可选值为
unset、half、full、one_sub_device_full、one_sub_device_half、two_sub_device_full、four_sub_device_half,默认值为unset。注:DeckLink SDK 11.0 已将双工属性替换为配置文件属性。DeckLink Duo 2 和 DeckLink Quad 2 的配置文件由任意 2 个使用相同连接器的子设备共享;DeckLink 8K Pro 的配置文件由所有 4 个子设备共享,支持 4 种配置文件。DeckLink 8K Pro(DeckLink SDK≥11.0)的有效配置文件模式:one_sub_device_full、one_sub_device_half、two_sub_device_full、four_sub_device_half;DeckLink Quad 2 和 DeckLink Duo 2 的有效配置文件模式:half、full。 - timecode_format:设置要包含在帧和视频流元数据中的时间码类型,可选值为
none、rp188vitc、rp188vitc2、rp188ltc、rp188hfr、rp188any、vitc、vitc2、serial,默认值为none(不包含)。为适配 50/60fps 时间码,rp188any查询时间码类型的顺序为:帧率 > 30fps 时为 HFR、VITC1、VITC2、LTC,此顺序与 DeckLink API(HFR、VITC1、LTC、VITC2)略有不同。 - video_input:设置视频输入源,可选值为
unset、sdi、hdmi、optical_sdi、component、composite、s_video,默认值为unset。 - audio_input:设置音频输入源,可选值为
unset、embedded、aes_ebu、analog、analog_xlr、analog_rca、microphone,默认值为unset。 - video_pts:设置视频数据包时间戳来源,可选值为
video、audio、reference、wallclock、abs_wallclock,默认值为video。 - audio_pts:设置音频数据包时间戳来源,可选值为
video、audio、reference、wallclock、abs_wallclock,默认值为audio。 - draw_bars:信号丢失时是否绘制彩条,默认值为 true。该选项已废弃,建议使用
signal_loss_action选项。 - signal_loss_action:设置信号丢失时的操作,可选值如下:
none:信号丢失时不执行任何操作,通常会出现黑屏。bars:信号丢失时绘制彩条,仅支持 8 位输入信号。repeat:信号丢失时重复上一视频帧。默认值为bars。
- queue_size:设置最大输入缓冲区大小(单位为字节),缓冲区达到该值时将丢弃传入帧,默认值为 1073741824。
- audio_depth:设置音频采样位深,必须为 16 或 32,默认值为 16。
- decklink_copyts:设为 true 时,时间戳将按原始值传递,不消除初始偏移,默认值为 false。
- timestamp_align:采集开始时间对齐精度(单位为秒)。设为非零值时,将丢弃输入帧直至系统时间与配置值对齐,允许最大一帧时长的对齐误差。该选项适用于多台硬件设备部署实现 N 路冗余时的输入同步,使用前需通过 NTP 或 PTP 同步各设备系统时间。注:此方法并非绝对可靠,部分边界场景下可能因操作系统线程调度抖动导致同步偏差 1 帧,极端情况偏差达 timestamp_align 秒,默认值为 0。
- wait_for_tc(bool):是否丢弃帧直至接收到带时间码的帧。部分场景下串行时间码不会随首个输入帧传输,此时流时间码存储将不准确。设为 true 时需指定
timecode_format,默认值为 false。 - enable_klv(bool):设为 true 时,从 VANC 中提取 KLV 数据并输出 KLV 数据包,KLV VANC 数据包将基于 MID 和 PSC 字段合并为单个 KLV 数据包,默认值为 false。
3.4.2 示例
- 列出输入设备:
ffmpeg -sources decklink - 列出支持的格式:
ffmpeg -f decklink -list_formats 1 -i 'Intensity Pro' - 捕获 1080i50 格式视频片段:
ffmpeg -format_code Hi50 -f decklink -i 'Intensity Pro' -c:a copy -c:v copy output.avi - 捕获 10 位 1080i50 格式视频片段:
ffmpeg -raw_format yuv422p10 -format_code Hi50 -f decklink -i 'UltraStudio Mini Recorder' -c:a copy -c:v copy output.avi - 捕获 1080i50 格式且含 16 个音频声道的视频片段:
ffmpeg -channels 16 -format_code Hi50 -f decklink -i 'UltraStudio Mini Recorder' -c:a copy -c:v copy output.avi
3.5 直接显示(dshow)
Windows DirectShow 输入设备。
当 FFmpeg 基于 mingw-w64 项目构建时,将启用 DirectShow 支持,目前仅支持音频和视频设备。
可将多个设备作为独立输入打开,也可在同一输入中打开以提升设备间同步性。
输入名称需遵循以下格式:TYPE=NAME[:TYPE=NAME]其中 TYPE 可为 audio 或 video,NAME 为设备名称或别名。
3.5.1 选项
未指定选项时使用设备默认值,若设备不支持请求的选项将无法打开。
- video_size:设置捕获视频的尺寸。
- framerate:设置捕获视频的帧率。
- sample_rate:设置捕获音频的采样率(单位为赫兹)。
- sample_size:设置捕获音频的采样位深(单位为比特)。
- channels:设置捕获音频的声道数。
- list_devices:设为 true 时,打印设备列表后退出。
- list_options:设为 true 时,打印选定设备的选项列表后退出。
- video_device_number:为同名视频设备设置编号(从 0 开始,默认值为 0)。
- audio_device_number:为同名音频设备设置编号(从 0 开始,默认值为 0)。
- pixel_format:选择 DirectShow 使用的像素格式,仅在未设置视频编解码器或设为 rawvideo 时生效。
- audio_buffer_size:设置音频设备缓冲区大小(单位为毫秒,直接影响设备延迟),默认使用音频设备的默认缓冲区大小(通常为 500ms 的倍数)。值过小会降低性能,详见http://msdn.microsoft.com/en-us/library/windows/desktop/dd377582(v=vs.85).aspx。
- video_pin_name:按名称或别名选择视频捕获引脚。
- audio_pin_name:按名称或别名选择音频捕获引脚。
- crossbar_video_input_pin_number:为交叉开关设备选择视频输入引脚编号,该引脚将连接到交叉开关设备的视频解码器输出引脚。注:修改此值会影响后续调用(设为新默认值),直至系统重启。
- crossbar_audio_input_pin_number:为交叉开关设备选择音频输入引脚编号,该引脚将连接到交叉开关设备的音频解码器输出引脚。注:修改此值会影响后续调用(设为新默认值),直至系统重启。
- show_video_device_dialog:设为 true 时,采集开始前弹出对话框供用户手动修改视频滤镜属性和配置。注:对于交叉开关设备,有时需在此对话框中切换 PAL(25fps)和 NTSC(29.97fps)输入帧率、尺寸、隔行扫描等参数,以避免底部绿条、扫描线闪烁等问题,且部分设备修改后会作为新默认值生效至系统重启。
- show_audio_device_dialog:设为 true 时,采集开始前弹出对话框供用户手动修改音频滤镜属性和配置。
- show_video_crossbar_connection_dialog:设为 true 时,打开视频设备前弹出对话框供用户手动修改交叉开关引脚路由。
- show_audio_crossbar_connection_dialog:设为 true 时,打开音频设备前弹出对话框供用户手动修改交叉开关引脚路由。
- show_analog_tv_tuner_dialog:设为 true 时,采集开始前弹出对话框供用户手动修改电视频道和频率。
- show_analog_tv_tuner_audio_dialog:设为 true 时,采集开始前弹出对话框供用户手动修改电视音频(如单声道 / 立体声、语言 A/B/C)。
- audio_device_load:从文件加载音频捕获滤镜设备而非按名称搜索,若滤镜支持属性序列化还可加载额外参数。使用时需指定音频捕获源(可为任意虚拟源)。
- audio_device_save:将当前使用的音频捕获滤镜设备及其参数(若滤镜支持)保存到文件,同名文件将被覆盖。
- video_device_load:从文件加载视频捕获滤镜设备而非按名称搜索,若滤镜支持属性序列化还可加载额外参数。使用时需指定视频捕获源(可为任意虚拟源)。
- video_device_save:将当前使用的视频捕获滤镜设备及其参数(若滤镜支持)保存到文件,同名文件将被覆盖。
- use_video_device_timestamps:设为 false 时,视频帧时间戳将基于系统时钟而非捕获设备提供的时间戳,用于解决设备时间戳不可靠的问题。
3.5.2 示例
- 打印 DirectShow 支持的设备列表并退出:
$ ffmpeg -list_devices true -f dshow -i dummy - 打开名为 Camera 的视频设备:
$ ffmpeg -f dshow -i video="Camera" - 打开第二个名为 Camera 的视频设备:
$ ffmpeg -f dshow -video_device_number 1 -i video="Camera" - 打开视频设备 Camera 和音频设备 Microphone:
$ ffmpeg -f dshow -i video="Camera":audio="Microphone" - 打印选定设备支持的选项列表并退出:
$ ffmpeg -list_options true -f dshow -i video="Camera" - 按名称 / 别名指定捕获引脚,同时指定设备别名:
$ ffmpeg -f dshow -audio_pin_name "Audio Out" -video_pin_name 2 -i video=video="@device_pnp_\\?\pci#ven_1a0a&dev_6200&subsys_62021461&rev_01#4&e2c7dd6&0&00e1#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\{ca465100-deb0-4d59-818f-8c477184adf6}":audio="Microphone" - 配置交叉开关设备,指定交叉开关引脚,并允许用户在启动时调整视频捕获属性:
$ ffmpeg -f dshow -show_video_device_dialog true -crossbar_video_input_pin_number 0 -crossbar_audio_input_pin_number 3 -i video="AVerMedia BDA Analog Capture":audio="AVerMedia BDA Analog Capture"
3.6 Linux 帧缓冲(fbdev)
Linux 帧缓冲输入设备。
Linux 帧缓冲是独立于图形硬件的抽象层,用于在计算机显示器(通常为控制台)上显示图形,可通过文件设备节点(通常为 /dev/fb0)访问。
更多详细信息可查阅 Linux 源码树中的 Documentation/fb/framebuffer.txt 文件,也可参考http://linux-fbdev.sourceforge.net/和 fbset (1) 手册。
使用ffmpeg从帧缓冲设备 /dev/fb0 录制视频:ffmpeg -f fbdev -framerate 10 -i /dev/fb0 out.avi
使用以下命令截取单张屏幕截图:ffmpeg -f fbdev -framerate 1 -i /dev/fb0 -frames:v 1 screenshot.jpeg
3.6.1 选项
- framerate:设置帧率,默认值为 25。
3.7 Windows 图形设备接口采集(gdigrab)
基于 Win32 GDI 的屏幕捕获设备。
该设备可在 Windows 系统上捕获显示器的指定区域。
输入文件名支持以下格式:
desktop(捕获整个桌面)title=window_title(捕获指定标题的窗口)hwnd=window_hwnd(捕获指定句柄的窗口)
例如,使用ffmpeg捕获整个桌面:ffmpeg -f gdigrab -framerate 6 -i desktop out.mpg
捕获位于坐标 (10,20) 的 640x480 区域:ffmpeg -f gdigrab -framerate 6 -offset_x 10 -offset_y 20 -video_size vga -i desktop out.mpg
捕获名为 “Calculator” 的窗口内容:ffmpeg -f gdigrab -framerate 6 -i title=Calculator out.mpg
3.7.1 选项
- draw_mouse:是否绘制鼠标指针,值为 0 时不绘制,默认值为 1。
- framerate:设置捕获帧率,默认值为
ntsc,对应帧率为30000/1001。 - show_region:是否在屏幕上显示捕获区域。设为 1 时将标记捕获区域,便于确认局部捕获范围,该选项与单窗口捕获不兼容。示例:
ffmpeg -f gdigrab -show_region 1 -framerate 6 -video_size cif -offset_x 10 -offset_y 20 -i desktop out.mpg - video_size:设置视频帧尺寸,选择 desktop 时默认捕获全屏,选择 title=window_title 时默认捕获窗口完整尺寸。
- offset_x:捕获指定尺寸区域时,设置相对于屏幕 / 桌面左边缘的偏移量。注:Windows 系统中偏移量以主显示器左上角为原点,若主显示器左侧有其他显示器,需设为负值以捕获该显示器区域。
- offset_y:捕获指定尺寸区域时,设置相对于屏幕 / 桌面顶部边缘的偏移量。注:Windows 系统中偏移量以主显示器左上角为原点,若主显示器上方有其他显示器,需设为负值以捕获该显示器区域。
3.8 火线接口(iec61883)
基于 libiec61883 的 FireWire DV/HDV 输入设备。
要启用此输入设备,系统需安装 libiec61883、libraw1394 和 libavc1394,并在配置时添加--enable-libiec61883选项。
iec61883 捕获设备支持通过 IEEE1394(FireWire)从视频设备捕获数据,使用 libiec61883 和新版 Linux FireWire 栈(juju)。自 Linux 内核 2.6.37 起,该设备为默认的 DV/HDV 输入方式(旧 FireWire 栈已移除)。
需指定要使用的 FireWire 端口作为输入文件,或设为auto自动选择首个已连接端口。
3.8.1 选项
- dvtype:覆盖 DV/HDV 自动检测,仅在自动检测失效或需禁用特定设备类型时使用。将 DV 设备设为 HDV(反之亦然)会导致未定义行为,支持值为
auto、dv、hdv。 - dvbuffer:设置输入数据缓冲区的最大帧数。DV 格式下为精确值,HDV 格式下因无固定帧大小故非精确值。
- dvguid:通过 GUID 选择捕获设备,仅从指定 GUID 的设备捕获,多设备连接时可用于精准选择。可在
/sys/bus/firewire/devices路径下查看设备 GUID。
3.8.2 示例
- 捕获并播放 FireWire DV/HDV 设备的输入流:
ffplay -f iec61883 -i auto - 捕获 FireWire DV/HDV 设备输入流并录制,HDV 源的数据包缓冲区设为 100000:
ffmpeg -f iec61883 -i auto -dvbuffer 100000 out.mpg
3.9 专业音频连接工具(jack)
JACK 输入设备。
配置阶段要启用此输入设备,系统需安装 libjack 库。
JACK 输入设备会为每个音频声道创建一个 JACK 可写客户端,命名格式为client_name:input_N(client_name 为应用程序指定名称,N 为声道编号),每个可写客户端将获取的数据发送至 FFmpeg 输入设备。
创建 JACK 可读客户端后,需将其连接到 JACK 可写客户端,可通过jack_connect/jack_disconnect命令或图形界面(如 qjackctl)完成连接,使用jack_lsp命令可列出 JACK 客户端及其属性。
以下为使用ffmpeg捕获 JACK 可读客户端的示例:
- 创建名为 “ffmpeg” 的 JACK 可写客户端:
$ ffmpeg -f jack -i ffmpeg -y out.wav - 启动 jack_metro 可读客户端示例:
$ jack_metro -b 120 -d 0.2 -f 4000 - 列出当前 JACK 客户端:
$ jack_lsp -c输出示例:
plaintext
system:capture_1
system:capture_2
system:playback_1
system:playback_2
ffmpeg:input_1
metro:120_bpm
- 将 metro 客户端连接到 ffmpeg 可写客户端:
$ jack_connect metro:120_bpm ffmpeg:input_1
更多信息请参见:http://jackaudio.org/
3.9.1 选项
- channels:设置声道数,默认值为 2。
3.10 内核模式设置采集(kmsgrab)
KMS 视频输入设备。
该设备可捕获与指定 CRTC 或平面关联的 KMS 扫描输出帧缓冲(作为 DRM 对象),并传递至其他硬件功能。
运行时需具备 DRM 主权限或 CAP_SYS_ADMIN 权限。
若不了解上述概念,建议使用 x11grab 设备替代。
3.10.1 选项
- device:设置要捕获的 DRM 设备,默认值为
/dev/dri/card0。 - format:设置帧缓冲的像素格式,Linux 5.7 及以上版本可自动检测,低版本需手动指定,默认值为
bgr0(Linux 控制台和 Xorg X 服务器常用格式)。 - format_modifier:设置输出帧的格式修饰符,部分 API 需此参数才能正确导入。Linux 5.7 及以上版本可自动检测,低版本需按需显式指定,取值可参考 libdrm 文档。
- crtc_id:设置捕获源的 KMS CRTC ID,将使用指定 CRTC 上的首个活动平面。
- plane_id:设置捕获源的 KMS 平面 ID,若未指定 crtc_id 和 plane_id,默认使用首个活动平面。
- framerate:设置捕获帧率,该帧率不与页面翻转或帧缓冲更新同步,仅定义采样间隔,采样速率高于帧缓冲更新速率时会生成内容相同的独立帧,默认值为 30。
3.10.2 示例
- 从首个活动平面捕获,将结果下载为普通帧并编码(仅适用于线性且可映射的帧缓冲,否则可能出现画面错乱或下载失败):
ffmpeg -f kmsgrab -i - -vf 'hwdownload,format=bgr0' output.mp4 - 从 CRTC ID 42 以 60fps 捕获,将结果映射至 VAAPI 并转换为 NV12 格式,编码为 H.264:
ffmpeg -crtc_id 42 -framerate 60 -f kmsgrab -i - -vf 'hwmap=derive_device=vaapi,scale_vaapi=w=1920:h=1080:format=nv12' -c:v h264_vaapi output.mp4 - 仅捕获平面的指定区域(如 1920x1080 平面的中间四分之一区域)并编码:
ffmpeg -f kmsgrab -i - -vf 'hwmap=derive_device=vaapi,crop=960:540:480:270,scale_vaapi=960:540:nv12' -c:v h264_vaapi output.mp4
3.11 滤镜输入虚拟设备(lavfi)
libavfilter 输入虚拟设备。
该输入设备从 libavfilter 滤镜图的开放输出端读取数据,滤镜图的每个开放输出端对应一个输入流。
3.11.1 选项
- graph:指定作为输入的滤镜图。每个视频开放输出端需用唯一标签(格式为
outN,N 从 0 开始,对应设备生成的输入流)标记,首个未标记输出端自动分配out0标签,其余需显式标记。标签可追加+subcc后缀以创建额外的隐藏字幕流(实验性功能,目前仅支持 EIA-608/CEA-708 格式),字幕流在普通流之后按对应流顺序创建。例如,存在out19+subcc和out7+subcc(最大标签为 out42)时,流 43 为流 7 的字幕流,流 44 为流 19 的字幕流。未指定时默认使用输入设备的文件名作为滤镜图。 - graph_file:设置要读取的滤镜图文件名,其语法与
graph选项一致。 - dumpgraph:将滤镜图转储至标准错误输出。
3.11.2 示例
- 创建粉色纯色视频流并使用 ffplay 播放:
ffplay -f lavfi -graph "color=c=pink [out0]" dummy - 与上例功能相同,但通过文件名指定滤镜图且省略 out0 标签:
ffplay -f lavfi color=c=pink - 创建三个不同的视频测试源并播放:
ffplay -f lavfi -graph "testsrc [out0]; testsrc,hflip [out1]; testsrc,negate [out2]" test3 - 通过 amovie 源从文件读取音频流并使用 ffplay 播放:
ffplay -f lavfi "amovie=test.wav" - 读取音视频流并使用 ffplay 播放:
ffplay -f lavfi "movie=test.avi[out0];amovie=test.wav[out1]" - 将解码帧保存为图片,同时将隐藏字幕保存为 RCWT 备份文件:
ffmpeg -f lavfi -i "movie=test.ts[out0+subcc]" -map v frame%08d.png -map s -c copy -f rcwt subcc.bin
3.11 光盘读取(libcdio)
基于 libcdio 的音频 CD 输入设备。
配置阶段要启用此输入设备,系统需安装 libcdio 库,并添加--enable-libcdio配置选项。
该设备支持播放和抓取音频 CD 数据。
例如,使用ffmpeg复制 /dev/sr0 中整张音频 CD 的内容:ffmpeg -f libcdio -i /dev/sr0 cd.wav
3.12.1 选项
- speed:设置光驱读取速度,单位为 CD-ROM 倍速,默认值为 0。该速度通过 libcdio 的
cdio_cddap_speed_set函数设置,多数光驱若指定值过大将自动使用最大速度。 - paranoia_mode:设置数据恢复模式标志,可选值为
disable、verify、overlap、neverskip、full,默认值为disable。恢复模式详情可参考 paranoia 项目文档。
3.13 1394 工业相机(libdc1394)
基于 libdc1394 和 libraw1394 的 IIDC1394 输入设备,需添加--enable-libdc1394配置选项。
3.13.1 选项
- framerate:设置帧率,默认值为
ntsc,对应帧率为30000/1001。 - pixel_format:选择像素格式,默认值为
uyvy422。 - video_size:设置视频尺寸,格式为字符串(如 640x480 或 hd720),默认值为
qvga。
3.14 开放音频库(openal)
OpenAL 输入设备支持在所有实现 OpenAL 1.1 的系统上进行音频捕获。
配置阶段要启用此输入设备,系统需安装 OpenAL 头文件和库,并添加--enable-openal配置选项。OpenAL 头文件和库通常随 OpenAL 实现提供,也可单独下载 SDK,部分场景下需通过--extra-cflags和--extra-ldflags指定路径。
常见 OpenAL 实现包括:
- Creative:官方 Windows 实现,支持硬件加速(适配设备)和软件回退,详见http://openal.org/。
- OpenAL Soft:开源可移植软件实现(LGPL 协议),支持 Windows、Linux、Solaris、BSD 等系统的主流音频 API,详见http://kcat.strangesoft.net/openal.html。
- Apple:OpenAL 集成于 Core Audio(Mac OS X 官方音频接口),详见http://developer.apple.com/technologies/mac/audio-and-video.html。
该设备可从 OpenAL 管理的音频输入设备捕获数据,需在文件名中指定设备名称,空字符串表示自动选择默认设备,可通过list_devices选项列出支持的设备。
3.14.1 选项
- channels:设置捕获音频的声道数,仅支持 1(单声道)和 2(立体声),默认值为 2。
- sample_size:设置捕获音频的采样位深,仅支持 8 和 16,默认值为 16。
- sample_rate:设置捕获音频的采样率(单位为赫兹),默认值为 44.1k。
- list_devices:设为 true 时,打印设备列表后退出,默认值为 false。
3.14.2 示例
- 打印 OpenAL 支持的设备列表并退出:
$ ffmpeg -list_devices true -f openal -i dummy out.ogg - 从基于 PulseAudio 的 DR-BT101 设备捕获音频并保存为 out.ogg:
$ ffmpeg -f openal -i 'DR-BT101 via PulseAudio' out.ogg - 从默认设备捕获音频(文件名设为空字符串):
$ ffmpeg -f openal -i '' out.ogg - 同时从两个设备捕获音频并写入不同文件(需 OpenAL 实现支持多设备同时捕获,建议使用新版 OpenAL Soft):
$ ffmpeg -f openal -i 'DR-BT101 via PulseAudio' out1.ogg -f openal -i 'ALSA Default' out2.ogg
3.15 开放声音系统(oss)
开放声音系统(OSS)输入设备。
输入设备的文件名需为 OSS 输入设备的设备节点,通常为 /dev/dsp。
例如,使用ffmpeg从 /dev/dsp 抓取音频:ffmpeg -f oss -i /dev/dsp /tmp/oss.wav
更多 OSS 相关信息请参见:http://manuals.opensound.com/usersguide/dsp.html
3.15.1 选项
- sample_rate:设置采样率(单位为赫兹),默认值为 48000。
- channels:设置声道数,默认值为 2。
3.16 脉冲音频(pulse)
PulseAudio 输入设备,需添加--enable-libpulse配置选项以启用。
输入设备的文件名需为源设备名称或字符串default,可通过pactl list sources命令列出 PulseAudio 源设备及其属性。
更多 PulseAudio 信息请参见:http://www.pulseaudio.org
3.16.1 选项
- server:连接到指定 IP 地址的 PulseAudio 服务器,未指定时使用默认服务器。
- name:设置 PulseAudio 显示的应用名称,默认值为
LIBAVFORMAT_IDENT字符串。 - stream_name:设置 PulseAudio 显示的流名称,默认值为
record。 - sample_rate:设置采样率(单位为赫兹),默认值为 48kHz。
- channels:设置声道数,默认值为 2(立体声)。
- frame_size:该选项已废弃,无实际功能。
- fragment_size:设置 PulseAudio 最小缓冲片段的字节大小,影响音频延迟,默认值为 50ms 对应的数据量。
- wallclock:使用当前时间设置初始 PTS,默认值为 1。
3.16.2 示例
从默认设备录制音频流并保存为 /tmp/pulse.wav:ffmpeg -f pulse -i default /tmp/pulse.wav
3.17 简易音频输入输出(sndio)
sndio 输入设备,配置阶段需安装 libsndio 库以启用。
输入设备的文件名需为 sndio 输入设备的设备节点,通常为 /dev/audio0。
例如,使用ffmpeg从 /dev/audio0 抓取音频:ffmpeg -f sndio -i /dev/audio0 /tmp/oss.wav
3.17.1 选项
- sample_rate:设置采样率(单位为赫兹),默认值为 48000。
- channels:设置声道数,默认值为 2。
3.18 视频 4Linux2(video4linux2,v4l2)
Video4Linux2 输入视频设备,v4l2可作为video4linux2的别名。
若 FFmpeg 编译时启用 v4l-utils 支持(添加--enable-libv4l2配置选项),可通过-use_libv4l2输入设备选项启用该功能。
待捕获设备的名称为文件设备节点,Linux 系统通常会在设备(如 USB 摄像头)接入时自动创建,格式为/dev/videoN(N 为设备编号)。
Video4Linux2 设备通常仅支持有限的分辨率和帧率,可通过-list_formats all查看支持的格式;部分设备(如电视卡)支持多种标准,可通过-list_standards all列出支持的标准。
时间戳的时基为 1 微秒,其来源取决于内核版本和配置(可为实时时钟,原点为 Unix 纪元;也可为单调时钟,原点通常为系统启动时间,不受 NTP 或手动时钟调整影响),可通过-timestamps abs或-ts abs选项强制转换为实时时钟。
3.18.1 选项
- standard:设置视频标准,需为支持的标准名称,可通过
list_standards选项获取支持的标准列表。 - channel:设置输入通道编号,默认值为 - 1(使用之前选择的通道)。
- video_size:设置视频帧尺寸,参数为
WIDTHxHEIGHT格式的字符串或有效的尺寸缩写。 - pixel_format:选择像素格式(仅对原始视频输入有效)。
- input_format:设置首选像素格式(原始视频)或编解码器名称,用于多格式可选时指定输入格式。
- framerate:设置首选视频帧率。
- list_formats:列出可用格式(支持的像素格式、编解码器和帧尺寸)后退出,可选值为
all(显示所有格式)、raw(仅显示原始视频格式)、compressed(仅显示压缩格式)。 - list_standards:列出支持的标准后退出,可选值为
all(显示所有支持的标准)。 - timestamps, ts:设置捕获帧的时间戳类型,可选值为
default(使用内核时间戳)、abs(使用绝对时间戳 / 系统时钟)、mono2abs(强制从单调时间戳转换为绝对时间戳),默认值为default。 - use_libv4l2:是否使用 libv4l2(v4l-utils)转换函数,默认值为 0。
3.19 视窗视频捕获(vfwcap)
VfW(Video for Windows)捕获输入设备。
输入文件名需为捕获驱动编号(0-9),设为list时打印驱动列表后退出,其他非编号文件名均视为设备编号 0。
3.19.1 选项
- video_size:设置视频帧尺寸。
- framerate:设置捕获帧率,默认值为
ntsc,对应帧率为30000/1001。
3.20 X11 窗口采集(x11grab)
X11 视频输入设备,配置阶段需安装 libxcb 库(会自动检测)。
该设备可捕获 X11 显示器的指定区域,输入文件名语法为:[hostname]:display_number.screen_number[+x_offset,y_offset]
hostname:display_number.screen_number指定要捕获的 X11 显示器名称,hostname 可省略(默认localhost),环境变量DISPLAY存储默认显示器名称;x_offset和y_offset指定捕获区域相对于 X11 屏幕左上角的偏移量,默认值为 0。
可使用xdpyinfo工具获取 X11 显示器的基本属性(如名称、分辨率),详细信息可参考 X11 文档(如man X)。
例如,使用ffmpeg从:0.0 显示器捕获视频:ffmpeg -f x11grab -framerate 25 -video_size cif -i :0.0 out.mpg
从:0.0 显示器的 (10,20) 偏移处捕获视频:ffmpeg -f x11grab -framerate 25 -video_size cif -i :0.0+10,20 out.mpg
3.20.1 选项
- select_region:是否通过指针图形化选择捕获区域。设为 1 时,提示用户通过点击和拖拽选择区域(仅点击不拖拽时捕获全屏,区域宽高为 0 时也捕获全屏),该选项会覆盖
video_size、grab_x和grab_y,默认值为 0。 - draw_mouse:是否绘制鼠标指针,值为 0 时不绘制,默认值为 1。
- follow_mouse:是否让捕获区域跟随鼠标,参数可为
centered(捕获区域随鼠标移动且指针保持在区域中心)或像素值 PIXELS(仅当鼠标指针距离区域边缘小于 PIXELS 时跟随)。示例 1:ffmpeg -f x11grab -follow_mouse centered -framerate 25 -video_size cif -i :0.0 out.mpg示例 2(鼠标距离边缘 100 像素内时跟随):ffmpeg -f x11grab -follow_mouse 100 -framerate 25 -video_size cif -i :0.0 out.mpg - framerate:设置捕获帧率,默认值为
ntsc,对应帧率为30000/1001。 - show_region:是否在屏幕上显示捕获区域,设为 1 时标记区域便于确认范围,示例:
ffmpeg -f x11grab -show_region 1 -framerate 25 -video_size cif -i :0.0+10,20 out.mpg(结合 follow_mouse 的示例:ffmpeg -f x11grab -follow_mouse centered -show_region 1 -framerate 25 -video_size cif -i :0.0 out.mpg)。 - region_border:启用
-show_region 1时设置区域边框厚度,取值范围 1-128,默认值为 3(仅基于 XCB 的 x11grab 有效)。 - window_id:设置要捕获的窗口 ID,默认值为 0(捕获全屏 / 根窗口),可通过
xwininfo工具(结合-tree和-root选项)获取窗口 ID。注:窗口放大后新增区域不会被录制,窗口关闭、最小化或缩小至视频尺寸以下时录制终止,该选项会禁用follow_mouse和select_region。 - video_size:设置视频帧尺寸,默认值为桌面或窗口的完整尺寸。
- grab_x、grab_y:设置捕获区域的坐标(相对于 X11 窗口左上角,对应设备名称中的 x_offset 和 y_offset),默认值均为 0。
4. 输出设备
输出设备是 FFmpeg 中配置的组件,用于将多媒体数据写入连接到系统的输出设备。
配置 FFmpeg 构建时,所有受支持的输出设备默认启用,可通过--list-outdevs配置选项列出所有可用输出设备;可通过--disable-outdevs禁用所有输出设备,并使用--enable-outdev=OUTDEV选择性启用,或--disable-outdev=OUTDEV禁用特定设备。
ff 系列工具的-devices选项将显示启用的输出设备列表。
以下是当前可用输出设备的详细说明。
4.1 高级 Linux 声音架构(alsa)
ALSA(Advanced Linux Sound Architecture)输出设备。
4.1.1 示例
- 在默认 ALSA 设备播放文件:
ffmpeg -i INPUT -f alsa default - 在声卡 1 的音频设备 7 播放文件:
ffmpeg -i INPUT -f alsa hw:1,7
4.2 音频工具箱(AudioToolbox)
该设备支持在 OSX 系统上通过 CoreAudio 设备进行原生音频输出。
输出文件名可为空(或-,表示默认系统输出设备),也可为设备索引(可通过-list_devices true查看);也可通过-audio_device_index <INDEX>按索引选择音频设备(覆盖文件名中的设置)。
设置-list_devices true可枚举所有可用设备,列出设备名称、UID 及对应索引。
4.2.1 选项
- -audio_device_index <INDEX>:按索引指定音频设备,覆盖输出文件名中的设置。
4.2.2 示例
- 打印支持的设备列表并向默认设备输出正弦波:
$ ffmpeg -f lavfi -i sine=r=44100 -f audiotoolbox -list_devices true - - 向索引为 2 的设备输出正弦波(覆盖输出文件名):
$ ffmpeg -f lavfi -i sine=r=44100 -f audiotoolbox -audio_device_index 2 -
4.3 彩色字符显示(caca)
该设备可在 CACA 窗口中显示视频流,每个应用程序仅允许一个 CACA 窗口,即仅可实例化一个该输出设备。
需添加--enable-libcaca配置选项以启用,libcaca 是将视频转换为字符显示的图形库。
4.3.1 选项
- window_title:设置 CACA 窗口标题,未指定时默认使用输出设备的文件名。
- window_size:设置 CACA 窗口尺寸,格式为
widthxheight字符串或视频尺寸缩写,未指定时默认与输入视频尺寸一致。 - driver:设置显示驱动。
- algorithm:设置抖动算法(因渲染图像颜色数通常远多于可用调色板,需启用抖动),可用值通过
-list_dither algorithms查看。 - antialias:设置抗锯齿方式(平滑渲染图像,避免锯齿效果),可用值通过
-list_dither antialiases查看。 - charset:设置渲染字符集,可用值通过
-list_dither charsets查看。 - color:设置渲染颜色,可用值通过
-list_dither colors查看。 - list_drivers:设为 true 时,打印可用驱动列表后退出。
- list_dither:列出指定类型的抖动选项,参数需为
algorithms、antialiases、charsets、colors之一。
4.3.2 示例
- 在 CACA 窗口显示 ffmpeg 输出,强制窗口尺寸为 80x25:
ffmpeg -i INPUT -c:v rawvideo -pix_fmt rgb24 -window_size 80x25 -f caca -
- 列出可用驱动并退出:
ffmpeg -i INPUT -pix_fmt rgb24 -f caca -list_drivers true -
- 列出可用抖动颜色并退出:
ffmpeg -i INPUT -pix_fmt rgb24 -f caca -list_dither colors -
4.4 黑魔法输出卡(decklink)
decklink 输出设备为 Blackmagic DeckLink 设备提供播放能力。
启用该设备需安装 Blackmagic DeckLink SDK,并在配置时指定--extra-cflags和--extra-ldflags;Windows 系统需通过widl处理 IDL 文件。
DeckLink 设备对格式要求严格,像素格式固定为 uyvy422,需通过-list_formats 1确定支持的帧率、场序和视频尺寸,音频采样率固定为 48kHz。
4.4.1 选项
- list_devices:设为 true 时打印设备列表后退出,默认值为 false,该选项已废弃,建议使用 ffmpeg 的
-sinks选项列出可用输出设备。 - list_formats:设为 true 时打印支持的格式列表后退出,默认值为 false。
- preroll:设置视频预滚动时间(单位为秒),默认值为 0.5。
- duplex_mode:设置设备双工 / 配置文件模式,可选值与输入设备 decklink 一致,默认值为
unset,具体规则参考 3.5.1 节的 duplex_mode 说明。 - timing_offset:设置输出的同步锁相时序像素偏移,默认值为
unset。 - link:设置输出的 SDI 视频链路配置,可选值为
unset、single、dual、quad,默认值为unset。 - sqd:为四链路 SDI 输出启用方形分割四画面模式,可选值为
unset、true、false,默认值为unset。 - level_a:在输出端启用 SMPTE Level A 模式,可选值为
unset、true、false,默认值为unset。 - vanc_queue_size:设置 VANC 数据的最大输出缓冲区大小(单位为字节),缓冲区满时将丢弃输出 VANC 数据,默认值为 1048576。
4.4.2 示例
- 列出输出设备:
ffmpeg -sinks decklink
- 列出支持的格式:
ffmpeg -i test.avi -f decklink -list_formats 1 'DeckLink Mini Monitor'
- 播放视频片段:
ffmpeg -i test.avi -f decklink -pix_fmt uyvy422 'DeckLink Mini Monitor'
- 播放非标准帧率 / 尺寸的视频片段:
ffmpeg -i test.avi -f decklink -pix_fmt uyvy422 -s 720x486 -r 24000/1001 'DeckLink Mini Monitor'
4.5 Linux 帧缓冲输出(fbdev)
Linux 帧缓冲输出设备,其概念和访问方式与输入设备 fbdev 一致,可参考 3.7 节。
4.5.1 选项
- xoffset、yoffset:设置输出区域左上角的 x/y 坐标,默认值为 0。
4.5.2 示例
在帧缓冲设备 /dev/fb0 播放文件(需根据当前帧缓冲设置选择匹配的像素格式):
ffmpeg -re -i INPUT -c:v rawvideo -pix_fmt bgra -f fbdev /dev/fb0
参考 http://linux-fbdev.sourceforge.net/, and fbset(1).
4.6 开放声音系统输出(oss)
OSS(Open Sound System)输出设备
4.7 脉冲音频输出(pulse)
PulseAudio 输出设备,需添加--enable-libpulse配置选项以启用。
4.7.1 选项
- server:连接到指定 IP 地址的 PulseAudio 服务器,未指定时使用默认服务器。
- name:设置 PulseAudio 显示的应用名称,默认值为
LIBAVFORMAT_IDENT字符串。 - stream_name:设置 PulseAudio 显示的流名称,默认值为指定的输出名称。
- device:设置要使用的输出设备,未指定时使用默认设备,可通过
pactl list sinks命令获取输出设备列表。 - buffer_size、buffer_duration:控制 PulseAudio 缓冲区的大小和时长,小缓冲区可提升控制精度但需更频繁更新。
buffer_size为字节数,buffer_duration为毫秒数;同时指定时取较大值(时长会按流参数转换为字节数);均设为 0 时使用 PulseAudio 默认时长(约 2 秒)。 - prebuf:设置预缓冲字节数,服务器在缓冲区至少有 prebuf 字节数据前不会开始播放,默认值与 buffer_size 或 buffer_duration 的较大值一致。
- minreq:设置最小请求字节数,服务器不会向客户端请求小于该值的数据,而是等待缓冲区空闲后批量请求,建议不手动设置(由服务器自动分配合理值)。
4.7.2 示例
在默认服务器的默认设备上播放文件(流名称为 “stream name”):
ffmpeg -i INPUT -f pulse "stream name"
4.8 简易音频输入输出输出(sndio)
sndio 音频输出设备,功能和使用方式与输入设备 sndio 对应。
4.9 视频 4Linux2 输出(v4l2)
Video4Linux2 输出设备,功能和使用方式与输入设备 v4l2 对应。
4.10 X 视频扩展(xv)
该设备可在 X Window System 窗口中显示视频流。
4.10.1 选项
- display_name:指定硬件显示器名称,决定使用的显示器和通信域,格式为
hostname[:number[.screen_number]](hostname 为显示器所在主机名,number 为显示服务器编号,screen_number 为屏幕编号),未指定时默认使用环境变量 DISPLAY 的值。示例:dual-headed:0.1表示主机 dual-headed 上显示 0 的屏幕 1,详细格式可参考 X11 规范。 - window_id:设为非零值时,不创建新窗口,而是使用指定 ID 的现有窗口,默认值为 0(创建新窗口)。
- window_size:设置新建窗口的尺寸,格式为
widthxheight字符串或视频尺寸缩写,未指定时默认与输入视频尺寸一致,window_id非零时该选项失效。 - window_x、window_y:设置新建窗口的偏移量,默认值均为 0(可能被窗口管理器忽略),
window_id非零时该选项失效。 - window_title:设置新建窗口的标题,未指定时默认使用输出设备的文件名,
window_id非零时该选项失效。
更多关于 XVideo 信息参考:
4.10.2 示例
- 使用 ffmpeg 同时解码、显示并编码视频输入:
ffmpeg -i INPUT OUTPUT -f xv display
- 将输入视频解码并显示到多个 X11 窗口(正常窗口和反色窗口):
ffmpeg -i INPUT -f xv normal -vf negate -f xv negated

3194

被折叠的 条评论
为什么被折叠?



