使用 ffmpeg-python 库捕获网络摄像头
Capture webcam using ffmpeg-python library
您好,我正在尝试使用 ffmpeg-python 包装器库 (https://github.com/kkroening/ffmpeg-python) 通过 python 捕获网络摄像头流
我有一个有效的 ffmpeg 命令是:
ffmpeg -f v4l2 -video_size 352x288 -i /dev/video0 -vf "drawtext='fontfile=fonts/FreeSerif.ttf: text=%{pts} : \
x=(w-tw)/2: y=h-(2*lh): fontcolor=white: box=1: boxcolor=0x00000000@1'" -an -y -t 15 videotests/out_localtime8.mp4
这会捕获分辨率为 352x288 的 15 秒视频,并在视频的底部中央写入时间戳。
为了使用 ffmpeg-python 库,我只是试图让 drawtext 过滤器正常工作,这是我的脚本:
#!/usr/bin/env python
import ffmpeg
stream = ffmpeg.input('videotests/example.mov')
stream = ffmpeg.filter_(stream,'drawtext',("fontfile=fonts/FreeSerif.ttf:text=%{pts}"))
stream = ffmpeg.output(stream, 'videotests/output4.mp4')
ffmpeg.run(stream)
错误是
[Parsed_drawtext_0 @ 0x561f59d494e0] Either text, a valid file or a timecode must be provided
[AVFilterGraph @ 0x561f59d39080] Error initializing filter 'drawtext' with args 'fontfile\\=fonts/FreeSerif.ttf\\:text\\=%{pts}'
Error initializing complex filters.
Invalid argument
上面看起来至少达到了ffmpeg但是参数格式不正确,如何更正?
或者,当我试图拆分参数以仅传递其中一个参数时,我得到了一个不同的错误,如下所示:
stream = ffmpeg.filter_(stream,'drawtext',('text=%{pts}'))
错误是
subprocess.CalledProcessError: Command '['ffmpeg', '-i', 'videotests/example.mov', '-filter_complex', "[0]drawtext=(\\\\\\\'text\\\\\\=%{pts}\\\\\\\'\,)[s0]", '-map', '[s0]', 'videotests/output4.mp4']' returned non-zero exit status 1.
怎么会有这么多反斜杠?请就如何进行提出任何建议。
谢谢
我最终找出了正确的语法。这是一个工作示例
#!/usr/bin/env python
import ffmpeg
stream = ffmpeg.input('videotests/example.mov')
stream = ffmpeg.filter_(stream,'drawtext',fontfile="fonts/hack/Hack-Regular.ttf",text="%{pts}",box='1', boxcolor='0x00000000@1', fontcolor='white')
stream = ffmpeg.output(stream, 'videotests/output6.mp4')
ffmpeg.run(stream)
语法是
ffmpeg.filter_(<video stream name>,'<filter name>',filter_parameter_name='value',<filter_parameter_name>=value)
必要时对 filter_parameter_name 值使用引号。
希望这对某人有所帮助。
第 1 步:为 ffmpeg 设置环境变量。
第 2 步:下面的代码将有助于在 python 中使用 ffmpeg 捕获图像和视频及其当前日期和时间。
import subprocess
from datetime import datetime
import time
class Webcam:
def Image(self):
try:
user = int(input("How many Images to be captured:"))
except ValueError:
print("\nPlease only use integers")
for i in range (user):
subprocess.call("ffmpeg -f vfwcap -vstats_file c:/test/log"+ datetime.now().strftime("_%Y%m%d_%H%M%S") +".txt -t 10 -r 25 -i 0 c:/test/sample"+ datetime.now().strftime("_%Y%m%d_%H%M%S") +".jpg")
time.sleep(3)
def Video(self):
try:
user = int(input("How many videos to be captured:"))
except ValueError:
print("\nPlease only use integers")
for i in range (user):
subprocess.call("ffmpeg -f vfwcap -vstats_file c:/test/log"+ datetime.now().strftime("_%Y%m%d_%H%M%S") +".txt -t 10 -r 25 -i 0 c:/test/sample"+ datetime.now().strftime("_%Y%m%d_%H%M%S") +".avi")
time.sleep(5)
Web=Webcam()
print ("press 1 to capture image")
print ("Press 2 to capture video")
choose = int(input("Enter choice:"))
if choose == 1:
Web.Image()
elif choose == 2:
Web.Video()
else:
print ("wrong choose")
import subprocess : 用于调用FFMPEG命令。
subprocess 是 python
提供的内置模块
您好,我正在尝试使用 ffmpeg-python 包装器库 (https://github.com/kkroening/ffmpeg-python) 通过 python 捕获网络摄像头流 我有一个有效的 ffmpeg 命令是:
ffmpeg -f v4l2 -video_size 352x288 -i /dev/video0 -vf "drawtext='fontfile=fonts/FreeSerif.ttf: text=%{pts} : \
x=(w-tw)/2: y=h-(2*lh): fontcolor=white: box=1: boxcolor=0x00000000@1'" -an -y -t 15 videotests/out_localtime8.mp4
这会捕获分辨率为 352x288 的 15 秒视频,并在视频的底部中央写入时间戳。
为了使用 ffmpeg-python 库,我只是试图让 drawtext 过滤器正常工作,这是我的脚本:
#!/usr/bin/env python
import ffmpeg
stream = ffmpeg.input('videotests/example.mov')
stream = ffmpeg.filter_(stream,'drawtext',("fontfile=fonts/FreeSerif.ttf:text=%{pts}"))
stream = ffmpeg.output(stream, 'videotests/output4.mp4')
ffmpeg.run(stream)
错误是
[Parsed_drawtext_0 @ 0x561f59d494e0] Either text, a valid file or a timecode must be provided
[AVFilterGraph @ 0x561f59d39080] Error initializing filter 'drawtext' with args 'fontfile\\=fonts/FreeSerif.ttf\\:text\\=%{pts}'
Error initializing complex filters.
Invalid argument
上面看起来至少达到了ffmpeg但是参数格式不正确,如何更正?
或者,当我试图拆分参数以仅传递其中一个参数时,我得到了一个不同的错误,如下所示:
stream = ffmpeg.filter_(stream,'drawtext',('text=%{pts}'))
错误是
subprocess.CalledProcessError: Command '['ffmpeg', '-i', 'videotests/example.mov', '-filter_complex', "[0]drawtext=(\\\\\\\'text\\\\\\=%{pts}\\\\\\\'\,)[s0]", '-map', '[s0]', 'videotests/output4.mp4']' returned non-zero exit status 1.
怎么会有这么多反斜杠?请就如何进行提出任何建议。
谢谢
我最终找出了正确的语法。这是一个工作示例
#!/usr/bin/env python
import ffmpeg
stream = ffmpeg.input('videotests/example.mov')
stream = ffmpeg.filter_(stream,'drawtext',fontfile="fonts/hack/Hack-Regular.ttf",text="%{pts}",box='1', boxcolor='0x00000000@1', fontcolor='white')
stream = ffmpeg.output(stream, 'videotests/output6.mp4')
ffmpeg.run(stream)
语法是
ffmpeg.filter_(<video stream name>,'<filter name>',filter_parameter_name='value',<filter_parameter_name>=value)
必要时对 filter_parameter_name 值使用引号。
希望这对某人有所帮助。
第 1 步:为 ffmpeg 设置环境变量。
第 2 步:下面的代码将有助于在 python 中使用 ffmpeg 捕获图像和视频及其当前日期和时间。
import subprocess
from datetime import datetime
import time
class Webcam:
def Image(self):
try:
user = int(input("How many Images to be captured:"))
except ValueError:
print("\nPlease only use integers")
for i in range (user):
subprocess.call("ffmpeg -f vfwcap -vstats_file c:/test/log"+ datetime.now().strftime("_%Y%m%d_%H%M%S") +".txt -t 10 -r 25 -i 0 c:/test/sample"+ datetime.now().strftime("_%Y%m%d_%H%M%S") +".jpg")
time.sleep(3)
def Video(self):
try:
user = int(input("How many videos to be captured:"))
except ValueError:
print("\nPlease only use integers")
for i in range (user):
subprocess.call("ffmpeg -f vfwcap -vstats_file c:/test/log"+ datetime.now().strftime("_%Y%m%d_%H%M%S") +".txt -t 10 -r 25 -i 0 c:/test/sample"+ datetime.now().strftime("_%Y%m%d_%H%M%S") +".avi")
time.sleep(5)
Web=Webcam()
print ("press 1 to capture image")
print ("Press 2 to capture video")
choose = int(input("Enter choice:"))
if choose == 1:
Web.Image()
elif choose == 2:
Web.Video()
else:
print ("wrong choose")
import subprocess : 用于调用FFMPEG命令。
subprocess 是 python
提供的内置模块