我尝试使用drawtext
FFmpeg 过滤器通过以下命令在视频底部插入帧计数器:
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 控制台,解决方案会更加优雅。