指定设备muxing/demuxing库。
一、头文件
二、数据结构
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') } |
由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') } |
创建窗口缓冲区消息。