LINUX.ORG.RU

appsrc в Gstreamer

 , ,


0

4

Пытаюсь сделать следующее:
приходит видео поток нарезанный на сегменты (h.264 / aac).
собрал пайплайн:

appsrc_a -> aacparse ->faad -> faac -> flvmux
appsrc_v -> h264parse -ffh264_dec -> x264enc -> flvmux -> rtmpsink

(a)управляют подачей данных в пайплайн сигналы gstremera:

g_signal_connect(app->appsrc_v, "need-data", G_CALLBACK(start_feed),   app);       
g_signal_connect(app->appsrc_v, "enough-data", G_CALLBACK(stop_feed),    app);

(b) также указан максимальный размер буфера 40k (свойство «max-bytes»). Заполнение буфера начинается по сигналу «need-data» и прекращается по достижении «max-bytes» и получению сигнала «enough-data».


В реальности:
* приходит сигнал «need-data», данные загружаются ... очередь заполняется до 40к, 90к и т.п.
из лога:

appsrc gstappsrc.c:1451:gst_app_src_push_buffer_full:<appsrc_v> queue filled (**890033** >= **40960**)
appsrc gstappsrc.c:1451:gst_app_src_push_buffer_full:<appsrc_v> queue filled (**898225** >= **40960**)
appsrc gstappsrc.c:1451:gst_app_src_push_buffer_full:<appsrc_v> queue filled (**898225** >= **40960**)

потом скажем по достижении 1Mб (величина не постоянная) приходит «enough-data» и загрузка данных останавливается.
Мне же нужно чтобы данные запрашивались более или менее равномерно - так сегменты я получаю от удаленной камеры и что делать когда данных недостаточно пока не знаю ...


Кто-небудь может объяснить почему так происходит ?
Бьюсь уж неделю - не могу никак понять.

приходит «enough-data» и загрузка данных останавливается

Почему останавливается?
Ты разве не стравливаешь данные куда-нибудь (на экран, или в файл)?

Если данные не травить, то конечно очередь остановится по достижении предела буфера.

Novator ★★★★★ ()
13 декабря 2013 г.

Во-первых вопрос, зачем реенкод? Перед подачей на муксер достаточно парсера.

Во-вторых, мне кажется странным выбор макс. размера буфера в 40 КБ, маловато. Думаю, ключевой кадр видео может быть в разы больше.

В чём проблема - не совсем понял. В затыке? Или в «неравномерности» движения данных?

Могу посоветовать на обоих ветвях перед муксером поставить queue без ограничений кол-ва данных. А входные данные, думаю, проще пихать тогда, когда они есть, а не ждать сигнала.

Да, а почему appsrc, неужели нет возможности из gstreamer pipeline напрямую тянуть поток по какому-то протоколу?

Krieger_Od ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.