1.该结构体简介

AVStream在FFmpeg使用过程中关于编解码至关重要的结构体之一,是对流(Stream)的封装和抽象,描述了视频、音频等流的编码格式等基本流信息。此外也是音频、视频、字母数据流的重要载体。
对于一个典型的mp4格式的媒体源来说,需要经过解封装(解复用),解码然后输出的过程。而解封装从容器中分离出来的流,在FFmpeg中对应的对象就是AVStream。解复用解出来几条AVStream,就会在AVFormatContext中的nb_streams+1(总流数+1),并且将AVStream保存在streams数组中。
该结构体在avformat.h中申明。

2.timebase成员

什么是timebase
实际上time_base的意思就是时间的刻度:

如(1,25),那么时间刻度就是1/25

(1,9000),那么时间刻度就是1/90000

那么,在刻度为1/25的体系下的time=5,转换成在刻度为1/90000体系下的时间time为(51/25)/(1/90000) = 36005=18000

ffmpeg中做pts计算时,存在大量这种转换

存在于哪些结构中
AVCodecContext:编解码上下文。

AVStream:文件或其它容器中的某一个track。

什么时候用
在某些场景下涉及到PTS的计算时,就涉及到两个Time的转换,以及到底取哪里的time_base进行转换:

场景1:编码器产生的帧,直接存入某个容器的AVStream中,那么此时packet的Time要从AVCodecContext的time转换成目标AVStream的time

场景2:从一种容器中demux出来的源AVStream的frame,存入另一个容器中某个目的AVStream。

此时的时间刻度应该从源AVStream的time,转换成目的AVStream timebase下的时间。

FFMPEG之AVRational TimeBase成员理解:
https://blog.csdn.net/xiaojun111111/article/details/79701314

3. AVCodecParameters分析

AVCodecParamteres结构体是将AVCodecContext中编解码器参数抽取出而形成的新的结构体,在新版本中的FFMPEG中,有些结构体中的AVCodecContext已经被弃用,取而代之的就是AVCodecParameters这个参数,该结构体定义在libavcodec/codec_par.h文件中,

for (int i = 0; i < ic->nb_streams; i++)
	{
		AVStream* as = ic->streams[i];
		//音频
		if (as->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
		{
			cout << i << "音频" << endl;
			cout << "simple_rate" << as->codecpar->sample_rate << endl;
			cout << "format" << as->codecpar->format << endl;
			cout << "channels" << as->codecpar->channels << endl;
			cout << "codec_id" << as->codecpar->codec_id << endl;
		}
		//视频
		else if (as->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
		{
			cout << i << "视频" << endl;
			cout << "simple_rate" << as->codecpar->sample_rate << endl;
			cout << "format" << as->codecpar->format << endl;
			cout << "channels" << as->codecpar->channels << endl;
			cout << "codec_id" << as->codecpar->codec_id << endl;
		}
	}

通常视频是0,音频是1,但也有例外,故打印出来看看
AVFormatContext* ic = NULL; //ic为指向AVFormatContext的指针
AVStream* as = ic->streams[i]; //AVFormatContext中有成员streams[]
对于指向结构体或者类的指针来说,其使用->或者.符号,即为取被指向结构体或者类的成员,这里为取streams[]成员
在这里插入图片描述
AVstream为结构体,as为指向该结构体的指针,
在这里插入图片描述
streams为AVFormatContext结构体下的指向AVStream的二级指针,这里通过ic将其从结构体中取出,并赋值给指向AVSteam的指针的as。

在这里插入图片描述
codecpar为AVstream的成员,其类型为指向AVCodecParameters的指针,
在这里插入图片描述
AVCodecParameters为一个结构体,其存放编码数据的通常类型

sample_rate,format,channels等都为AVCodecParameters其中的成员

在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