FFMpeg 如何从远程 s3 url 读取

FFMpeg 如何从远程 s3 url 读取

我很好奇 FFMpeg 如何从远程 URL(例如,aws s3 预签名 URL)读取视频文件。

  • 它是先分块下载文件,然后逐块进行处理吗?
  • 或者它会下载一些字节或帧然后继续处理它吗?
  • 或者它在内部传输文件内容并开始处理它?

因为我观察到,只要我触发命令,它就会开始处理,并且从第一秒开始就可以看到进度。它没有显示由于下载阶段自然产生的任何延迟。我甚至尝试过将其用于更大的 GB 视频文件。

示例命令:

ffmpeg -i "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4" -c:v libx264 -vf scale=1024:576 -c:a aac output.mp4

只是想了解工作原理和幕后情况。如果您能给我提供一些资源和文档,让我可以了解更多相关信息,我将不胜感激。

答案1

每一个HTTP 客户端通过流式传输文件来工作——这就是下载的方式工作。通过 HTTP 下载文件只是“流式传输到磁盘上的文件”,因为 HTTP 客户端不断接收新数据(通常以 IP 数据包大小的块形式,每个块大约 1.5kB)并且必须在接收时将其写出(带有一些缓冲)。

因此在大多数情况下,没有“保存到磁盘”步骤,而是解码器直接使用 HTTP 客户端接收的数据。

有时文件格式可能与流解码不完全兼容(例如,如果作者忘记使用 +faststart 对其进行编码,MP4 元数据可能会存储在文件末尾而不是开头),在这种情况下,FFmpeg 将需要进行额外的 HTTP“范围”请求以直接从文件内的特定位置接收数据。

相关内容