python - 在 Raspberry PI 上用 Python 执行 FFmpeg 命令

标签 python linux ffmpeg raspberry-pi popen

我使用 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/

相关文章:

ffmpeg - 如何解决ffmpeg视频合并提示参数不匹配的问题

python - 在python中将基数为10的整数列表转换为基数为4的列表

python - 使用 conda 的 redis 安装不工作 ModuleNotFoundError 没有名为 'redis' 的模块

linux - 从给定日期获取上周的日期

linux - dd命令是否会跳转emmc的坏 block ?

linux - 使用 rsync 下载并使用 gunzip 解压,然后将所有内容放在一个管道中

php - FFmpeg libavfilter水印?

php - 使用 PHP 处理时 FFmpeg "Could not open file"错误信息

python - Django:如何在 FileField 中保存原始文件名?

Python easy_install 给出 [errno13]