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 的 AVPacket
,avcodec_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