使用 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 在这个主题上解释的那样:
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 版本的更新,就像之前在问题中列出的一样。