指定设备muxing/demuxing库。
一、头文件
avdevice.h
version.h
二、数据结构
struct | AVDeviceRect{ int x; //左上角的x坐标 int y; // 左上角的y坐标 int width; // 宽度 int height; //高度 } |
以下API允许用户探测设备功能(支持的编解码器,像素格式,采样格式,分辨率,通道数等)。
它是建立在顶级操作AVOption API上。 查询功能可以设置适合设备的视频或音频参数转换器。
可以查询的功能列表:
1、对于音频和视频设备都有效的功能:
1)、编解码器:支持的音频/视频编解码器。类型:AV_OPT_TYPE_INT(AVCodecID值)
2、适用于音频设备的功能:
1)、sample_format:支持的采样格式。 类型:AV_OPT_TYPE_INT(AVSampleFormat值)
2)、sample_rate:支持的采样率。 键入:AV_OPT_TYPE_INT
3)、频道:支持频道数量。 类型:AV_OPT_TYPE_INT
4)、channel_layout:支持的频道布局。类型:AV_OPT_TYPE_INT64
3、对视频设备有效的功能:
1)、pixel_format:支持的像素格式。 类型:AV_OPT_TYPE_INT(AVPixelFormat值)
2)、window_size:支持的窗口大小(描述提供给用户的窗口大小的大小)。 类型:AV_OPT_TYPE_IMAGE_SIZE
3)、frame_size:支持的帧大小(描述提供的视频帧的大小)。 类型:AV_OPT_TYPE_IMAGE_SIZE
4)、fps:支持的fps值类型:AV_OPT_TYPE_RATIONAL
功能的值可以由用户使用av_opt_set()函数和AVDeviceCapabilitiesQuery对象设置。 以下查询将结果限制为匹配已设置的功能的值。 例如,设置编解码器可能会影响下一次查询期间返回的格式或fps值。 设置无效值可能会将结果限制为零。
基于opengl输出设备的使用示例:
AVFormatContext *oc = NULL;
AVDeviceCapabilitiesQuery *caps = NULL;
AVOptionRanges *ranges;
int ret;
if ((ret = avformat_alloc_output_context2(&oc, NULL, "opengl", NULL)) < 0)
goto fail;
if (avdevice_capabilities_create(&caps, oc, NULL) < 0)
goto fail;
//query codecs
if (av_opt_query_ranges(&ranges, caps, "codec", AV_OPT_MULTI_COMPONENT_RANGE)) < 0)
goto fail;
//pick codec here and set it
av_opt_set(caps, "codec", AV_CODEC_ID_RAWVIDEO, 0);
//query format
if (av_opt_query_ranges(&ranges, caps, "pixel_format", AV_OPT_MULTI_COMPONENT_RANGE)) < 0)
goto fail;
//pick format here and set it
av_opt_set(caps, "pixel_format", AV_PIX_FMT_YUV420P, 0);
//query and set more capabilities
fail:
//clean up code
avdevice_capabilities_free(&query, oc);
avformat_free_context(oc);
结构描述设备功能。
它被设备与AV设备功能AVOption表结合使用,以实现基于AVOption API的能力探测API。 不应该直接使用
struct | AVDeviceCapabilitiesQuery{ const AVClass * av_class AVFormatContext * device_context enum AVCodecID codec enum AVSampleFormat sample_format enum AVPixelFormat pixel_format int sample_rate int channels int64_t channel_layout int window_width int window_height int frame_width int frame_height AVRational fps } |
结构描述了设备的基本参数。
struct | AVDeviceInfo{ char * device_name;//设备名称,格式取决于设备 char * device_description;// 人性化的名字 } |
设备列表
struct | AVDeviceInfoList{ AVDeviceInfo ** devices;// 自动检测设备列表 int nb_devices;// 自动检测的设备数量 int default_device;// 默认设备的索引,如果没有默认设备则为-1 } |
三、枚举
由avdevice_app_to_dev_control_message()使用的消息类型。
enum | AVAppToDevMessageType { AV_APP_TO_DEV_NONE = MKBETAG('N','O','N','E'), AV_APP_TO_DEV_WINDOW_SIZE = MKBETAG('G','E','O','M'), AV_APP_TO_DEV_WINDOW_REPAINT = MKBETAG('R','E','P','A'), AV_APP_TO_DEV_PAUSE = MKBETAG('P', 'A', 'U', ' '), AV_APP_TO_DEV_PLAY = MKBETAG('P', 'L', 'A', 'Y'), AV_APP_TO_DEV_TOGGLE_PAUSE = MKBETAG('P', 'A', 'U', 'T'), AV_APP_TO_DEV_SET_VOLUME = MKBETAG('S', 'V', 'O', 'L'), AV_APP_TO_DEV_MUTE = MKBETAG(' ', 'M', 'U', 'T'), AV_APP_TO_DEV_UNMUTE = MKBETAG('U', 'M', 'U', 'T'), AV_APP_TO_DEV_TOGGLE_MUTE = MKBETAG('T', 'M', 'U', 'T'), AV_APP_TO_DEV_GET_VOLUME = MKBETAG('G', 'V', 'O', 'L'),AV_APP_TO_DEV_GET_MUTE = MKBETAG('G', 'M', 'U', 'T') } |
AV_APP_TO_DEV_NONE | 虚假信息。 |
AV_APP_TO_DEV_WINDOW_SIZE | 窗口大小更改消息。 每次应用程序更改窗口设备呈现的大小时,消息都会发送到设备。 消息也应在窗口创建后立即发送。 数据:AVDeviceRect:新窗口大小。 |
AV_APP_TO_DEV_WINDOW_REPAINT | 重绘请求消息。 当窗口必须重画时,消息被发送到设备。 数据:AVDeviceRect:需要重新绘制的区域。 NULL:整个区域需要重新绘制。 |
AV_APP_TO_DEV_PAUSE | 请求暂停/播放。 应用程序请求暂停/取消暂停播放。 主要用于具有内部缓冲区的设备。 默认情况下,设备不会暂停。 数据: NULL |
AV_APP_TO_DEV_PLAY | |
AV_APP_TO_DEV_TOGGLE_PAUSE | |
AV_APP_TO_DEV_SET_VOLUME | 音量控制信息。 设置音量级别。 如果每个流或系统范围内更改音量,则可能与设备有关。 预计每个流量的变化可能。 数据:double:新的音量范围0.0 - 1.0。 |
AV_APP_TO_DEV_MUTE | 静音控制消息。 改变静音状态。 如果每个流或系统范围内的静音状态发生变化,则可能与设备有关。 如果可能,预计每流静音状态更改。 数据: NULL. |
AV_APP_TO_DEV_UNMUTE | |
AV_APP_TO_DEV_TOGGLE_MUTE | |
AV_APP_TO_DEV_GET_VOLUME | 获取音量/静音消息。 强制设备分别发送AV_DEV_TO_APP_VOLUME_LEVEL_CHANGED或AV_DEV_TO_APP_MUTE_STATE_CHANGED命令。 数据: NULL. |
AV_APP_TO_DEV_GET_MUTE |
由avdevice_dev_to_app_control_message()使用的消息类型。
enum | AVDevToAppMessageType { AV_DEV_TO_APP_NONE = MKBETAG('N','O','N','E'), AV_DEV_TO_APP_CREATE_WINDOW_BUFFER = MKBETAG('B','C','R','E'), AV_DEV_TO_APP_PREPARE_WINDOW_BUFFER = MKBETAG('B','P','R','E'),AV_DEV_TO_APP_DISPLAY_WINDOW_BUFFER = MKBETAG('B','D','I','S'), AV_DEV_TO_APP_DESTROY_WINDOW_BUFFER = MKBETAG('B','D','E','S'), AV_DEV_TO_APP_BUFFER_OVERFLOW = MKBETAG('B','O','F','L'), AV_DEV_TO_APP_BUFFER_UNDERFLOW = MKBETAG('B','U','F','L'), AV_DEV_TO_APP_BUFFER_READABLE = MKBETAG('B','R','D',' '), AV_DEV_TO_APP_BUFFER_WRITABLE = MKBETAG('B','W','R',' '), AV_DEV_TO_APP_MUTE_STATE_CHANGED = MKBETAG('C','M','U','T'), AV_DEV_TO_APP_VOLUME_LEVEL_CHANGED = MKBETAG('C','V','O','L') } |
创建窗口缓冲区消息。
AV_DEV_TO_APP_NONE | Dummy message. |
AV_DEV_TO_APP_CREATE_WINDOW_BUFFER | 设备请求创建窗口缓冲区。 具体的含义是依赖于设备和应用程序。 在渲染第一帧之前发送消息,并且应在此完成所有单次初始化。 允许应用程序忽略首选的窗口缓冲区大小。
数据:AVDeviceRect:窗口缓冲区的首选大小。 NULL:没有窗口缓冲区的首选大小。 |
AV_DEV_TO_APP_PREPARE_WINDOW_BUFFER | 准备窗口缓冲区消息。 设备请求准备一个用于渲染的窗口缓冲区。 具体的含义是依赖于设备和应用程序。 消息在渲染每帧之前发送。 数据: NULL. |
AV_DEV_TO_APP_DISPLAY_WINDOW_BUFFER | 显示窗口缓冲区消息。 设备请求显示窗口缓冲区。 新帧准备好显示时发送消息。 通常,缓冲区需要在该消息的处理程序中进行交换。 数据: NULL. |
AV_DEV_TO_APP_DESTROY_WINDOW_BUFFER | 销毁窗口缓冲区消息。 设备要求销毁窗口缓冲区。 当设备即将被销毁时发送消息,并且不再需要窗口缓冲区。 数据: NULL. |
AV_DEV_TO_APP_BUFFER_OVERFLOW | 缓冲区填满状态消息。 设备信号缓冲区溢出/下溢。 数据: NULL. |
AV_DEV_TO_APP_BUFFER_UNDERFLOW | |
AV_DEV_TO_APP_BUFFER_READABLE | 设备通知缓冲区是可读/可写的。 在可能的情况下,设备会通知可读/写的字节数。
data:int64_t:可用于读/写的字节数。 NULL:可用于读/写的字节数目未知。 |
AV_DEV_TO_APP_BUFFER_WRITABLE | |
AV_DEV_TO_APP_MUTE_STATE_CHANGED | 静音状态更改消息。 设备通知静音状态已更改。 data:int:0表示非静音状态,非零表示静音状态。 |
AV_DEV_TO_APP_VOLUME_LEVEL_CHANGED | 音量变化信息。 设备通知音量级别已更改。 数据:double:新音量范围0.0 - 1.0。 |