Kivy: передать аргументы времени ожидания и задержки на виджет потокового видео GstPlayer - PullRequest
0 голосов
/ 14 января 2019

Я хочу расширить функциональность Kivy's Видео виджета.

При воспроизведении видеопотока RTSP с использованием следующего кода Kivy задержка составляет несколько секунд. Я хотел бы уменьшить задержку примерно до 100ms.

videostreaming.py:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
import os.path

path_to_kv = os.path.join(os.path.dirname(__file__), 'videostreaming.kv')
Builder.load_file(path_to_kv)


class VideoStreaming(BoxLayout):
    pass


class TestApp(App):
    def build(self):
        root_widg = VideoStreaming()
        return root_widg


if __name__ == '__main__':
    TestApp().run()

videostreaming.kv:

<VideoStreaming>
    orientation: 'vertical'
    Video:
        source: "rtsp://192.168.1.88:554"
        state: 'play'

Требуемая низкая задержка может быть достигнута в командной строке с помощью команды:

$ .\gst-launch-1.0 -v playbin uri=rtsp://192.168.1.88:554 drop-on-latency=true latency=100

Я бы хотел изменить поведение видеомодуля GstPlayer в Kivy, чтобы разрешить передачу аргументов "drop-on-latency = true" и "latency = 100".

Соответствующий исходный код Kivy находится здесь: https://github.com/kivy/kivy/blame/master/kivy/lib/gstplayer/_gstplayer.pyx#L237-L256

Q1. Как я могу создать подкласс модуля Cython GstPlayer для включения доступа к аргументам задержки и задержки на выходе?

Я думаю, что подкласс должен переопределить метод load () следующим образом:

# import GstPlayer module to be subclassed
from kivy.lib.gstplayer cimport GstPlayer

# define subclass
cdef class LowLatencyGst(GstPlayer):

    #override load() method
    def load(self):
        # run parent's load() method
        super(LowLatencyGst, self).load()

        # set required attributes: latency = 100, drop-on-latency = True
        # Unconfirmed whether these commands are correctly named
        g_object_set_int(self.appsink, 'latency', 100)
        g_object_set_int(self.appsink, 'drop-on-latency', 1)

Примечание. Попытка скомпилировать приведенный выше код не удалась. Это псевдокод.

Q2. Как я могу интегрировать вышеуказанный подкласс в качестве поставщика CoreVideo для виджета Видео?

1 Ответ

0 голосов
/ 16 января 2019

Следующая фиксация предоставляет жестко запрограммированное решение для определения значений задержки и задержек: https://github.com/sabarlow/kivy/commit/846e3147db4ac784c1aa4d02f47666716fb57644

Добавлены следующие строки кода в \ kivy \ lib \ gstplayer_gstplayer.pyx: 265

g_object_set_int(self.pipeline, 'drop-on-latency', self.drop_on_latency)
g_object_set_int(self.pipeline, 'latency', self.latency)

Установка с помощью \ kivy \ lib \ gstplayer_gstplayer.pyx: 184

cdef int latency, drop_on_latency

И в том же файле:

def __init__(self, uri, sample_cb=None, eos_cb=None, message_cb=None, latency=500, drop_on_latency=1):
        super(GstPlayer, self).__init__()
        self.uri = uri
        self.sample_cb = sample_cb
        self.eos_cb = eos_cb
        self.message_cb = message_cb
        self.latency = latency
        self.drop_on_latency = drop_on_latency

Затем Kivy перекомпилируется.

Это не позволяет передавать значения задержек и задержек при передаче из виджета «Видео» Kivy. Кто-нибудь может подсказать, как сделать эту работу?

...