FFmpeg源码分析: AVStream码流

2024-06-15 10:38

本文主要是介绍FFmpeg源码分析: AVStream码流,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在AVCodecContext结构体存储有AVStream数组,包含所有视频流、音频流、字幕流的信息。每个码流包含有时间基、时长、索引数组、编解码器参数、dts、元数据。其中,索引数组用于保存每帧数据包offset、size、timestamp、flag,用于seek定位某个时间戳对应的帧。

AVStream结构体如下:

typedef struct AVStream {// 数组索引int index;// stream idint id;// 私有数据void *priv_data;// 时间基AVRational time_base;// 开始时间int64_t start_time;// 码流时长int64_t duration;// 帧数int64_t nb_frames;int disposition; /**< AV_DISPOSITION_* bit field */// 选择丢弃哪些packetsenum AVDiscard discard;// 宽高比AVRational sample_aspect_ratio;// 码流的元数据信息AVDictionary *metadata;// 平均帧率AVRational avg_frame_rate;// 封面信息AVPacket attached_pic;// 附加数据AVPacketSideData *side_data;int            nb_side_data;int event_flags;AVRational r_frame_rate;// 编解码器参数AVCodecParameters *codecpar;int pts_wrap_bits;int64_t first_dts;int64_t cur_dts;int64_t last_IP_pts;int last_IP_duration;int probe_packets;int codec_info_nb_frames;/* av_read_frame() support */enum AVStreamParseType need_parsing;struct AVCodecParserContext *parser;// 索引数组AVIndexEntry *index_entries;// 索引数组长度int nb_index_entries;unsigned int index_entries_allocated_size;int stream_identifier;AVStreamInternal *internal;
} AVStream;

我们来看下ffprobe打印的码流信息,该mp4文件有5个码流,属于双音轨双字幕。第一个是video,编码器为h264,帧率为23.98fps,分辨率为720x306,像素格式为yuv420p;第二个是audio,编码器为aac,采样率为44100,立体声,语言为印地语;第三个也是audio,参数与第二个相同,除了语言是英语;第四个是subtitle,语言为英语,编码器为mov_text;第五个也是subtitle,参数与第四个相同。具体的码流信息如下:

 

 接下来是调试的实时数据,stream数组信息:

 然后是AVCodecContext的编解码器参数,包括codec_type(媒体类型)、codec_id、bit_rate、profile、level、width、height、sample_rate、channels等。具体参数如下:

 另外,AVStream内部有nb_index_entries(索引数组长度)、index_entries(索引数组)。而索引数组包括:offset、size、timestamp、flags、min_distance。在seek操作时,根据给定时间戳二分查找timestamp数组,seek有三种模式:previous、next、nearest,一般使用previous前向查找。具体信息如下:

 最后,要讨论的是time_base时间基。FFmpeg中的时间戳是用time_base作为单位,位于rational.h的AVRational结构体定义如下:

typedef struct AVRational{int num; ///< Numeratorint den; ///< Denominator
} AVRational;

换算为真实时间,需要使用num分子与den分母相除,公式如下:

static inline double av_q2d(AVRational a){return a.num / (double) a.den;
}

这篇关于FFmpeg源码分析: AVStream码流的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1063221

相关文章

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

Redis中的AOF原理及分析

《Redis中的AOF原理及分析》Redis的AOF通过记录所有写操作命令实现持久化,支持always/everysec/no三种同步策略,重写机制优化文件体积,与RDB结合可平衡数据安全与恢复效率... 目录开篇:从日记本到AOF一、AOF的基本执行流程1. 命令执行与记录2. AOF重写机制二、AOF的

MyBatis Plus大数据量查询慢原因分析及解决

《MyBatisPlus大数据量查询慢原因分析及解决》大数据量查询慢常因全表扫描、分页不当、索引缺失、内存占用高及ORM开销,优化措施包括分页查询、流式读取、SQL优化、批处理、多数据源、结果集二次... 目录大数据量查询慢的常见原因优化方案高级方案配置调优监控与诊断总结大数据量查询慢的常见原因MyBAT

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

Java中最全最基础的IO流概述和简介案例分析

《Java中最全最基础的IO流概述和简介案例分析》JavaIO流用于程序与外部设备的数据交互,分为字节流(InputStream/OutputStream)和字符流(Reader/Writer),处理... 目录IO流简介IO是什么应用场景IO流的分类流的超类类型字节文件流应用简介核心API文件输出流应用文

java 恺撒加密/解密实现原理(附带源码)

《java恺撒加密/解密实现原理(附带源码)》本文介绍Java实现恺撒加密与解密,通过固定位移量对字母进行循环替换,保留大小写及非字母字符,由于其实现简单、易于理解,恺撒加密常被用作学习加密算法的入... 目录Java 恺撒加密/解密实现1. 项目背景与介绍2. 相关知识2.1 恺撒加密算法原理2.2 Ja

Nginx屏蔽服务器名称与版本信息方式(源码级修改)

《Nginx屏蔽服务器名称与版本信息方式(源码级修改)》本文详解如何通过源码修改Nginx1.25.4,移除Server响应头中的服务类型和版本信息,以增强安全性,需重新配置、编译、安装,升级时需重复... 目录一、背景与目的二、适用版本三、操作步骤修改源码文件四、后续操作提示五、注意事项六、总结一、背景与

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码