python,vlc,rtsp。截图不起作用
我运行了这个:
import vlc
import time
player = vlc.MediaPlayer('rtsp://NNNNNNNNNNNNNN')
player.play()
period = 2 # Every 2 seconds I got new screenshot from camera
while True:
time.sleep(period)
player.video_take_snapshot(0, 'screenshot-tmp.png', 0, 0)
一旦我删除了 player.play()
这行代码,它就不再工作了。没有截图。
这是什么问题呢?
我不需要打开 VLC 播放器,只需要截屏并处理这些截图。
2 个回答
1
通过从播放器对象调用play方法,视频播放就开始了。要想截取视频快照,需要一个媒体播放器的实例[1]。
如果使用其他第三方库,比如OpenCV,你可以在不启动播放器的情况下,使用类似VideoCapture的方法来处理视频:https://docs.opencv.org/3.4/d4/da8/group__imgcodecs.html
import vlc
import cv2
url = 'rtsp://NNNNNNNNNNNNNN'
instance = vlc.Instance()
media = instance.media_new(url)
player = vlc.MediaPlayer(media)
cap = cv2.VideoCapture(player)
period = 2
while True:
ret, frame = cap.read()
if ret:
cv2.imwrite('screenshot-tmp.png', frame)
print("Screenshot captured!")
else:
print("Error capturing frame")
time.sleep(period)
[1] https://www.olivieraubert.net/vlc/python-ctypes/doc/index.html
1
试着这样创建你的 player
:
instance = vlc.Instance("--vout=vdummy")
player = instance.media_player_new("rtsp://NNNNNNNNNNNNNN")
player.play()
(基于 这个)
你不能去掉 player.play()
,因为这个调用是让媒体真正开始播放所必需的。
上面的代码是怎么工作的?为了去掉图形界面,我们可以使用 --vout
这个 VLC 命令行参数,具体的用法可以在 文档中找到,它可以控制视频输出的方式。我们选择了一个特殊的方式—— vdummy
,这样视频输出就会是假的。
在创建“libvlc 实例”时,可以提供类似命令行的参数 ,所以我们手动提供这些参数(否则你会得到一个默认的实例,它没有 --vout=vdummy
这个设置)。
接着,media_player_new(uri)
会根据这个“libvlc 实例”创建一个新的 MediaPlayer
对象。这个对象可以像其他的 MediaPlayer
一样使用,但它的行为会受到我们提供给 Instance
的命令行参数的影响。