我怎样才能知道我的编码文件有多大?

Fid*_*del 10 ffmpeg

我正在使用以下命令转换视频:

ffmpeg -i "input.avi" -vcodec mpeg4 -r 15 -sameq "output.avi"
Run Code Online (Sandbox Code Playgroud)

但是我只对 output.avi 的文件大小感兴趣。有没有我可以给 ffmpeg 的命令,这样它实际上不会写一个文件,而是告诉我它有多大?

slh*_*hck 12

编码之前,您无法真正估计视频文件的大小。由于编解码器的工作方式,这是不可能的。它为每一帧分配一定数量的比特,但这个数量通常取决于帧本身的内容。

但是,有一些解决方案。


1.便宜的:

让它编码,检查文件大小并再次删除文件

2.“解决方法”:

使用简单的计算器自行计算文件大小。这仅在使用恒定比特率时有效。例如,将其指定-b 500k为 500 kBit/s。您必须确保指定编解码器可以使用的比特率。例如,没有办法压缩200k比特率为 in的 1080p 视频mpeg4,因为它需要的远不止这些。

3.“真正”的解决方案:

我想到的最后一个选项是将输出/dev/null传输到管道并测量管道文件的大小。但是,这不适用于所有格式,因为 FFmpeg 需要一个可查找的文件来生成有效的输出。

尽管如此,对于 AVI,它仍然运行良好。下面的命令将通过管道进入/dev/null,从而不会留下文件本身的痕迹,最后输出编码后的文件大小。

ffmpeg -i input.avi -vcodec mpeg4 -b 3M -f avi pipe:1 | pv > /dev/null
Run Code Online (Sandbox Code Playgroud)

...例如像这样:

5.42MB 0:00:10 [ 521kB/s]
Run Code Online (Sandbox Code Playgroud)

它有什么作用?

  • 您必须使用-f avi. 否则 FFmpeg 将不知道使用哪种格式。
  • pipe:1告诉 FFmpeg将输出写入管道
  • 我们将此输出提供给管道查看器,简称pv
  • 管道查看器将测量传输的大小并将您的视频输出到/dev/null.

唯一的小缺点是在视频完成之前输出看起来有点奇怪。我还没有找到一种方法来完全禁用 FFmpeg 的输出开始pv使用它。