FFmpeg Devices Documentation

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:设置信号丢失时的操作,可选值如下:
    1. none:信号丢失时不执行任何操作,通常会出现黑屏。
    2. bars:信号丢失时绘制彩条,仅支持 8 位输入信号。
    3. 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 示例
  1. 列出输入设备:ffmpeg -sources decklink
  2. 列出支持的格式:ffmpeg -f decklink -list_formats 1 -i 'Intensity Pro'
  3. 捕获 1080i50 格式视频片段:ffmpeg -format_code Hi50 -f decklink -i 'Intensity Pro' -c:a copy -c:v copy output.avi
  4. 捕获 10 位 1080i50 格式视频片段:ffmpeg -raw_format yuv422p10 -format_code Hi50 -f decklink -i 'UltraStudio Mini Recorder' -c:a copy -c:v copy output.avi
  5. 捕获 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 示例
  1. 打印 DirectShow 支持的设备列表并退出:$ ffmpeg -list_devices true -f dshow -i dummy
  2. 打开名为 Camera 的视频设备:$ ffmpeg -f dshow -i video="Camera"
  3. 打开第二个名为 Camera 的视频设备:$ ffmpeg -f dshow -video_device_number 1 -i video="Camera"
  4. 打开视频设备 Camera 和音频设备 Microphone:$ ffmpeg -f dshow -i video="Camera":audio="Microphone"
  5. 打印选定设备支持的选项列表并退出:$ ffmpeg -list_options true -f dshow -i video="Camera"
  6. 按名称 / 别名指定捕获引脚,同时指定设备别名:$ 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"
  7. 配置交叉开关设备,指定交叉开关引脚,并允许用户在启动时调整视频捕获属性:$ 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 示例
  1. 捕获并播放 FireWire DV/HDV 设备的输入流:ffplay -f iec61883 -i auto
  2. 捕获 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 可读客户端的示例:

  1. 创建名为 “ffmpeg” 的 JACK 可写客户端:$ ffmpeg -f jack -i ffmpeg -y out.wav
  2. 启动 jack_metro 可读客户端示例:$ jack_metro -b 120 -d 0.2 -f 4000
  3. 列出当前 JACK 客户端:$ jack_lsp -c输出示例:

plaintext

system:capture_1
system:capture_2
system:playback_1
system:playback_2
ffmpeg:input_1
metro:120_bpm
  1. 将 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 示例
  1. 从首个活动平面捕获,将结果下载为普通帧并编码(仅适用于线性且可映射的帧缓冲,否则可能出现画面错乱或下载失败):ffmpeg -f kmsgrab -i - -vf 'hwdownload,format=bgr0' output.mp4
  2. 从 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
  3. 仅捕获平面的指定区域(如 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+subccout7+subcc(最大标签为 out42)时,流 43 为流 7 的字幕流,流 44 为流 19 的字幕流。未指定时默认使用输入设备的文件名作为滤镜图。
  • graph_file:设置要读取的滤镜图文件名,其语法与graph选项一致。
  • dumpgraph:将滤镜图转储至标准错误输出。
3.11.2 示例
  1. 创建粉色纯色视频流并使用 ffplay 播放:ffplay -f lavfi -graph "color=c=pink [out0]" dummy
  2. 与上例功能相同,但通过文件名指定滤镜图且省略 out0 标签:ffplay -f lavfi color=c=pink
  3. 创建三个不同的视频测试源并播放:ffplay -f lavfi -graph "testsrc [out0]; testsrc,hflip [out1]; testsrc,negate [out2]" test3
  4. 通过 amovie 源从文件读取音频流并使用 ffplay 播放:ffplay -f lavfi "amovie=test.wav"
  5. 读取音视频流并使用 ffplay 播放:ffplay -f lavfi "movie=test.avi[out0];amovie=test.wav[out1]"
  6. 将解码帧保存为图片,同时将隐藏字幕保存为 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 实现包括:

该设备可从 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 示例
  1. 打印 OpenAL 支持的设备列表并退出:$ ffmpeg -list_devices true -f openal -i dummy out.ogg
  2. 从基于 PulseAudio 的 DR-BT101 设备捕获音频并保存为 out.ogg:$ ffmpeg -f openal -i 'DR-BT101 via PulseAudio' out.ogg
  3. 从默认设备捕获音频(文件名设为空字符串):$ ffmpeg -f openal -i '' out.ogg
  4. 同时从两个设备捕获音频并写入不同文件(需 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_offsety_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_sizegrab_xgrab_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_mouseselect_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 示例
  1. 在默认 ALSA 设备播放文件:ffmpeg -i INPUT -f alsa default
  2. 在声卡 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 示例
  1. 打印支持的设备列表并向默认设备输出正弦波:$ ffmpeg -f lavfi -i sine=r=44100 -f audiotoolbox -list_devices true -
  2. 向索引为 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 信息参考:

http://www.x.org/.

4.10.2 示例
  • 使用 ffmpeg 同时解码、显示并编码视频输入:
ffmpeg -i INPUT OUTPUT -f xv display
  • 将输入视频解码并显示到多个 X11 窗口(正常窗口和反色窗口):
ffmpeg -i INPUT -f xv normal -vf negate -f xv negated

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值