Внедрить изображение в видеопоток GStreamer с помощью appsrcPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Внедрить изображение в видеопоток GStreamer с помощью appsrc

Сообщение Anonymous »

Я работаю над проектом, в котором хочу динамически вставлять изображение (например, красное) в видеопоток GStreamer с помощью appsrc. Моя цель — отправить это изображение со скоростью 30 кадров в секунду, сохраняя при этом конечный вывод конвейера со скоростью 60 кадров в секунду.
Я написал тестовый код, но столкнулся с проблемами при отправке буфера в приложенияrc. Я не уверен, правильно ли настроены ограничения appsrc или правильно ли я обрабатываю буферы и временные метки.
Вот что у меня есть:

Код: Выделить всё

import cv2
import numpy as np
import gi
import time
import threading
from fractions import Fraction

gi.require_version('Gst', '1.0')
from gi.repository import Gst, GLib

Gst.init(None)

pipeline_description = """

filesrc location="overlay.png"  ! pngdec ! videoconvert ! video/x-raw,format=NV12 ! imagefreeze ! queue max-size-buffers=1 max-size-time=0 max-size-bytes=0 ! compositor.sink_0 \

appsrc name=display_screen ! queue max-size-buffers=4 ! compositor.sink_3 \

v4l2src device=/dev/video0 name=game_capture io-mode=2 ! video/x-raw,width=720,height=480,format=NV12 ! videoscale method=1 ! video/x-raw,width=864,height=576 ! queue max-size-buffers=1 max-size-time=0 max-size-bytes=0 ! compositor.sink_1 \

v4l2src device=/dev/video2 name=webcam io-mode=2 ! video/x-raw,width=320,height=240 ! videoscale method=1 ! video/x-raw,width=324,height=244 ! videocrop top=0 bottom=74 left=0 right=0 ! video/x-raw,width=324,height=170 ! queue max-size-buffers=1 max-size-time=0 max-size-bytes=0 ! compositor.sink_2 \

compositor name=compositor sink_0::xpos=0 sink_0::ypos=0 sink_1::xpos=25 sink_1::ypos=59 sink_2::xpos=930 sink_2::ypos=104 sink_3::xpos=126 sink_3::ypos=641 ! video/x-raw,format=NV12,width=1280,height=720,framerate=60/1 ! \
x264enc bitrate=4000  tune=zerolatency speed-preset=superfast ! h264parse ! queue max-size-buffers=1 max-size-time=0 max-size-bytes=0 ! mux.video \

alsasrc device=hw:2 ! audioconvert ! audioresample ! audio/x-raw,channels=2,rate=44100 ! queue max-size-buffers=1 max-size-time=0 max-size-bytes=0 ! faac bitrate=128000 ! mux.audio \

flvmux name=mux latency=0 ! filesink location="stream.flv"
"""

pipeline = Gst.parse_launch(pipeline_description)

# Start the pipeline
pipeline.set_state(Gst.State.PLAYING)

# Retrieve the camera element
appsrc = pipeline.get_by_name('display_screen')
appsrc.set_property('caps', Gst.Caps.from_string("video/x-raw,format=RGB,width=667,height=74,framerate=30/1"))
appsrc.set_property("format", Gst.Format.TIME)
appsrc.set_property("block", True)

red_image = np.zeros((74, 667, 3), dtype=np.uint8)
red_image[:, :, 0] = 0
red_image[:, :, 1] = 0
red_image[:, :, 2] = 255

bus = pipeline.get_bus()

def push_frame_to_appsrc():
pts = 0
FPS = Fraction(30)
duration = 10**9 / (FPS.numerator / FPS.denominator)
while True:

gst_buffer = Gst.Buffer.new_wrapped(red_image.tobytes())

pts += duration
gst_buffer.pts = pts
gst_buffer.duration = duration

appsrc.emit("push-buffer", gst_buffer)

def message():
while True:
message = bus.timed_pop_filtered(1000000000, Gst.MessageType.ERROR | Gst.MessageType.EOS)
if message:
print(message.type)
if message.type == Gst.MessageType.ERROR:
err, dbg = message.parse_error()
print("Error:", err, dbg)
elif message.type == Gst.MessageType.EOS:
print("End of stream")
break

try:

bt = threading.Thread(target=message)
bt.daemon = True
bt.start()

appt = threading.Thread(target=push_frame_to_appsrc)
appt.daemon = True
appt.start()

loop = GLib.MainLoop()
loop.run()

except KeyboardInterrupt:
pass
finally:
# Cleanup
pipeline.set_state(Gst.State.NULL)
Проблема
  • При отправке буферов с помощью appsrc.emit("push-buffer", gst_buffer) возникают ошибки .
  • Сообщения об ошибках из шины не всегда понятны.
  • Я не уверен, правильно ли настроены ограничения appsrc.
  • Я не уверен, что смогу справиться с pts (временные метки) и продолжительность буфера, учитывая, что конвейер выводит скорость 60 кадров в секунду, а мои внедренные изображения — 30 кадров в секунду.
Что я ищу< /h2>
  • Обзор моей конфигурации appsrc, особенно заглавных букв.
  • Совет или рабочий пример правильной обработки временных меток и буфера продолжительность в этом контексте.
  • Если возможно, предложения о том, как синхронизировать введенный поток со скоростью 30 кадров в секунду с конечным выходным сигналом со скоростью 60 кадров в секунду в GStreamer.
Заранее спасибо за вашу помощь и идеи!

Подробнее здесь: https://stackoverflow.com/questions/793 ... ing-appsrc
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Конвейер GStreamer: декодирование H.264 из Appsrc в Appsink
    Anonymous » » в форуме C++
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Конвейер GStreamer: декодирование H.264 из Appsrc в Appsink
    Anonymous » » в форуме C++
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Как представить видеопоток GSTREAMER в элемент WPF (например, изображение) с использованием AppSink?
    Anonymous » » в форуме C#
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous
  • Какой из нескольких способов установить крышки для AppSRC хорош и правильный в наши дни?
    Anonymous » » в форуме C++
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Как читать видеопоток камеры и хранить на FTP-сервере с помощью Python
    Anonymous » » в форуме Python
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»