Как получить кадр из медиаплеера vlc - PullRequest
0 голосов
/ 29 мая 2018

В настоящее время я использую библиотеку vlc для 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 для получения видеопотока, потому что open cv не может открыть его из-за какой-то ошибки ffmpeg.

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

Получите кадры в секунду из видео или по умолчанию значение 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 = игра]

0 голосов
/ 19 июля 2018

Вам нужно использовать кучу вызовов libvlc, но вы не знаете, что это с вашей оболочкой Python, но они должны быть выставлены на объекте медиаплеера.

https://www.videolan.org/developers/vlc/doc/doxygen/html/group__libvlc__media__player.html#gae46128c21d0d0151aca3ba017d1d6b35

https://www.videolan.org/developers/vlc/doc/doxygen/html/group__libvlc__media__player.html#ga2189c9deefc2154ddc5d5f1871b0a106

https://www.videolan.org/developers/vlc/doc/doxygen/html/group__libvlc__media__player.html#ga193de3e82f6de3f9d8f5ccd8b5f2aa98

https://www.videolan.org/developers/vlc/doc/doxygen/html/group__libvlc__media__player.html#ga024c0f0bba9d3b32a881c40f3cb479bb

Вам необходимо настроить и использовать эти обратные вызовы.Пример C # с использованием этих API: https://github.com/ZeBobo5/Vlc.DotNet/blob/develop/src/Vlc.DotNet.Wpf/VlcVideoSourceProvider.cs

0 голосов
/ 30 мая 2018
# -*- 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)
...