FFmpeg丢弃音频流—FFmpeg API教程

作者:罗上文,微信:Loken1,公众号:FFmpeg弦外之音

本文的代码下载地址:GitHub,编译环境是 Qt 5.15.2 跟 MSVC2019_64bit 。


我们在处理音视频文件的时候,有时候仅仅需要处理视频,不需要处理音频,但是正常调用 av_read_frame 还是会返回音频数据包。如果我们要丢弃音频包,可以有两种做法:

1,av_read_frame 读取到 AVPacket ,判断 AVPacket 的数据类型,如果是音频,就丢弃。如果是视频,就解码。

2,设置 AVStreamdiscard 属性为 AVDISCARD_ALL,这样 av_read_frame 就不会返回 这个流的 AVPacket

第一种方法比较简单,所以不做过多讲解,第二种方法可能会带来少许的性能提升,第二种方法的示例代码如下:

1-1

可以看到,如果设置了 discard 属性为 AVDISCARD_ALLav_read_frame 函数就不会返回 stream_index 为 1 的 AVPacket

在 本文的 juren-30s.mp4 示例文件,stream[1] 就是音频流,而 stream[0] 是视频流。


即便设置了AVDISCARD_ALL,在一种情况里面还是会返回 stream[1]AVPacket,这种情况就是,你之前曾经调过 find_stream_infofind_stream_info 这个函数会读取数据包来分析流信息,但是他读取之后不是丢弃,而是会放进去缓存里面,av_read_frame 的时候就可以直接从内存直接拿到缓存数据,不需要读磁盘文件。

就因为在缓存里面有数据,即便你设置了 AVDISCARD_ALL,还是会返回一小部分 stream[0]AVPacket,只是一小部分。读完缓存就不会再读。

我也不清楚这个是 FFmpeg 的 bug 还是 特性



感谢 NETINT(镕铭微电子) 赞助《FFmpeg原理》免费版一书的服务器费用,下面是 VPU 产品介绍

版权所属 xianwanzhiyin.net 罗上文 2024 all right reserved,powered by Gitbook该文件修订时间: 2023-05-17 11:39:54

results matching ""

    No results matching ""