FFmpeg转换器转码结束分析

本文详细分析了FFmpeg转换器在读取输入文件结尾时的结束转码逻辑,涉及AVERROR_EOF错误码在不同API函数中的应用,包括解码器、滤镜和编码器的处理流程。在读取到输入文件结尾后,FFmpeg如何关闭流、清空缓冲并最终完成转换过程。
摘要由CSDN通过智能技术生成

ffmpeg.exe 转换器,在以下 3 种情况下会结束转码,或者结束转封装。

1,读取到了输入文件的结尾。

2, 在命令行对输入文件使用了 -t 60 选项,限制只读取 60 秒的输入文件来处理,处理完 60秒的数据就会退出。

3, 在命令行对输出文件使用了 -t 60 选项,限制只输出 60 秒的数据到文件保存,一旦存储够了 60 秒,就会自动退出。

第一种情况是最常见的,第二,第三种情况是通过 trim 滤镜 实现的。

本文主要分析第一种情况的逻辑,第二第三种请读者自行探索。

下面的 API 函数都会用一个 AVERROR_EOF 的错误码来代表操作结束了。

1, av_read_frame(),AVERROR_EOF 代表已经读取到输入文件的结尾。

2, avcodec_send_packet(),向解码器发送 AVPacket 的时候也有可能返回 AVERROR_EOF,通常是因为你之前已经给这个解码器发送过一次 pkt == null 或者 pkt.size == 0 。你第二次再往解码器发送一个 null 的 AVPacket 或者 size 等于 0 的 AVPacketavcodec_send_packet() 函数就会返回 AVERROR_EOF

3, avcodec_receive_frame(),从解码器读取 AVFrame 也有可能会返回 AVERROR_EOF,不过前提是,你之前已经给这个解码器发送过一次 pkt == null 或者 pkt.size == 0。发送完这个 null 的 AVPacket 之后,一直读解码器,读到没有数据了,就会返回 AVERROR_EOF。

avcodec_receive_frame() 函数其实有两个错误码,一个是 ERROR(EAGAIN),一个是 AVERROR_EOF
ERROR(EAGAIN),代表解码器暂时没有数据可读,你要输入更多的 AVPacket
AVERROR_EOF,代表解码器解码结束了,没有更多的 AVPacket 来输入了。


4, av_buffersink_get_frame_flags(),从 buffersink 出口滤镜读取 AVFrame 也有可能会返回 AVERROR_EOF,不过前提是已经用 av_buffersrc_close() 关闭了所有的 入口滤镜

5, avfilter_graph_request_oldest(),这个函数是返回 滤镜容器里面还有多少 AVFrame 还未读出来,也可能会返回 AVERROR_EOF,前提是已经用 av_buffersrc_close() 关闭了所有的 入口滤镜,或者使用了 trim 滤镜,到时间点就会自动返回 AV

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值