AVStream和AVCodecParameters
说明:
AVStream 结构表示当前媒体流的上下文,着重于所有媒体流共有的属性(并且是在程序运行时才能确定其值)和关联其他结构的字段。 其中codecpar成员里存储了当前音视频媒体使用的编解码器信息; priv_data 成员关联解析各个具体媒体流解复用拆包用的 context;还有关键帧的索引表index_entries成员也存于此。
typedef struct AVStream
{ AVCodecContext *codec; //指向解码器 context,新版本已过时 AVCodecParameters *codecpar; //AVCodecContext解码结构体的结构体参数,解码之前都需要通过它来初始化AVCodecContext. void *priv_data; //指向解复用的流的 context,比如 mp4 的 MovStreamcontext AVRational time_base;
.
AVRational avg_frame_rate;
//音频频帧速率(1s多少帧,对于音频时,该值可能是个浮点数,比如44.1khz, 每一帧里有channel*frame_size个样本数据,
那么帧率为441000/frame_size) AVIndexEntry *index_entries; //用于 seek (滑动至指定位置播放)时使用,用于快速索引关键帧,
如 flv 的 keyframes 索引表和 mp4 的 I帧的索引表都存于此,很重要 int nb_index_entries; //index_entries 的元素的个数
int index_entries_allocated_size;
double frame_last_delay; } AVStream;

其中,AVCodecParameters结构体与AVCodecContext里的参数有很多相同的成员,如下所示:

typedef struct AVCodecParameters {

enum AVMediaType codec_type; //编解码器的类型(视频,音频...)

enum AVCodecID codec_id; //标示特定的编解码器,通过该id号可以来找到AVCodec
/**
* Additional information about the codec (corresponds to the AVI FOURCC).
*/
uint32_t codec_tag; //编码器的附加信息 /**
* Extra binary data needed for initializing the decoder, codec-dependent.
*
* Must be allocated with av_malloc() and will be freed by
* avcodec_parameters_free(). The allocated size of extradata must be at
* least extradata_size + AV_INPUT_BUFFER_PADDING_SIZE, with the padding
* bytes zeroed.
*/
uint8_t *extradata;
/**
* Size of the extradata content in bytes.
*/
int extradata_size; /**
* - video: the pixel format, the value corresponds to enum AVPixelFormat.
* - audio: the sample format, the value corresponds to enum AVSampleFormat.
*/
int format; //帧的格式,如果未知或未设置为-1
//对于视频帧,参考AVPixelFormat枚举值,比如:AV_PIX_FMT_YUV420P
//对于音频帧,参考AVSampleFormat枚举值,比如:AV_SAMPLE_FMT_U8 /**
* The average bitrate of the encoded data (in bits per second).
*/
int64_t bit_rate; int bits_per_coded_sample; /**
* Codec-specific bitstream restrictions that the stream conforms to.
*/
int profile;
int level; /**
* Video only. The dimensions of the video frame in pixels.
*/
int width;
int height; //视频帧的尺寸(以像素为单位)
//这里的宽高不一定会有值(对于流媒体视频而言),不过用户可以在解码后通过if (frame->width > 0 && frame->height > 0)来判断是否为视频流 /**
* Video only. The aspect ratio (width / height) which a single pixel
* should have when displayed.
*
* When the aspect ratio is unknown / undefined, the numerator should be
* set to 0 (the denominator may have any value).
*/
AVRational sample_aspect_ratio; //像素的宽高比,通过av_q2d()来获取值,如果未知/未指定,为0/1。 /**
* Video only. The order of the fields in interlaced video.
*/
enum AVFieldOrder field_order; /**
* Video only. Additional colorspace characteristics.
*/
enum AVColorRange color_range; //图像的编码格式(MPEG/JPEG),解码时,由库设置,编码时,由用户来设置
enum AVColorPrimaries color_primaries; //图像源初选的色度坐标
enum AVColorTransferCharacteristic color_trc; //图像颜色传输特性
enum AVColorSpace color_space; //图像彩色空间类型,解码时,由库设置,编码时,由用户来设置,比如等于AVCOL_SPC_RGB时,那么color_trc等于AVCOL_TRC_IEC61966_2_1
enum AVChromaLocation chroma_location; //储存的颜色色度样品的位置 /**
* Video only. Number of delayed frames.
*/
int video_delay; //延迟帧数 /**
* Audio only. The channel layout bitmask. May be 0 if the channel layout is
* unknown or unspecified, otherwise the number of bits set must be equal to
* the channels field.
*/
uint64_t channel_layout; //声道布局,仅用于音频 int channels; //音频通道数量,仅用于音频
int sample_rate; //音频数据的采样率。
//用户可以通过 if (frame->nb_samples > 0 && (frame->channel_layout || frame->channels > 0))来判断该frame是否为音频
/**
* Audio only. Audio frame size, if known. Required by some formats to be static.
*/
int frame_size; //音频帧的样本数据数量
... ...
} AVCodecParameters;
获取音视频流信息方法
第一种,使用遍历方法获取
videoindex = -;
audioindex = -;
for (uint i = ; i < pFormatCtx->nb_streams; i++)
{
if (pFormatCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) //找到视频流
{
videoindex = i;
}
else if(pFormatCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) //找到音频流
{
audioindex = i;
}
}

第二种,使用av_find_best_stream()获取方法获取

函数定义如下:
int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type, int wanted_stream_nb, int related_stream,
               AVCodec **decoder_ret, int flags);
