FFmpeg 帧计数器 + 分辨率/比特率/FPS 框

FFmpeg 帧计数器 + 分辨率/比特率/FPS 框

我尝试使用drawtextFFmpeg 过滤器通过以下命令在视频底部插入帧计数器:

ffmpeg -i input.mp4 -vf "drawtext=fontfile=C\\:/Windows/fonts/consola.ttf: text='Frame\\: %{frame_num}': start_number=1: x=(w-tw)/2: y=h-(2\*lh): fontcolor=black: fontsize=50: box=1: boxcolor=white: boxborderw=5" -c:a copy output.mp4

到目前为止一切正常。我想知道如何在视频顶部插入分辨率/比特率框,如下图所示:

有问题的框架

答案1

没有用于绘制分辨率比特率和帧速率的内置选项,所以我们必须定义一个环境变量,并将其传递给 FFmpeg。

在 Windows shell 中格式化字符串很混乱,并且以下“单行”示例远非完美:

for /f "tokens=1" %i in ('ffprobe "-v" "error" "-select_streams" "v:0" "-show_entries" "stream=width,height" "-of" "csv=s=x:p=0" "input.mp4"') do set "resolution=%i" && for /f "tokens=1" %i in ('ffprobe "-v" "error" "-select_streams" "v:0" "-show_entries" "stream=bit_rate" "-of" "csv=p=0" "input.mp4"') do set "bitrate=%i" && for /f "tokens=1" %i in ('ffprobe "-v" "error" "-select_streams" "v:0" "-show_entries" "stream=r_frame_rate" "-of" "csv=p=0" "input.mp4"') do set "framerate=%i" && set str='%resolution% / %bitrate% bps / %framerate% fps' && ffmpeg -y -i input.mp4 -vf "drawtext=fontfile=C\\:/Windows/fonts/consola.ttf:text='%str%':x=(w-tw)/2:y=h-(2\*lh):fontcolor=black:fontsize=50:box=1: boxcolor=white:boxborderw=5" -c:a copy output.mp4


  • 使用 FFprobe 获取分辨率、比特率和帧速率(我没有尝试将比特率从 bps 转换为 kbps)。
    添加-pretty参数将速率格式化为1.672451 Mbit/s
  • 按照描述将 FFmpeg 的输出分配给变量这里(所有的解决方案都不是很优雅)。
  • set str='%resolution% / %bitrate% bps / %framerate% fps'- 将最终的字符串格式化为环境变量str
  • text='%str%'绘制变量的内容str
  • &&用于将 4 条命令连接成一行。
    注意:FF探针执行了 3 次,因为看起来没有在元素之间添加自定义文本的选项(我们最好寻找更优雅的解决方案)。

可以使用 shell 字符串操作/从中删除60/1这里set frate=%framerate:~0,-2%

使用drawtext两次过滤器(以逗号分隔)来绘制两个文本框。

--

输出示例:
在此处输入图片描述


注意:
使用 Python 之类的脚本语言而不是 Windows 控制台,解决方案会更加优雅。

相关内容