Кодирование и мультиплексирование конвейера GStreamer в MPEG-TS - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь кодировать и объединять GESPipeline в MPEG-TS для потоковой передачи через UDP. В режиме предварительного просмотра конвейер отлично воспроизводится на экране. Моя попытка, по сути:

GstEncodingContainerProfile *prof;
GstCaps *caps;
caps = gst_caps_from_string("video/mpegts");
prof = gst_encoding_container_profile_new("test-app-profile", NULL, caps, NULL);
caps = gst_caps_from_string("video/x-h264");
gst_encoding_container_profile_add_profile(prof,
    (GstEncodingProfile*) gst_encoding_video_profile_new(caps, NULL, NULL, 0));
caps = gst_caps_from_string("audio/x-ac3");
gst_encoding_container_profile_add_profile(prof,
    (GstEncodingProfile*) gst_encoding_audio_profile_new(caps, NULL, NULL, 0));
// this fails:
ges_pipeline_set_render_settings (pl, "file:///path/out.ts", prof);

На выходе с GST_DEBUG = 3:

encodebin gstencodebin. c: 1976: create_elements_and_pads: error: Нет доступного мультиплексора для форматирования видео / mpegts

Обновление: более подробная отладка показывает, что на самом деле он просматривает mpegtsmux, но пропускает его. Зачем? Соответствующие сообщения:

gst_encode_bin_setup_profile: Настройка профиля 0x557c3c98c460: test-app-profile (type: container) create_elements_and_pads: Текущий профиль: test-app-profile _get_muxer: Получение списка мультиплексоров для формата видео / mpegts gst_element_factory_list_filter: поиск фабрик ... gst_element_factory_list_filter: Пробуем mpegtsmux gst_structure_parse_field: попытка имени поля 'systemstream' _priv_gst_value_parse_value: попытка имени типа 'boolean' gst_structure_parse_field: попытка имени поля 'packetsize' _priv_gst_value_parse_value: попытка имени типа 'int' ... пробует другие мультиплексоры ...

Если я изменяю video / mpegts на video / x-matroska, создается файл mkv (хотя и уродливый и без звука).

Как закодировать в mpegts?

1 Ответ

0 голосов
/ 18 августа 2020

Проблема заключалась в отсутствии полей, перечисленных в sr c заглавными буквами в gst-inspect-1.0 mpegtsmux. Они являются обязательными, и если вы не укажете их, он не будет соответствовать мультиплексору.

Решение для mpegtsmux:

gst_caps_from_string ("video / mpegts, systemstream = true, packetsize = 188 ");

Благодаря Freenode #gstreamer IR C канал.

...