content_views"
class="markdown_views prism-atom-one-dark">
前言
众所周知c;FFmpeg 的代码开发上手难度较高c;源于官方提供的文档很少有包含代码教程相关的。要想熟练掌握 FFmpeg 的代码库开发c;需要借助它的头文件c;FFmpeg 把很多代码库教程都写在头文件里面。因此c;熟读头文件的内容很重要c;为此c;我对 FFmpeg 6.x 版本的头文件进行了翻译c;方便大家阅读理解。相信我c;通读一遍头文件的注释后c;你的 FFmpeg 的代码库开发技能将更上一层。
本文适用于有 FFmpeg 代码库开发基础c;但想深入熟练使用的同学。
同时也可以参考我的Github 仓库c;下载到本地慢慢品读~
c="https://i-blog.csdnimg.cn/img_convert/383356b43e56cf7179f7eef333c70222.gif" alt="frantic-studying.gif" />
libavdevice 模块主要用于处理各种输入输出设备c;主要有如下头文件:
ceh_14">avdevice.h
<code class="prism language-c">class="token macro property">class="token directive-hash">#class="token directive keyword">ifndef class="token expression">AVDEVICE_AVDEVICE_H
class="token macro property">class="token directive-hash">#class="token directive keyword">define class="token macro-name">AVDEVICE_AVDEVICE_Hclass="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"version_major.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">ifndef class="token expression">HAVE_AV_CONFIG_H
class="token comment">/* 当作为class="tags" href="/FFMPEG.html" title=ffmpeg>ffmpeg构建的一部分包含时,仅包含主版本号* 以避免不必要的重建。当外部包含时,保持包含* 完整版本信息。 */
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"version.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">endifclass="token comment">/*** @file* @ingroup lavd* libavdevice API主头文件*/class="token comment">/*** @defgroup lavd libavdevice* 特殊设备复用/解复用库。** Libavdevice是@ref libavf "libavformat"的补充库。它* 提供各种"特殊"的平台特定复用器和解复用器,例如用于* 抓取设备、音频捕获和播放等。因此,libavdevice中的* (解)复用器属于AVFMT_NOFILE类型(它们使用自己的I/O函数)。* 传递给avformat_open_input()的文件名通常不是指向实际存在* 的文件,而是具有一些特殊的设备特定含义 - 例如对于xcbgrab* 它是显示名称。** 要使用libavdevice,只需调用avdevice_register_all()来注册所有* 已编译的复用器和解复用器。它们都使用标准的libavformat API。** @{*/class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"libavutil/log.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"libavutil/opt.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"libavutil/dict.h"
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string">"libavformat/avformat.h"class="token comment">/*** 返回LIBAVDEVICE_VERSION_INT常量。*/
class="token keyword">unsigned class="token function">avdevice_versionclass="token punctuation">(class="token keyword">voidclass="token punctuation">)class="token punctuation">;class="token comment">/*** 返回libavdevice的编译时配置。*/
class="token keyword">const class="token keyword">char class="token operator">*class="token function">avdevice_configurationclass="token punctuation">(class="token keyword">voidclass="token punctuation">)class="token punctuation">;class="token comment">/*** 返回libavdevice的许可证。*/
class="token keyword">const class="token keyword">char class="token operator">*class="token function">avdevice_licenseclass="token punctuation">(class="token keyword">voidclass="token punctuation">)class="token punctuation">;class="token comment">/*** 初始化libavdevice并注册所有输入和输出设备。*/
class="token keyword">void class="token function">avdevice_register_allclass="token punctuation">(class="token keyword">voidclass="token punctuation">)class="token punctuation">;class="token comment">/*** 音频输入设备迭代器。** 如果d为NULL,返回第一个注册的输入音频/视频设备,* 如果d不为NULL,返回d之后的下一个注册的输入音频/视频设备* 如果d是最后一个则返回NULL。*/
class="token keyword">const AVInputFormat class="token operator">*class="token function">av_input_audio_device_nextclass="token punctuation">(class="token keyword">const AVInputFormat class="token operator">*dclass="token punctuation">)class="token punctuation">;class="token comment">/*** 视频输入设备迭代器。** 如果d为NULL,返回第一个注册的输入音频/视频设备,* 如果d不为NULL,返回d之后的下一个注册的输入音频/视频设备* 如果d是最后一个则返回NULL。*/
class="token keyword">const AVInputFormat class="token operator">*class="token function">av_input_video_device_nextclass="token punctuation">(class="token keyword">const AVInputFormat class="token operator">*dclass="token punctuation">)class="token punctuation">;class="token comment">/*** 音频输出设备迭代器。** 如果d为NULL,返回第一个注册的输出音频/视频设备,* 如果d不为NULL,返回d之后的下一个注册的输出音频/视频设备* 如果d是最后一个则返回NULL。*/
class="token keyword">const AVOutputFormat class="token operator">*class="token function">av_output_audio_device_nextclass="token punctuation">(class="token keyword">const AVOutputFormat class="token operator">*dclass="token punctuation">)class="token punctuation">;class="token comment">/*** 视频输出设备迭代器。** 如果d为NULL,返回第一个注册的输出音频/视频设备,* 如果d不为NULL,返回d之后的下一个注册的输出音频/视频设备* 如果d是最后一个则返回NULL。*/
class="token keyword">const AVOutputFormat class="token operator">*class="token function">av_output_video_device_nextclass="token punctuation">(class="token keyword">const AVOutputFormat class="token operator">*dclass="token punctuation">)class="token punctuation">;class="token keyword">typedef class="token keyword">struct class="token class-name">AVDeviceRect class="token punctuation">{class="token keyword">int xclass="token punctuation">; class="token comment">/**< 左上角x坐标 */class="token keyword">int yclass="token punctuation">; class="token comment">/**< 左上角y坐标 */class="token keyword">int widthclass="token punctuation">; class="token comment">/**< 宽度 */class="token keyword">int heightclass="token punctuation">; class="token comment">/**< 高度 */
class="token punctuation">} AVDeviceRectclass="token punctuation">;class="token comment">/*** avdevice_app_to_dev_control_message()使用的消息类型。*/
class="token keyword">enum class="token class-name">AVAppToDevMessageType class="token punctuation">{class="token comment">/*** 空消息。*/AV_APP_TO_DEV_NONE class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'N'class="token punctuation">,class="token char">'O'class="token punctuation">,class="token char">'N'class="token punctuation">,class="token char">'E'class="token punctuation">)class="token punctuation">,class="token comment">/*** 窗口大小改变消息。** 每当应用程序改变设备渲染窗口的大小时,* 都会向设备发送消息。* 创建窗口后也应立即发送消息。** data: AVDeviceRect: 新窗口大小。*/AV_APP_TO_DEV_WINDOW_SIZE class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'G'class="token punctuation">,class="token char">'E'class="token punctuation">,class="token char">'O'class="token punctuation">,class="token char">'M'class="token punctuation">)class="token punctuation">,class="token comment">/*** 重绘请求消息。** 当窗口需要重绘时向设备发送消息。** data: AVDeviceRect: 需要重绘的区域。* NULL: 需要重绘整个区域。*/AV_APP_TO_DEV_WINDOW_REPAINT class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'R'class="token punctuation">,class="token char">'E'class="token punctuation">,class="token char">'P'class="token punctuation">,class="token char">'A'class="token punctuation">)class="token punctuation">,class="token comment">/*** 请求暂停/播放。** 应用程序请求暂停/取消暂停播放。* 主要用于具有内部缓冲区的设备。* 默认情况下设备不会暂停。** data: NULL*/AV_APP_TO_DEV_PAUSE class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'P'class="token punctuation">, class="token char">'A'class="token punctuation">, class="token char">'U'class="token punctuation">, class="token char">' 'class="token punctuation">)class="token punctuation">,AV_APP_TO_DEV_PLAY class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'P'class="token punctuation">, class="token char">'L'class="token punctuation">, class="token char">'A'class="token punctuation">, class="token char">'Y'class="token punctuation">)class="token punctuation">,AV_APP_TO_DEV_TOGGLE_PAUSE class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'P'class="token punctuation">, class="token char">'A'class="token punctuation">, class="token char">'U'class="token punctuation">, class="token char">'T'class="token punctuation">)class="token punctuation">,class="token comment">/*** 音量控制消息。** 设置音量级别。根据设备的不同,音量可能是按流* 或系统范围更改。如果可能,期望按流更改音量。** data: double: 新音量范围为0.0 - 1.0。*/AV_APP_TO_DEV_SET_VOLUME class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'S'class="token punctuation">, class="token char">'V'class="token punctuation">, class="token char">'O'class="token punctuation">, class="token char">'L'class="token punctuation">)class="token punctuation">,class="token comment">/*** 静音控制消息。** 更改静音状态。根据设备的不同,静音状态可能是按流* 或系统范围更改。如果可能,期望按流更改静音状态。** data: NULL。*/AV_APP_TO_DEV_MUTE class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">' 'class="token punctuation">, class="token char">'M'class="token punctuation">, class="token char">'U'class="token punctuation">, class="token char">'T'class="token punctuation">)class="token punctuation">,AV_APP_TO_DEV_UNMUTE class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'U'class="token punctuation">, class="token char">'M'class="token punctuation">, class="token char">'U'class="token punctuation">, class="token char">'T'class="token punctuation">)class="token punctuation">,AV_APP_TO_DEV_TOGGLE_MUTE class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'T'class="token punctuation">, class="token char">'M'class="token punctuation">, class="token char">'U'class="token punctuation">, class="token char">'T'class="token punctuation">)class="token punctuation">,class="token comment">/*** 获取音量/静音消息。** 强制设备分别发送AV_DEV_TO_APP_VOLUME_LEVEL_CHANGED或* AV_DEV_TO_APP_MUTE_STATE_CHANGED命令。** data: NULL。*/AV_APP_TO_DEV_GET_VOLUME class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'G'class="token punctuation">, class="token char">'V'class="token punctuation">, class="token char">'O'class="token punctuation">, class="token char">'L'class="token punctuation">)class="token punctuation">,AV_APP_TO_DEV_GET_MUTE class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'G'class="token punctuation">, class="token char">'M'class="token punctuation">, class="token char">'U'class="token punctuation">, class="token char">'T'class="token punctuation">)class="token punctuation">,
class="token punctuation">}class="token punctuation">;class="token comment">/*** avdevice_dev_to_app_control_message()使用的消息类型。*/
class="token keyword">enum class="token class-name">AVDevToAppMessageType class="token punctuation">{class="token comment">/*** 空消息。*/AV_DEV_TO_APP_NONE class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'N'class="token punctuation">,class="token char">'O'class="token punctuation">,class="token char">'N'class="token punctuation">,class="token char">'E'class="token punctuation">)class="token punctuation">,class="token comment">/*** 创建窗口缓冲区消息。** 设备请求创建窗口缓冲区。具体含义取决于设备* 和应用程序。在渲染第一帧之前发送消息,所有一次性* 初始化都应在此处完成。* 应用程序可以忽略首选的窗口缓冲区大小。** @note: 应用程序必须通过AV_APP_TO_DEV_WINDOW_SIZE消息* 通知窗口缓冲区大小。** data: AVDeviceRect: 窗口缓冲区的首选大小。* NULL: 窗口缓冲区没有首选大小。*/AV_DEV_TO_APP_CREATE_WINDOW_BUFFER class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'B'class="token punctuation">,class="token char">'C'class="token punctuation">,class="token char">'R'class="token punctuation">,class="token char">'E'class="token punctuation">)class="token punctuation">,class="token comment">/*** 准备窗口缓冲区消息。** 设备请求准备用于渲染的窗口缓冲区。* 具体含义取决于设备和应用程序。* 在渲染每一帧之前发送消息。** data: NULL。*/AV_DEV_TO_APP_PREPARE_WINDOW_BUFFER class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'B'class="token punctuation">,class="token char">'P'class="token punctuation">,class="token char">'R'class="token punctuation">,class="token char">'E'class="token punctuation">)class="token punctuation">,class="token comment">/*** 显示窗口缓冲区消息。** 设备请求显示窗口缓冲区。* 当新帧准备好显示时发送消息。* 通常需要在此消息的处理程序中交换缓冲区。** data: NULL。*/AV_DEV_TO_APP_DISPLAY_WINDOW_BUFFER class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'B'class="token punctuation">,class="token char">'D'class="token punctuation">,class="token char">'I'class="token punctuation">,class="token char">'S'class="token punctuation">)class="token punctuation">,class="token comment">/*** 销毁窗口缓冲区消息。** 设备请求销毁窗口缓冲区。* 当设备即将被销毁且不再需要窗口缓冲区时* 发送消息。** data: NULL。*/AV_DEV_TO_APP_DESTROY_WINDOW_BUFFER class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'B'class="token punctuation">,class="token char">'D'class="token punctuation">,class="token char">'E'class="token punctuation">,class="token char">'S'class="token punctuation">)class="token punctuation">,class="token comment">/*** 缓冲区满状态消息。** 设备发出缓冲区溢出/下溢信号。** data: NULL。*/AV_DEV_TO_APP_BUFFER_OVERFLOW class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'B'class="token punctuation">,class="token char">'O'class="token punctuation">,class="token char">'F'class="token punctuation">,class="token char">'L'class="token punctuation">)class="token punctuation">,AV_DEV_TO_APP_BUFFER_UNDERFLOW class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'B'class="token punctuation">,class="token char">'U'class="token punctuation">,class="token char">'F'class="token punctuation">,class="token char">'L'class="token punctuation">)class="token punctuation">,class="token comment">/*** 缓冲区可读/可写。** 设备通知缓冲区可读/可写。* 如果可能,设备会通知可以读/写多少字节。** @warning 当可读/写字节数发生变化时,设备可能不会通知。** data: int64_t: 可读/写的字节数。* NULL: 可读/写的字节数未知。*/AV_DEV_TO_APP_BUFFER_READABLE class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'B'class="token punctuation">,class="token char">'R'class="token punctuation">,class="token char">'D'class="token punctuation">,class="token char">' 'class="token punctuation">)class="token punctuation">,AV_DEV_TO_APP_BUFFER_WRITABLE class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'B'class="token punctuation">,class="token char">'W'class="token punctuation">,class="token char">'R'class="token punctuation">,class="token char">' 'class="token punctuation">)class="token punctuation">,class="token comment">/*** 静音状态改变消息。** 设备通知静音状态已改变。** data: int: 0表示非静音状态,非零表示静音状态。*/AV_DEV_TO_APP_MUTE_STATE_CHANGED class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'C'class="token punctuation">,class="token char">'M'class="token punctuation">,class="token char">'U'class="token punctuation">,class="token char">'T'class="token punctuation">)class="token punctuation">,class="token comment">/*** 音量级别改变消息。** 设备通知音量级别已改变。** data: double: 新音量范围为0.0 - 1.0。*/AV_DEV_TO_APP_VOLUME_LEVEL_CHANGED class="token operator">= class="token function">MKBETAGclass="token punctuation">(class="token char">'C'class="token punctuation">,class="token char">'V'class="token punctuation">,class="token char">'O'class="token punctuation">,class="token char">'L'class="token punctuation">)class="token punctuation">,
class="token punctuation">}class="token punctuation">;class="token comment">/*** 从应用程序向设备发送控制消息。** @param s 设备上下文。* @param type 消息类型。* @param data 消息数据。具体类型取决于消息类型。* @param data_size 消息数据大小。* @return >= 0表示成功,负值表示错误。* AVERROR(ENOSYS)表示设备未实现消息处理程序。*/
class="token keyword">int class="token function">avdevice_app_to_dev_control_messageclass="token punctuation">(class="token keyword">struct class="token class-name">AVFormatContext class="token operator">*sclass="token punctuation">,class="token keyword">enum class="token class-name">AVAppToDevMessageType typeclass="token punctuation">,class="token keyword">void class="token operator">*dataclass="token punctuation">, class="token class-name">size_t data_sizeclass="token punctuation">)class="token punctuation">;class="token comment">/*** 从设备向应用程序发送控制消息。** @param s 设备上下文。* @param type 消息类型。* @param data 消息数据。可以为NULL。* @param data_size 消息数据大小。* @return >= 0表示成功,负值表示错误。* AVERROR(ENOSYS)表示应用程序未实现消息处理程序。*/
class="token keyword">int class="token function">avdevice_dev_to_app_control_messageclass="token punctuation">(class="token keyword">struct class="token class-name">AVFormatContext class="token operator">*sclass="token punctuation">,class="token keyword">enum class="token class-name">AVDevToAppMessageType typeclass="token punctuation">,class="token keyword">void class="token operator">*dataclass="token punctuation">, class="token class-name">size_t data_sizeclass="token punctuation">)class="token punctuation">;class="token comment">/*** 描述设备基本参数的结构。*/
class="token keyword">typedef class="token keyword">struct class="token class-name">AVDeviceInfo class="token punctuation">{class="token keyword">char class="token operator">*device_nameclass="token punctuation">; class="token comment">/**< 设备名称,格式取决于设备 */class="token keyword">char class="token operator">*device_descriptionclass="token punctuation">; class="token comment">/**< 人类友好的名称 */class="token keyword">enum class="token class-name">AVMediaType class="token operator">*media_typesclass="token punctuation">; class="token comment">/**< 数组指示设备可以提供哪些媒体类型(如果有)。如果为null,则不能提供任何类型 */class="token keyword">int nb_media_typesclass="token punctuation">; class="token comment">/**< media_types数组的长度,如果设备不能提供任何媒体类型则为0 */
class="token punctuation">} AVDeviceInfoclass="token punctuation">;class="token comment">/*** 设备列表。*/
class="token keyword">typedef class="token keyword">struct class="token class-name">AVDeviceInfoList class="token punctuation">{AVDeviceInfo class="token operator">*class="token operator">*devicesclass="token punctuation">; class="token comment">/**< 自动检测设备列表 */class="token keyword">int nb_devicesclass="token punctuation">; class="token comment">/**< 自动检测设备数量 */class="token keyword">int default_deviceclass="token punctuation">; class="token comment">/**< 默认设备的索引,如果没有默认设备则为-1 */
class="token punctuation">} AVDeviceInfoListclass="token punctuation">;class="token comment">/*** 列出设备。** 返回可用设备名称及其参数。** @note: 某些设备可能接受无法自动检测的系统相关设备名称。* 不能假定此函数返回的列表始终是完整的。** @param s 设备上下文。* @param[out] device_list 自动检测设备列表。* @return 自动检测设备数量,负值表示错误。*/
class="token keyword">int class="token function">avdevice_list_devicesclass="token punctuation">(class="token keyword">struct class="token class-name">AVFormatContext class="token operator">*sclass="token punctuation">, AVDeviceInfoList class="token operator">*class="token operator">*device_listclass="token punctuation">)class="token punctuation">;class="token comment">/*** 释放avdevice_list_devices()结果的便捷函数。** @param device_list 要释放的设备列表。*/
class="token keyword">void class="token function">avdevice_free_list_devicesclass="token punctuation">(AVDeviceInfoList class="token operator">*class="token operator">*device_listclass="token punctuation">)class="token punctuation">;class="token comment">/*** 列出设备。** 返回可用设备名称及其参数。* 这些是avdevice_list_devices()的便捷包装器。* 设备上下文在内部分配和释放。** @param device 设备格式。如果设置了设备名称,可以为NULL。* @param device_name 设备名称。如果设置了设备格式,可以为NULL。* @param device_options 填充了设备私有选项的AVDictionary。可以为NULL。* 对于输出设备,相同的选项必须稍后传递给avformat_write_header(),* 对于输入设备,必须传递给avformat_open_input(),或在任何其他* 影响设备私有选项的地方传递。* @param[out] device_list 自动检测设备列表* @return 自动检测设备数量,负值表示错误。* @note 当两者都设置时,device参数优先于device_name。*/
class="token keyword">int class="token function">avdevice_list_input_sourcesclass="token punctuation">(class="token keyword">const AVInputFormat class="token operator">*deviceclass="token punctuation">, class="token keyword">const class="token keyword">char class="token operator">*device_nameclass="token punctuation">,AVDictionary class="token operator">*device_optionsclass="token punctuation">, AVDeviceInfoList class="token operator">*class="token operator">*device_listclass="token punctuation">)class="token punctuation">;
class="token keyword">int class="token function">avdevice_list_output_sinksclass="token punctuation">(class="token keyword">const AVOutputFormat class="token operator">*deviceclass="token punctuation">, class="token keyword">const class="token keyword">char class="token operator">*device_nameclass="token punctuation">,AVDictionary class="token operator">*device_optionsclass="token punctuation">, AVDeviceInfoList class="token operator">*class="token operator">*device_listclass="token punctuation">)class="token punctuation">;class="token comment">/*** @}*/class="token macro property">class="token directive-hash">#class="token directive keyword">endif class="token comment">/* AVDEVICE_AVDEVICE_H */code>