简介:CSDN博客专家、《Android系统多媒体进阶实战》作者
博主新书推荐:《Android系统多媒体进阶实战》🚀
Android Audio工程师专栏地址:Audio工程师进阶系列【原创干货持续更新中……】🚀
Android多媒体专栏地址:多媒体系统工程师系列【原创干货持续更新中……】🚀
专题一 二:AAOS车载系统+AOSP14系统攻城狮入门视频实战课🚀
专题三:Android14 Binder之HIDL与AIDL通信实战课🚀
专题四:Android15快速自定义与集成音效实战课🚀
专题五:Android15音频策略实战课🚀
专题六:Android15音频性能实战课(无声/杂音/断音/爆音实战案例)🚀
人生格言:人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
点击获取二维码
🍉🍉🍉文章目录🍉🍉🍉
- 🌻1.前言
- 🌻2.应用场景和用法
- 2.1查看容器和流信息
- 2.2函数原型与参数
- 🌻3.调用流程剖析
- 3.1从格式上下文读取信息
- 3.2它不负责探测或校验媒体
- 🌻4.实战案例
- 4.1打开输入并探测流信息
- 4.2打印输入格式摘要
- 4.3完整代码
- 🌻5.总结
🌻1.前言
本篇目的:理解
av_dump_format()如何读取AVFormatContext中的容器、流和元数据信息,并通过FFmpeg输入流程观察它输出的格式摘要。
打开媒体文件并获取流信息后,程序通常需要确认输入容器、时长、码率和各路音视频参数。av_dump_format()把这些信息写入FFmpeg日志,便于开发者检查探测结果。它只负责打印,不负责探测媒体、解码数据或改变流参数。
🌻2.应用场景和用法
2.1查看容器和流信息
av_dump_format()适合放在输入探测或输出封装配置之后,用来检查FFmpeg当前掌握的格式信息。
| 场景 | 调用时机 | 观察内容 |
|---|---|---|
| 输入文件探测 | avformat_find_stream_info()成功后 | 输入格式、时长、码率和流参数 |
| 多轨媒体分析 | 流信息探测后 | 音视频流编号、编码类型和时间基 |
| 输出封装检查 | 输出流和封装器配置完成后 | 输出格式及输出流参数 |
| 定位媒体信息异常 | 打开文件或协商参数后 | 上下文中实际存在的信息是否符合预期 |
函数将摘要写入FFmpeg日志系统,常见级别为AV_LOG_INFO。日志级别或回调配置会影响信息是否显示。
2.2函数原型与参数
voidav_dump_format(AVFormatContext*ic,intindex,constchar*url,intis_output);| 参数 | 含义 |
|---|---|
ic | 已填充输入或输出信息的AVFormatContext |
index | 日志中显示的文件或输出上下文编号 |
url | 输出摘要中显示的媒体地址或文件名 |
is_output | 为0表示输入,为非0表示输出 |
函数没有返回值,也不接管AVFormatContext的所有权。输入场景需要先打开媒体并探测流信息;输出场景应在输出格式和流信息已经准备后调用。它与相邻接口的分工如下:
| 接口 | 职责 |
|---|---|
avformat_open_input() | 打开输入并识别输入格式 |
avformat_find_stream_info() | 读取数据以补充流信息 |
av_dump_format() | 把当前上下文中的格式信息写入日志 |
avformat_close_input() | 关闭输入并释放输入上下文 |
🌻3.调用流程剖析
3.1从格式上下文读取信息
av_dump_format()根据is_output选择上下文中的输入格式或输出格式名称,再通过av_log()打印文件方向、编号和URL。
输入场景会额外打印时长、起始时间和码率。函数随后遍历章节、节目和普通流,并调用内部的流格式输出逻辑整理各流信息。输出摘要来自当前AVFormatContext及其关联的流参数,因此调用时机很重要:如果流探测尚未完成,摘要中就可能缺少信息。
3.2它不负责探测或校验媒体
av_dump_format()只根据传入上下文中已有的数据生成日志。它不会调用输入探测过程,也不会判断媒体能否完整解码,更不会保证日志显示的参数一定符合应用预期。
排查时应先确认avformat_open_input()和avformat_find_stream_info()的返回值,再观察摘要。如果输入信息未探测完成,优先检查探测流程;如果摘要内容与预期不同,则检查输入文件、流选择和上下文状态。
🌻4.实战案例
4.1打开输入并探测流信息
示例接收媒体路径作为命令行参数。调用av_dump_format()前,先通过avformat_open_input()打开文件,再通过avformat_find_stream_info()补充流信息。
4.2打印输入格式摘要
探测成功后,将输入上下文、文件编号、媒体路径和输入方向传给av_dump_format()。示例使用avformat_close_input()释放输入上下文。
4.3完整代码
#include<libavformat/avformat.h>#include<stdio.h>intmain(intargc,char*argv[]){AVFormatContext*format_context=NULL;intret;if(argc<2){fprintf(stderr,"请提供媒体文件路径\n");return1;}/* 打开输入文件并读取容器信息 */ret=avformat_open_input(&format_context,argv[1],NULL,NULL);if(ret<0){fprintf(stderr,"无法打开输入文件\n");return1;}/* 探测音视频流参数,再打印完整摘要 */ret=avformat_find_stream_info(format_context,NULL);if(ret<0){fprintf(stderr,"无法获取流信息\n");avformat_close_input(&format_context);return1;}/* is_output为0,表示当前上下文用于输入 */av_dump_format(format_context,0,argv[1],0);/* 释放输入上下文及其关联资源 */avformat_close_input(&format_context);return0;}🌻5.总结
av_dump_format()根据AVFormatContext当前已有的输入或输出信息生成格式摘要日志,不负责打开媒体、探测流或解码数据。