Я хочу расширить функциональность 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 для виджета Видео?