`ffplay` 如何检测到来自管道连接的 ffmpeg 的声音文件已经完成?

How is `ffplay` detecting that the sound file from pipe-connected ffmpeg has finished?

以下代码播放 "sample.mp3",然后终止。这太令人惊讶了,因为通过管道传递的数据是二进制流,所以ffplay应该不知道"sample.mp3"的持续时间,但它在到达终点后立即终止。

$ cat sample.mp3 | ffmpeg -i pipe:0 -f mp3 pipe:1 | ffplay -autoexit -

ffplay 正在监视什么二进制信号来检测 sample.mp3 的终端?

-f mp3 生成一个混合文件,即它不是 MP3 数据的原始流,而是结构化输入,即在容器中。可能有一个 header & trailer,每个 MP3 数据块都被加框。

当 ffplay 接收到文件或管道输入时,它会探测输入并确定容器类型。然后它将数据传递给该多路分解器以解析流。在每个解复用器中,就像 MP3 解复用器一样,有一个例程会发出信号 End Of F如果满足某些条件,则 ile。对于 MP3,如果将缓冲数据分解为数据包的函数失败,那就是 EOF。