首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用python-vlc从youtube视频中获取截图

使用python-vlc从youtube视频中获取截图
EN

Stack Overflow用户
提问于 2018-10-22 02:29:30
回答 1查看 2K关注 0票数 0

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

使用我目前的方法,我遇到了问题,因为我必须依赖于播放器更新其显示图像的速度。这种情况发生的速度是不可预测的。我认为最好的情况是,当玩家显示一个新图像时,有一个事件被触发。然后我就可以对此做出反应,而不必对time.sleep()感到模糊。

目前,我一直在等待,直到我收到一个带有时间戳的video-buffer-package,它保证播放器可以在想要的时间戳显示图像。

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

代码语言:javascript
运行
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2018-10-25 17:39:24

试试EventType.MediaPlayerPositionChangedEventType.MediaPlayerTimeChanged,它们似乎都是基于每秒的计数来工作的。

令人高兴的是,它们还可以处理视频加载的等待,因为在显示某些内容之前,时间和位置都不会改变

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52918532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档