python - 使用python-vlc从youtube视频获取屏幕截图

标签 python youtube vlc

使用vlc python API,我想浏览youtube视频并每10秒拍摄一次快照。

使用我目前的方法,我遇到了问题,因为我必须依靠播放器更新其显示图像的速度。发生的速度是不可预测的。我认为,最好的办法是在播放器显示新图像时触发事件。然后,我可以对此使用react,而不必使用time.sleep()变得模糊。

目前,我一直等到收到带有时间戳的视频缓冲区包,以确保播放器可以按所需的时间戳显示图像。

首先,我实例化播放器,然后等待它出现在屏幕上(需要一个事件)。然后,循环以截屏开始。

import pafy
import vlc
import os
import time

url = "https://www.youtube.com/watch?v=bMt47wvK6u0"

video = pafy.new(url)
best = video.getbest()
playurl = best.url

skipTime = 1000*10*10 # milliseconds


directory = "images/"
prefix = str.split(url, "=")[1] + "_" # get video ID, end of url
harvesting = False
waitForBuffer = False
recordTime = 0

def callbackBuffering(arg):
    global waitForBuffer
    global harvesting

    if(recordTime + skipTime < arg.u.new_time and harvesting):
        waitForBuffer = False

try:
    os.mkdir("images")
except:
    print("directory exists")    


Instance = vlc.Instance()
player = Instance.media_player_new()
eventManager = player.event_manager()
eventManager.event_attach(vlc.EventType.MediaPlayerBuffering, callback = callbackBuffering)



Media = Instance.media_new(playurl)
Media.get_mrl()
player.set_media(Media)

player.play()

time.sleep(5) # wait till the window appears
player.pause()

images = 0
harvesting = True
while(player.get_time() < player.get_length()):

    waitForBuffer = True
    path = directory + prefix + str(player.get_time() )
    print("image will be taken at " + str(player.get_time() ) + "ms at path "+ path )   
    time.sleep(0.5)
    recordTime = player.get_time()
    player.video_take_snapshot(0, directory + prefix + str(recordTime) ,i_width=player.video_get_width(), i_height=player.video_get_height())

    player.set_time(recordTime+skipTime)



    while(waitForBuffer):
        print("waiting for buffering")
        time.sleep(0.1)

最佳答案

尝试EventType.MediaPlayerPositionChangedEventType.MediaPlayerTimeChanged它们似乎都基于每秒计数来工作。
他们也很高兴地处理了等待视频加载的问题,因为在显示内容之前,时间和位置都不会改变

关于python - 使用python-vlc从youtube视频获取屏幕截图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52918532/

相关文章:

c++ - OpenCV 从命名管道 (fifo) 到 ffplay

python - 使用 Python 和 Selenium Webdriver 从文本区域获取文本(无值属性)

python - Windows 8 上的 scipy.optimize dll 加载失败

asp.net - Youtube API-如何使用VB.Net在一个请求中检索多个视频?

javascript - 需要延迟加载 iframe

c++ - 静默启动应用程序?

python - celery 中的简单周期性任务不起作用但没有错误

python - 将 Parquet 文件分区列存储在不同的文件中

python - 使用 Python 3 抓取 YouTube 网页

java - 从 Java 内部调用时 VLC 死机