python,vlc,rtsp。截图不起作用

1 投票
2 回答
29 浏览
提问于 2025-04-13 01:00

我运行了这个:

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 的命令行参数的影响。

撰写回答