我目前正在使用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无法打开它。
答案 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)
您需要使用一堆libvlc调用,不确定您的python包装器包含哪些调用,但应将它们公开在mediaplayer对象上。
您需要设置和使用这些回调。使用这些API的C#示例:https://github.com/ZeBobo5/Vlc.DotNet/blob/develop/src/Vlc.DotNet.Wpf/VlcVideoSourceProvider.cs