ffmpeg drawtext 文本文件中各行之间的额外行

ffmpeg drawtext 文本文件中各行之间的额外行

使用 drawtext 显示文本文件时,我得到了多余的行。原始的 text.txt 文件如下所示:

在此处输入图片描述

但是当我使用 ffplay 或 ffmpeg 时使用类似这样的方法:

ffplay -f lavfi "color=yellow:s=200x450,drawtext=textfile='text.txt':font='arial black':fontsize=16:line_spacing=0"

我明白了:

在此处输入图片描述

https://i.ibb.co/L6XqG5Y/text.jpg

有人知道如何删除实际行之间的多余行吗?我已经在使用 line_spacing=0

ffmpeg 版本:ffmpeg 版本 N-113785-gfe340c3244-20240223 版权所有 (c) 2000-2024 FFmpeg 开发者

操作系统:Windows 11 23H2

答案1

经过一些测试,我发现 Windows 样式的行尾会导致多余的空白行。在文本文件中使用 Unix 样式的行尾:

1\n
2\n
3\n

并不是:

1\r\n
2\r\n
3\r\n

为了测试,使用 Notepad++。菜单“编辑”->“EOL 转换”-> Unix (LF)。

编程方面有很多选择。有一个名为 dos2unix 的命令行工具。大多数编程和脚本语言都能够为文本文件添加 Unix 样式的行尾

答案2

到目前为止我发现了两种可能的解决方案:

1. 对 line_spacing 选项使用负值,例如:line_spacing=-10

2.将文本文件转换为 Unix 风格,仅使用换行标记,而不是像 Windows 中那样使用换行符 + Enter。

就像 Rens 在他的回答中所说的那样,如果你将文本文件转换为 unix 样式,你就不会在每行之间看到这些空行。

我找到了一种使用 powersell 将文本文件转换为 unix 样式的方法,就像 Joey 在这个主题上解释的那样:

https://stackoverflow.com/questions/8852682/convert-file-from-windows-to-unix-through-powershell-or-batch

Get-ChildItem *.txt | ForEach-Object {
  # get the contents and replace line breaks by U+000A
  $contents = [IO.File]::ReadAllText($_) -replace "`r`n?", "`n"
  # create UTF-8 encoding without signature
  $utf8 = New-Object System.Text.UTF8Encoding $false
  # write the text back
  [IO.File]::WriteAllText($_, $contents, $utf8)
}

对于我来说代码有一点不同,因为我只需要转换 1 个文件:

[IO.File]::WriteAllText('c:\users\ricardo\desktop\text.txt',([IO.File]::ReadAllText('c:\users\ricardo\desktop\text.txt') -replace "`r`n", "`n") ,(New-Object System.Text.UTF8Encoding $false))

我不记得之前曾经做过任何这些解决方案,所以这可能不是 Windows 的问题,而可能是 Windows 的更新或我正在使用的 ffmpeg 版本的更新,就像之前在问题中列出的一样。

相关内容