FFMPEG: avformat_find_stream_info()函数
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()函数的更多相关文章
- avformat_find_stream_info函数卡住问题
问题:初始化RTSP流时,在android设备上卡住在avformat_find_stream_info函数,然后程序崩溃. 但其他URL没问题,且同样在代码在iOS上没问题,由于jni调试,也没看到 ...
- ffmpeg.c函数结构简单分析(画图)
前一阵子研究转码的时候看了FFmpeg的源代码.由于ffmpeg.c的代码相对比较长,而且其中有相当一部分是AVFilter有关的代码(这一部分一直不太熟),因此之前学习FFmpeg的时候一直也没有好 ...
- ffmpeg的函数av_samples_get_buffer_size分析,对齐的意思
/* * 此函数只应用于音频. * 计算出:要把一系列的样本保存起来,需要多大的缓存. * sample,单个通道的单次采样所得到的样本数据. * planar,和yuv存储格式一样,声音也分平面(p ...
- FFMPEG的函数翻译文档
https://blog.csdn.net/explorer_day/article/category/6289310/2 https://www.cnblogs.com/tocy/p/ffmpeg- ...
- javacpp-FFmpeg系列补充:FFmpeg解决avformat_find_stream_info检索时间过长问题
javacpp-ffmpeg系列: javacpp-FFmpeg系列之1:视频拉流解码成YUVJ420P,并保存为jpg图片 javacpp-FFmpeg系列之2:通用拉流解码器,支持视频拉流解码并转 ...
- [原]如何在Android用FFmpeg解码图像
前一篇[原]如何用Android NDK编译FFmpeg 我们知道了如何使用NDK来编译Android平台下使用的FFmpeg动态库.这篇文章我们就可以使用Android下的JNI来调用FFMpeg进 ...
- FFmpeg源代码结构图
转自:http://blog.csdn.net/leixiaohua1020/article/details/44220151 FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码 ...
- [总结]FFMPEG视音频编解码零基础学习方法--转
ffmpeg编解码学习 目录(?)[-] ffmpeg程序的使用ffmpegexeffplayexeffprobeexe 1 ffmpegexe 2 ffplayexe 3 ffprobeexe ...
- FFMPEG视音频编解码零基础学习方法-b
感谢大神分享,虽然现在还看不懂,留着大家一起看啦 PS:有不少人不清楚“FFmpeg”应该怎么读.它读作“ef ef em peg” 0. 背景知识 本章主要介绍一下FFMPEG都用在了哪里(在这里仅 ...
随机推荐
- EF Code-First 学习之旅 Code First Conventions
协定是一系列的默认规则用来自动配置领域中的概念模型 1:类型发现 Code-First对包含DBSet属性的类型创建表(包括这些类型的所有引用类型) public class Student { pu ...
- java基础(2)-面向对象(1)
面向对象 面向对象思想 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程:强调的是功能行为 面向对象:将功能封装进对象,强调具备了功能的对象 面向对象是基于面向过程的 面向对象举例 ...
- jQuery颜色面板插件
/** * jQuery颜色面板插件 * * 使用方法:input框的id默认为inputObj,button框的id默认为btnObj,也可以自定义aaa,bbb * 1.初始化颜色面板:$.col ...
- python global
如果想在函数内部改变函数外的变量值,用global语句完成: 在不传该变量值入函数的情况下要改变它的值: >>> a = 3 >>> def f(): ... gl ...
- 03_01_基本操作_增(insert)
1. 1.1.创建表 create table employee( id number primary key, name varchar2(64) not null, email varchar2( ...
- Angular表单的本地校验和远程校验
AngularJS Form 进阶:远程校验和自定义输入项 表单远程校验 HTML代码: <!doctype html> <html ng-app="form-exampl ...
- Memcache面试题
* memcached是怎么工作的? * memcached最大的优势是什么? * memcached和MySQL的query cache相比,有什么优缺点? * memcached和服务器的loca ...
- 如何破解mssql for linux 3.5G内存的限制
在上有篇博客中主要介绍了如何在CentOS 中安装和配置mssql ,在安装过程中遇到3.5G内存的限制,下面介绍如何去破解, 微软发布了SQLServer for Linux,但是安装竟然需要3.5 ...
- Node.js模块、包的学习笔记
什么是模块 模块是node应用程序的基本组成部分,文件和模块是一一对应的,就是说,一个node文件就是一个模块,这个文件可能是javascript代码.json或者是编译过的c++扩展等,如: var ...
- python字典方法
本文参考自<python基础教程 (第二版)> 操作 语法 举例 结果 建立字典 dict() 1.以关键字参数建立字典 2.以其他映射作为参数建立字典 1.d = dict(name=' ...