我使用 FFmpeg 在我的 Raspberry PI 上录制视频。代码在这里:
ffmpeg -f video4linux2 -y -r 4 -i /dev/video0 -vf "drawtext=fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-Bold.ttf:expansion=strftime:text='%Y-%m-%d %H\\:%M\\:%S': fontcolor=white:box=1:boxcolor=black@0.8:x=w-text_w:y=h-line_h" -vframes 20 -vcodec mpeg4 out.mp4
我在终端中运行这段代码并且运行良好。但是我需要使用 Python 来运行它。然后我写了如下所示的代码:
from subprocess import Popen
from os import system
x = "drawtext=fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-Bold.ttf:expansion=strftime:text='%Y-%m-%d %H\\:%M\\:%S': fontcolor=white:box=1:boxcolor=black@0.8:x=w-text_w:y=h-line_h"
result = ['ffmpeg', '-f', 'video4linux2', '-y', '-r', '4', '-i', '/dev/video0', '-vf', x, '-vframes ','20', '-vcodec', 'mpeg4', 'out.mp4']
Popen(result)
它只工作很短的时间(绝对少于 1s)。有什么问题吗?
最佳答案
我想我明白了。看起来您遇到了 bash 空格问题。在命令行中,您将整个 -vf
选项括在引号中。在 python 脚本中,您将 x
创建为字符串; Popen
会像列表中的其他参数一样解释该字符串,并最终在实际命令运行中将其不加引号。在命令行上,这看起来像:
ffmpeg -f video4linux2 -y -r 4 -i /dev/video0 -vf drawtext=fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-Bold.ttf:expansion=strftime:text='%Y-%m-%d %H\\:%M\\:%S': fontcolor=white:box=1:boxcolor=black@0.8:x=w-text_w:y=h-line_h -vframes 20 -vcodec mpeg4 out.mp4
所以实际上,你会想要:
x = '"drawtext=fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-Bold.ttf:expansion=strftime:text=\'%Y-%m-%d %H\\:%M\\:%S\': fontcolor=white:box=1:boxcolor=black@0.8:x=w-text_w:y=h-line_h"'
否则,当实际由 bash 运行时,该参数将在日期格式的空白处拆分并导致一些意外行为。
(对不起,文字墙,只是想确保我没有混淆。)
关于python - 在 Raspberry PI 上用 Python 执行 FFmpeg 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22565311/