FFMPEG学习【libavdevice】(一)

指定设备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 



设备请求创建窗口缓冲区。 具体的含义是依赖于设备和应用程序。 在渲染第一帧之前发送消息,并且应在此完成所有单次初始化。 允许应用程序忽略首选的窗口缓冲区大小。

注意:
: 应用程序有义务通过AV_APP_TO_DEV_WINDOW_SIZE消息通知窗口缓冲区大小。

数据: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。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值