如何从vlc媒体播放器获取帧

时间:2018-05-29 18:50:58

标签: python opencv vlc

我目前正在使用vlc库for python(python-vlc)从sdp流中获取视频流,并使用sdp文件进行描述。我现在正在使用这段代码:

import vlc
import time 

instance = vlc.Instance()
player = instance.media_player_new()
media = instance.media_new("./bebop.sdp")
player.set_media(media)

player.play()
time.sleep(10)

适用于显示视频。但我不想只显示它,我想使用视频中的每一帧对其进行一些图像处理,然后显示修改后的帧。

我已经在论坛上阅读了几乎所有的文档和不同的帖子,但我找不到办法来做到这一点。

我使用vlc来获取视频流,因为由于某些ffmpeg错误,open cv无法打开它。

3 个答案:

答案 0 :(得分:1)

# -*- coding: utf-8 -*-

import vlc
import time 

def mspf(mp):
    """Milliseconds per frame"""
    return int(1000 // (mp.get_fps() or 25))


if __name__ == "__main__":
    instance = vlc.Instance()
    player = instance.media_player_new()
    media = instance.media_new("1.m4v")
    player.set_media(media)

    player.play()

    """Play 800th frames"""
    new_time = 800 * mspf(player)
    player.set_time(new_time)

    time.sleep(10)

答案 1 :(得分:1)

从视频中获取每秒帧数或默认为25为合理猜测,然后逐步执行暂停的视频,每次使用每秒帧数作为您的跳转。

import vlc
import time

instance = vlc.Instance('--no-xlib --quiet')
player = instance.media_player_new()
media = instance.media_new("./bebop.sdp"")
player.set_media(media)
player.play()
mfps = int(1000 / (player.get_fps() or 25))
player.set_time(30000) # start at 30 seconds
player.pause()
t = player.get_time()
for iter in range(30):
    t += mfps
    player.set_time(t)
    if player.get_state() == 3:
        player.pause()
    time.sleep(0.5)

在这里,我从30秒开始,然后前进30次 您可能希望继续前进,直到player.get_state() == 6表示视频已完成。 [状态3 =正在播放]

答案 2 :(得分:0)