Я пытаюсь кодировать и объединять 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?