Linux FFmpeg深度解析之av_find_best_stream调用流程与实战(四)

发布时间:2026/10/28 1:51:24
Linux FFmpeg深度解析之av_find_best_stream调用流程与实战(四) 简介CSDN博客专家、《Android系统多媒体进阶实战》作者博主新书推荐《Android系统多媒体进阶实战》Android Audio工程师专栏地址Audio工程师进阶系列【原创干货持续更新中……】Android多媒体专栏地址多媒体系统工程师系列【原创干货持续更新中……】专题一 二AAOS车载系统AOSP14系统攻城狮入门视频实战课专题三Android14 Binder之HIDL与AIDL通信实战课专题四Android15快速自定义与集成音效实战课专题五Android15音频策略实战课专题六Android15音频性能实战课(无声/杂音/断音/爆音实战案例)人生格言人生从来没有捷径只有行动才是治疗恐惧和懒惰的唯一良药.更多原创,欢迎关注Android系统攻城狮点击获取二维码文章目录1.前言2.应用场景和用法2.1按媒体类型选择目标流2.2函数原型与返回语义3.调用流程剖析3.1筛选候选流并按优先级比较3.2流选择与解码器创建的边界4.实战案例4.1打开输入并准备流信息4.2检查选择结果并读取对应包4.3完整代码5.总结1.前言本篇目的理解av_find_best_stream()如何按照媒体类型和流信息选择候选流说明返回索引与可选解码器之间的关系并用音频输入示例检查选择结果。一个媒体文件可以包含多条视频、音频或字幕流。应用需要先选定目标流才能创建对应的解码器上下文并处理该流的包。av_find_best_stream()负责选择流索引并可选地返回匹配的解码器它不打开解码器也不读取后续媒体包。已读取流信息的AVFormatContextav_find_best_stream按媒体类型筛选候选流返回流索引和可选解码器应用创建解码路径2.应用场景和用法2.1按媒体类型选择目标流应用可在打开输入并读取流信息后按媒体类型选择一路默认音频、视频或字幕流。选出的流索引可用于定位AVStream再读取其中的codecpar配置解码器。使用场景调用方式结果选择默认视频流type设为AVMEDIA_TYPE_VIDEO返回选中视频流的索引选择默认音频流type设为AVMEDIA_TYPE_AUDIO返回选中音频流的索引指定流索引wanted_stream_nb传入非负索引只尝试该索引对应的流优先选择同节目流设置related_stream并令wanted_stream_nb为-1若关联节目存在先在该节目范围内搜索同时获取解码器decoder_ret传入有效指针成功时一并返回可用的AVCodec2.2函数原型与返回语义函数原型如下intav_find_best_stream(AVFormatContext*ic,enumAVMediaTypetype,intwanted_stream_nb,intrelated_stream,constAVCodec**decoder_ret,intflags);参数含义ic已打开并包含流信息的格式上下文type要选择的媒体类型wanted_stream_nb指定流索引传入-1表示自动选择related_stream用于优先搜索同一节目中相关流的索引不指定时传入-1decoder_ret可选的解码器输出指针不需要函数检查解码器时可传入NULLflags当前没有定义可用标志通常传入0函数成功时返回非负流索引。没有匹配类型的流时返回AVERROR_STREAM_NOT_FOUND找到流但要求解码器、且没有可用解码器时返回AVERROR_DECODER_NOT_FOUND。decoder_ret为非空时函数成功返回就保证该指针指向有效的AVCodec。它只返回解码器描述对象不会分配AVCodecContext也不会调用avcodec_open2()。3.调用流程剖析3.1筛选候选流并按优先级比较在FFmpeg6.1实现中函数遍历上下文中的流当指定related_stream且未指定固定流索引时如果能找到对应节目就先在该节目包含的流索引范围内搜索。每个候选流先按codecpar-codec_type与请求类型匹配。指定了wanted_stream_nb时其他索引会被跳过。音频候选还要求声道布局和采样率有效。若decoder_ret非空函数会查找候选流的默认解码器找不到解码器的候选流不会被选中。其余候选流按流Disposition、已读取的编解码帧数和码率等信息比较最终返回优先级最高的流索引。是否AVFormatContext中的流按节目范围和指定索引筛选匹配媒体类型和必要参数是否要求解码器查找候选流的默认解码器直接参与流优先级比较比较Disposition帧数和码率返回流索引和可选解码器3.2流选择与解码器创建的边界典型调用顺序是先使用avformat_open_input()打开输入再调用avformat_find_stream_info()读取流信息然后使用av_find_best_stream()选流。av_find_best_stream()本身不会调用av_read_frame()读取媒体包也不会创建解码器上下文。应用需要用返回索引访问ic-streams[index]再将该流的codecpar复制到AVCodecContext并打开解码器。如果decoder_ret传入NULL函数不会因为缺少解码器而跳过候选流如果传入非空指针则解码器是否可用会参与候选筛选。指定固定流索引时选择也不会自动改用其他流。4.实战案例4.1打开输入并准备流信息程序接收一个媒体文件路径打开输入并读取流信息。它请求选择默认音频流并让函数同时返回该流的默认解码器。4.2检查选择结果并读取对应包程序通过返回索引取得AVStream打印流索引和解码器名称。随后调用av_read_frame()遍历输入只统计stream_index等于选中索引的包以确认流选择结果与实际解封装包相对应。4.3完整代码#includelibavcodec/avcodec.h#includelibavformat/avformat.h#includelibavutil/error.h#includestdio.hintmain(intargc,char**argv){AVFormatContext*fmt_ctxNULL;AVPacket*pktNULL;constAVCodec*decoderNULL;AVStream*audio_stream;intaudio_index;intret;intread_ret;int64_taudio_packet_count0;if(argc2){fprintf(stderr,Usage: %s input\n,argv[0]);return1;}/* 打开输入并读取流信息供后续候选筛选使用 */retavformat_open_input(fmt_ctx,argv[1],NULL,NULL);if(ret0)gotoend;retavformat_find_stream_info(fmt_ctx,NULL);if(ret0)gotoend;/* 自动选择音频流并同时要求返回可用解码器 */audio_indexav_find_best_stream(fmt_ctx,AVMEDIA_TYPE_AUDIO,-1,-1,decoder,0);if(audio_index0){retaudio_index;gotoend;}/* 返回值是流索引解码器仍未打开 */audio_streamfmt_ctx-streams[audio_index];printf(audio stream index%d codec%s\n,audio_index,decoder-name);pktav_packet_alloc();if(pktNULL){retAVERROR(ENOMEM);gotoend;}/* 通过包上的stream_index验证被选中的流 */while((read_retav_read_frame(fmt_ctx,pkt))0){if(pkt-stream_indexaudio_stream-index)audio_packet_count;av_packet_unref(pkt);}if(read_retAVERROR_EOF){printf(selected audio packet count%lld\n,(longlong)audio_packet_count);ret0;}else{retread_ret;}end:av_packet_free(pkt);avformat_close_input(fmt_ctx);returnret0?1:0;}5.总结av_find_best_stream()根据媒体类型和流信息选择流索引并可选返回默认解码器但不创建解码器上下文或读取媒体包。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询