Chinaunix首页 | 论坛 | 博客
  • 博客访问: 158090
  • 博文数量: 47
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 256
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-10 09:15
个人简介

熟悉多种视频标准,如h.264, MPEG-2/MPEG-4, AVS.

文章分类

全部博文(47)

文章存档

2015年(5)

2014年(22)

2013年(20)

我的朋友

分类: 其他平台

2015-03-16 18:20:04

av_find_stream_info()中是要不断的读取数据包,解码获得相应的信息

 

 

其中:

st->codec->codec_type0:视频,1:音频,2:数据

st->codec->codec_id     音视频编解码类型对应的值

ic->nb_streams:                   表示包里面包含的流的总数

pkt->stream_index:            表示每个流的索引号,例如音频的为0,视频的为2

pkt->size:                              表示每个包的大小

read_size:                              表示pkt->size的累计和

 

pkt->duration: 相邻两个包的时间差,例如对于mp344100采样率,1152/帧,duration =26; 视频帧率为25duration = 40

st->info->codec_info_duration : 每个流从开始到解析到当前帧的时间和

 

probesize = ic->probesize2 解析缓冲区的大小

max_analyze_duration 解析的时间范围

 

 

 

avformat_find_stream_info() ->

read_frame_internal() ->

ff_read_packet() ->                   //读取packet里面的数据

parse_packet()->                         //解析packet包里面的数据

 

 

ff_read_packet():

对于flv封装格式,对应函数flv_read_packet功能:

读取flv tag header,可以得到tag属于音频,视频或者metadata

如果属于metadata tag,则解析meta data数据;

如果属于audio tag,则不仅需要解析11 字节的tag header,另外需要解析紧跟着tag header的一个字节的数据,可以得到编码格式(SoundFormat),采样率(SoundRate),采样点大小(SoundSize),声音类型(SoundType)

如果属于video tag,同样不仅需要解析11 字节的tag header,另外需要解析紧跟着tag header的一个字节的数据,得到编码格式(frame type),帧类型(CodeID);如果对于AVC编码,还需要解析一个字节的数据,即得到包类型(AVCPacketType)的值。

对于第一次解析到的AVC视频流,需要调用create_stream(),使ic->nb_streams值加1,接着执行flv_set_video_codec(),如果AVCPacketType()SPS包,则从flv_read_packet()返回,并且返回值为-11. 因此会执行

if (ret == AVERROR(EAGAIN))

          continue;

紧接着执行第二次调用read_frame_internal(),ff_read_packet(),此时解析到的是video tag,然后调用av_get_packet() 将读到的这两个packet的数据保存到AVPacket指针变量里面,最后read_frame_internal()调用parse_packet()

 

parse_packet()

执行av_parser_parse2()解析packet包里面的数据,通过调用s->parser->parser_parse()实际对数据进行解析。对于h264,实际调用h264_parse()这个函数进行真正的解析操作,即通过调用parse_nal_units()解析得到NAL的值,以及SPS的信息。 SPS中,可以解析到profile levelwidthheightSARframe rate(timing info)

 

 

fps_analyze_framecount = 20;

if (av_q2d(st->time_base) > 0.0005)

                fps_analyze_framecount *= 2;

 

            /* variable fps and no guess at the real fps */

            if (!(st->r_frame_rate.num && st->avg_frame_rate.num) &&

                st->info->duration_count < fps_analyze_framecount &&

                st->codec->codec_type == AVMEDIA_TYPE_VIDEO)

                break;

 

所以需要检测40 帧视频图像。

为什么是40哪?为了减少延迟,是否可以降低fps_analyze_framecount 值的大小

阅读(3818) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~