//根据type参数从ic-> streams[]里获取用户要找的流,找到成功后则返回streams[]中对应的序列号,否则返回
//ic: AVFormatContext结构体句柄
//type:要找的流参数,比如: AVMEDIA_TYPE_VIDEO,AVMEDIA_TYPE_AUDIO,AVMEDIA_TYPE_SUBTITLE等
//wanted_stream_nb: 用户希望请求的流号,设为-1用于自动选择
//related_stream: 试着找到一个相关的流(比如多路视频时),一般设为-1,表示不需要
//decoder_ret:如果非空,则返回所选流的解码器(相当于调用avcodec_find_decoder()函数)
//flags:未定义

获取如下:

videoindex = av_find_best_stream(pFormatCtx, AVMEDIA_TYPE_VIDEO, -, -, NULL, );
audioindex = av_find_best_stream(pFormatCtx, AVMEDIA_TYPE_AUDIO, -, -, NULL, );

5.AVStream和AVCodecParameters的更多相关文章

  1. FFmpeg(5)-AVStream和AVCodecParameters部分参数分析

    一.AVStream AVCodecContext *codec // 已过时,使用另一个 codecpar 结构体代替. AVRational time_base // 时间基数. int64_t ...

  2. 11.QT-ffmpeg+QAudioOutput实现音频播放器

    1.前言      由于QAudioOutput支持的输入数据必须是原始数据,所以播放mp3,WAV,AAC等格式文件,需要解封装后才能支持播放.      而在QT中,提供了QMediaPlayer ...

  3. FFmpeg: AVCodecParameters 结构体分析

    /** * This struct describes the properties of an encoded stream. * * sizeof(AVCodecParameters) is no ...

  4. FFmpeg——AVCodec,AVCodecContext,AVCodecParameters 辨析

    先贴上雷神的一张FFmpeg关键结构体之间的关系图: 再看雷神的分析: 每个AVStream存储一个视频/音频流的相关数据: 每个AVStream对应一个AVCodecContext,存储该视频/音频 ...

  5. FFMPEG-数据结构解释(AVCodecContext,AVStream,AVFormatContext)

    http://blog.csdn.net/yuan892173701/article/details/8702333 AVCodecContext  这是一个描述编解码器上下文的数据结构,包含了众多编 ...

  6. AVStream ddk 翻译

    1.       AVStream概览 AVStream是一款微软提供的多媒体类驱动程序,它既支持单独的视频流媒体,也支持音频视频集成的流媒体.微软把AVStream作为操作系统的一部分,在驱动程序k ...

  7. FFMPEG结构体分析:AVStream

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrame FFMPEG结构体分析:AVFormatContext FFMPEG结构体分析:AVCodecConte ...

  8. FFmpeg 结构体学习(二): AVStream 分析

    在上文FFmpeg 结构体学习(一): AVFormatContext 分析我们学习了AVFormatContext结构体的相关内容.本文,我们将讲述一下AVStream. AVStream是存储每一 ...

  9. (转)FFMPEG-数据结构解释(AVCodecContext,AVStream,AVFormatContext)

    AVCodecContext  这是一个描述编解码器上下文的数据结构,包含了众多编解码器需要的参数信息 如果是单纯使用libavcodec,这部分信息需要调用者进行初始化:如果是使用整个FFMPEG库 ...

随机推荐

  1. dom4j解析xml时报出文件提前结束

    在写javaweb小项目的时候,用dom4j解析xml报出如下错误: org.dom4j.DocumentException:Error    .......    Nested exception: ...

  2. 支持向量机SVM介绍

    SVM为了达到更好的泛化效果,会构建具有"max-margin"的分类器(如下图所示),即最大化所有类里面距离超平面最近的点到超平面的距离,数学公式表示为$$\max\limits ...

  3. LeetCode 120. Triangle (三角形最小路径和)详解

    题目详情 给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自顶向下的最小路径 ...

  4. 在阿里云托管kubernetes上利用 cert-manager 自动签发 TLS 证书[无坑版]

    前言 排错的过程是痛苦的也是有趣的. 运维乃至IT,排错能力是拉开人与人之间的重要差距. 本篇会记录我的排错之旅. 由来 现如今我司所有业务都运行在阿里云托管kubernetes环境上,因为前端需要对 ...

  5. vue.js中 v-for,v-on,v-model,结合应用案例---记事本

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. DRF内置权限组件之自定义权限管理类

    DRF内置权限组件permissions 权限控制可以限制用户对于视图的访问和对于具体数据对象的访问. 在执行视图的dispatch()方法前,会先进行视图访问权限的判断 在通过get_object( ...

  7. 手动向Maven本地仓库添加ORACLE ojdbc6jar包

    第一步: 把你的oracle中的ojdbc6.jar复制放到D盘首目录 这是我的D:\oracle\product\11.2.0\dbhome_1\jdbc\ D:ojdbc6.jar 但是Maven ...

  8. Java基于SSM的个人博客系统(源码 包含前后台)

    @ 目录 系统简介 系统运行截图 核心代码 写在最后 系统简介 技术点:Java.JSP.SSM框架,实现了个人博客系统 用户角色分为:普通用户.管理员.系统管理员 功能:发博客.博客分类.博客删除. ...

  9. 《Java从入门到失业》第一章:计算机基础知识(三):程序语言简介

    1.3程序语言简介 我们经常会听到一些名词:低级语言.高级语言.编译型.解释型.面向过程.面向对象等.这些到底是啥意思呢?在正式进入Java世界前,笔者也尝试简单的聊一聊这块东西. 1.3.1低级语言 ...

  10. ansible实现批量建立互信

    Ansible:自动化运维工具 为什么要建立互信:ansible批量配置管理的前提是管理机和被管理机ssh互信,即通过将管理主机的公钥(id_rsa.pub)添加到目标主机上,实现管理机不通过交互式输 ...