【问题标题】:FFmpeg drawtext over multiple linesFFmpeg 在多行上绘制文本
【发布时间】:2011-11-21 15:05:17
【问题描述】:

我有代码:

import subprocess , os

ffmpeg = "C:\\ffmpeg_10_6_11.exe"
inVid = "C:\\test_in.avi"
outVid = "C:\\test_out.avi"

if os.path.exists( outVid ):
os.remove( outVid )
proc = subprocess.Popen(ffmpeg + " -i " + inVid + ''' -vf drawtext=fontfile=/Windows/Fonts/arial.ttf:text="onLine1 onLine2 onLine3":fontcolor=white:fontsize=20 -y ''' + outVid , shell=True, stderr=subprocess.PIPE)
proc.wait()
print proc.stderr.read()
os.startfile( outVid )

将文本写入视频文件。但我想写出多行文本,而不是全部写在一行上。

请帮忙。谢谢

【问题讨论】:

    标签: ffmpeg line multiline drawtext


    【解决方案1】:

    这个答案对您来说可能有点晚了,但是您可以通过使用 [in] 标记并使用逗号列出每个绘图文本来在一个文件上指定多个绘图文本。如果您通过各自的定位方法定位每个绘图文本,这允许您使用多行。在您的示例中,命令行看起来像这样(将第一行放在屏幕中间,并将随后的每一行向下放置 25 个像素):

    ffmpeg -i test_in.avi -vf "[in]drawtext=fontsize=20:fontcolor=White:fontfile='/Windows/Fonts/arial.ttf':text='onLine1':x=(w)/2:y=(h)/2, drawtext=fontsize=20:fontcolor=White:fontfile='/Windows/Fonts/arial.ttf':text='onLine2':x=(w)/2:y=((h)/2)+25, drawtext=fontsize=20:fontcolor=White:fontfile='/Windows/Fonts/arial.ttf':text='onLine3':x=(w)/2:y=((h)/2)+50[out]" -y test_out.avi
    

    【讨论】:

    • 工作 :) 但有点繁琐。
    【解决方案2】:

    查看ffmpeg(vs_drawtext.c)中的源码:

    static inline int is_newline(uint32_t c)
    {
        return c == '\n' || c == '\r' || c == '\f' || c == '\v';
    }
    

    因此您可以尝试在与^L^K 字符相对应的文本行中插入\f\v。例如:

    -filter_complex "[in] drawtext=fontsize=40:fontcolor=white:fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf:x=(w-tw)/2:y=(h-th)/2:box=1:boxcolor=black@0.5:text='two^Llines'[out]"
    

    ^L 是实际的 Ctrl-L 字符,而不是 ^L 显然。

    【讨论】:

    • +1 用于引用源代码。欢迎使用 Stack Overflow!
    • 我不知道这是否是特定于版本的,但据我所知,没有办法用这个解决方案控制行之间的间距,我最终使用了@Ben一个同时使用h:{int} 命令控制间距。否则,这些线最终会被绘制在彼此之上,或者至少如此接近以至于无法阅读。
    • 要在大多数终端输入^L,您可以先输入Ctrl-V,然后按Ctrl-L
    • 这里是出处,如果有人想看看:github.com/FFmpeg/FFmpeg/blob/…
    • 我不能让它工作,有人可以把其他网站上的字符发给我吗?
    【解决方案3】:

    我简单地在命令中添加了新行,ffmpeg 正确处理了它。

    ffmpeg -i input.avi -vf "[in]drawtext=fontsize=20:text='hello
    world':x=(w)/2:y=(h)/2:fontcolor=white[out]" -y out.mp4
    

    无需 Ctrl+L,需要 Ctrl+K hack!

    即我只是在“你好”之后按了 Enter。

    您可以编辑脚本文件甚至在 bash 命令行中进行。

    【讨论】:

      【解决方案4】:

      通过指定“textfile”参数并将我的文本放入此文件中,我已设法从命令行使其工作。

      请参阅http://ffmpeg.org/libavfilter.html#drawtext 以获取更多帮助。在 windows 上使用 ffmpeg build N-35057-g2c44aed,但重要的是你有最新版本的 libavfilter。

      【讨论】:

      • 是的,我已经将它作为一种解决方法,但我不喜欢我的脚本不断地制作和删除文件的事实。顺便说一句,您还可以多次调用 drawtext 标志,并在 Y 轴上偏移文本以创建新行。我已经测试并得到了它的工作,但正如我的问题所述,我想用一个 drawtext 标志添加多行,而不必创建外部文件。感谢您抽出宝贵时间回答。非常感谢:)
      【解决方案5】:

      TEXT=$(printf "$1")

      在 shell 脚本中

      将文本作为 shell 脚本参数,包括换行符

      【讨论】:

        猜你喜欢
        • 2017-01-11
        • 2011-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-10
        • 2019-03-18
        • 2014-10-16
        相关资源
        最近更新 更多