使用ffmpeg-python库捕获网络摄像头

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用ffmpeg-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("
Please 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("
Please 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")

以上是关于使用ffmpeg-python库捕获网络摄像头的主要内容,如果未能解决你的问题,请参考以下文章

如何使用小程序从 Java 中的网络摄像头捕获视频?

使用图片框从网络摄像头捕获图像

在 .Net Core 2.0 中从网络摄像头捕获图像

C#,Emgu 网络摄像头 - 选择捕获大小

如何在 OpenCV 中使用网络摄像头捕获 Mat 图像的像素值

QT6 C++ 中音频捕获原始数据的选项[关闭]