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

其中:

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

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

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

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

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

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

pkt->duration: 相邻两个包的时间差,例如对于mp3,44100采样率,1152点/帧,duration =26; 视频帧率为25,duration = 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, level,width,height,SAR,frame 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 帧视频图像。

FFMPEG: avformat_find_stream_info()函数的更多相关文章

  1. avformat_find_stream_info函数卡住问题

    问题:初始化RTSP流时,在android设备上卡住在avformat_find_stream_info函数,然后程序崩溃. 但其他URL没问题,且同样在代码在iOS上没问题,由于jni调试,也没看到 ...

  2. ffmpeg.c函数结构简单分析(画图)

    前一阵子研究转码的时候看了FFmpeg的源代码.由于ffmpeg.c的代码相对比较长,而且其中有相当一部分是AVFilter有关的代码(这一部分一直不太熟),因此之前学习FFmpeg的时候一直也没有好 ...

  3. ffmpeg的函数av_samples_get_buffer_size分析,对齐的意思

    /* * 此函数只应用于音频. * 计算出:要把一系列的样本保存起来,需要多大的缓存. * sample,单个通道的单次采样所得到的样本数据. * planar,和yuv存储格式一样,声音也分平面(p ...

  4. FFMPEG的函数翻译文档

    https://blog.csdn.net/explorer_day/article/category/6289310/2 https://www.cnblogs.com/tocy/p/ffmpeg- ...

  5. javacpp-FFmpeg系列补充:FFmpeg解决avformat_find_stream_info检索时间过长问题

    javacpp-ffmpeg系列: javacpp-FFmpeg系列之1:视频拉流解码成YUVJ420P,并保存为jpg图片 javacpp-FFmpeg系列之2:通用拉流解码器,支持视频拉流解码并转 ...

  6. [原]如何在Android用FFmpeg解码图像

    前一篇[原]如何用Android NDK编译FFmpeg 我们知道了如何使用NDK来编译Android平台下使用的FFmpeg动态库.这篇文章我们就可以使用Android下的JNI来调用FFMpeg进 ...

  7. FFmpeg源代码结构图

    转自:http://blog.csdn.net/leixiaohua1020/article/details/44220151 FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码 ...

  8. [总结]FFMPEG视音频编解码零基础学习方法--转

    ffmpeg编解码学习   目录(?)[-] ffmpeg程序的使用ffmpegexeffplayexeffprobeexe 1 ffmpegexe 2 ffplayexe 3 ffprobeexe ...

  9. FFMPEG视音频编解码零基础学习方法-b

    感谢大神分享,虽然现在还看不懂,留着大家一起看啦 PS:有不少人不清楚“FFmpeg”应该怎么读.它读作“ef ef em peg” 0. 背景知识 本章主要介绍一下FFMPEG都用在了哪里(在这里仅 ...

随机推荐

  1. java基础(2)-面向对象(1)

    面向对象 面向对象思想 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程:强调的是功能行为 面向对象:将功能封装进对象,强调具备了功能的对象 面向对象是基于面向过程的 面向对象举例 ...

  2. ZooKeeper学习第八期---ZooKeeper伸缩性

    转:http://www.cnblogs.com/sunddenly/p/4143306.html 一.ZooKeeper中Observer 1.1 ZooKeeper角色 经过前面的介绍,我想大家都 ...

  3. 在win+r中常用的命令

    cmd打开命令提示符 regedit打开注册表 gpedit.msc组策略 services.msc打开服务列表 msconfig系统配置(可以设置开机自启动) compmgmt.msc 计算机管理 ...

  4. 如何创建效率高sql-建立索引

      我们做开发的人员,虽说自己不是专业从事数据库方面研究的(如DBA),但很多时候,公司没有专门的DBA,所以拿到具体的项目中,整体的数据库设计都是开发人员自己写的,随着时间的推移,加上开发经验的增长 ...

  5. Microsoft SQL Server for Linux安装和配置

    虽说mssql for linux早已经出来了,但原本没有打算这么早就去尝试的,无奈之下还是得先尝试用了,这里分几篇介绍我在用mssql for linux时遇到的问题,不得不说作为先吃螃蟹的人总是要 ...

  6. NoSQL四种——kv存储(memcache,Riak),列存储(Cassandra,Hbase),文档类(mongoDB,CouchDB),图数据库(neo4j)

    见:https://software.intel.com/sites/default/files/Configuration_and_Deployment_Guide_for_Cassandra_on ...

  7. 大数据框架对比:Hadoop、Storm、Samza、Spark和Flink——flink支持SQL,待看

    简介 大数据是收集.整理.处理大容量数据集,并从中获得见解所需的非传统战略和技术的总称.虽然处理数据所需的计算能力或存储容量早已超过一台计算机的上限,但这种计算类型的普遍性.规模,以及价值在最近几年才 ...

  8. lucene搜索之facet查询原理和facet查询实例——TODO

    转自:http://www.lai18.com/content/7084969.html Facet说明 我们在浏览网站的时候,经常会遇到按某一类条件查询的情况,这种情况尤以电商网站最多,以天猫商城为 ...

  9. New Concept English three (52)

    My cousin, Harry, keeps a large curiously-shaped bottle on permanent display in his study. Despite t ...

  10. UVA - 10723 Alibaba (dp)

    给你两个长度不超过30的字符串序列,让你找到一个最短的字符串,使得给定的两个字符串均是它的子序列(不一定连续),求出最短长度以及符合条件的解的个数. 定义状态(a,b,c)为当前字符串长度为a,其中包 ...