Gstreamer v1.24 не может воспроизвести видео из MPEG2-TS с потоком KLV метаданных: Не удалось разобрать единицы доступа PES метаданных.

Вопрос или проблема

Я не могу воспроизвести поток MPEG2-TS с KLV (элементарный поток MPEG-TS с идентификатором пакета PID 0x28)

Эта команда работает для версии Gstreamer 1.22.12, но не для последнего релиза Gstreamer, версии 1.24.8. Видео не воспроизводится, и показывается ошибка. В будущем было бы неплохо также получить метаданные klv (например, appsink), но это не основная проблема здесь.

У кого-нибудь есть какие-либо советы, или что я могу сделать, чтобы это заработало для gstreamer? Примечание: это работает для Gstreamer 1.22.12.

Моя команда

GST_DEBUG=3 ./gst-launch-1.0 filesrc location=reproducible.ts ! decodebin ! autovideosink

или альтернативно

GST_DEBUG=3 ./gst-launch-1.0 -v filesrc location=reproducible.ts ! tsdemux ! h265parse ! avdec_h265 ! videoconvert ! autovideosink

Ошибка

tsdemux tsdemux.c:3412:parse_pes_metadata_frame: Не удалось разобрать PES-метаданные единицы доступа

Тестовый файл можно скачать по ссылке google drive.

Полные журналы

GST_DEBUG=3 ./gst-launch-1.0 filesrc location=/Users/user/Desktop/reproducible-mpeg2ts-klv.ts ! decodebin ! autovideosink
0:00:00.009753583 88548    0x15800c1e0 WARN            GST_REGISTRY gstregistrybinary.c:552:gst_registry_binary_check_magic: Магическая версия бинарного реестра отличается : 1.23.90 != 1.3.0
0:00:03.405690292 88550    0x1157ed0f0 WARN                 default gstjackloader.c:187:gst_jack_load_library: Не удалось открыть библиотеку libjack.0.dylib, dlopen(libjack.0.dylib, 0x0009): пытался: 'libjack.0.dylib' (такого файла нет), '/System/Volumes/Preboot/Cryptexes/OSlibjack.0.dylib' (такого файла нет), '/Library/Frameworks/GStreamer.framework/Versions/1.0-1.1.24.7/lib/../lib/libjack.0.dylib' (такого файла нет), '/Library/Frameworks/GStreamer.framework/Versions/1.0-1.1.24.7/libexec/lib/libjack.0.dylib' (такого файла нет), '/Library/Frameworks/GStreamer.framework/Versions/1.0-1.1.24.7/lib/../libjack.0.dylib' (такого файла нет), '/Library/Frameworks/GStreamer.framework/Versions/1.0-1.1.24.7/lib/../../lib/libjack.0.dylib' (такого файла нет), '/Library/Frameworks/GStreamer.framework/Versions/1.0-1.1.24.7/libexec/libjack.0.dylib' (такого файла нет), '/Library/Frameworks/GStreamer.framework/Versions/1.0-1.1.24.7/lib/libjack.0.dylib' (такого файла нет), '/Library/Frameworks/GStreamer.framework/Versions/1.0-1.1.24.7/libexec/libjack.0.dylib' (такого файла нет), '/Library/Frameworks/GStreamer.framework/Versions/1.0-1.1.24.7/libexec/gstreamer-1.0/../libjack.0.dylib' (такого файла нет), '/Library/Frameworks/GStreamer.framework/Versions/1.0-1.1.24.7/libexec/gstreamer-1.0/../../lib/libjack.0.dylib' (такого файла нет), '/Library/Frameworks/GStreamer.framework/Versions/1.0-1.1.24.7/libexec/lib/libjack.0.dylib' (такого файла нет), '/Library/Frameworks/GStreamer.framework/Versions/1.0-1.1.24.7/lib/libjack.0.dylib' (такого файла нет), '/Library/Frameworks/GStreamer.framework/Versions/1.0-1.1.24.7/libexec/gstreamer-1.0/../lib/libjack.0.dylib' (такого файла нет), '/Library/Frameworks/GStreamer.framework/Versions/lib/libjack.0.dylib' (такого файла нет), '/Library/Frameworks/GStreamer.framework/Versions/1.0-1.1.24.7/libexec/gstreamer-1.0/../../../lib/libjack.0.dylib' (такого файла нет), '/usr/lib/libjack.0.dylib' (такого файла нет, нет в кэше dyld), 'libjack.0.dylib' (такого файла нет), '/Users/user/gstreamer/lib/libjack.0.dylib' (такого файла нет)
0:00:03.405739125 88550    0x1157ed0f0 WARN                 default gstjack.c:108:plugin_init: Не удалось загрузить библиотеку jack
0:00:03.439294875 88550    0x1157ed0f0 WARN                 default ges-meta-container.c:237:_set_value:<GESAsset@0x1462c8550> Не удалось установить значение для элемента: version-формата
0:00:03.439321542 88550    0x1157ed0f0 WARN                 default ges-meta-container.c:237:_set_value:<GESAsset@0x1462c85d0> Не удалось установить значение для элемента: version-формата
0:00:03.439334459 88550    0x1157ed0f0 WARN                 default ges-meta-container.c:237:_set_value:<GESAsset@0x1462c8650> Не удалось установить значение для элемента: version-формата
0:00:03.440124500 88550    0x1157ed0f0 WARN               structure gststructure.c:2371:priv_gst_structure_parse_fields: Не удалось найти разделитель, r=mimetype
0:00:03.447295000 88550    0x1157ed0f0 WARN                  ladspa gstladspa.c:509:plugin_init:<plugin206> никаких плагинов LADSPA не найдено, проверьте LADSPA_PATH
Установка конвейера в состояние PAUSED ...
0:00:04.032324333 88548    0x12700cea0 FIXME              glcontext gstglcontext.c:1956:gst_gl_context_request_config:<glcontextcocoa1> не поддерживает запрос конфигурации
0:00:04.032344208 88548    0x12700cea0 WARN               glcontext gstglcontext.c:1299:gst_gl_context_create_thread:<glcontextcocoa1> не удалось запросить конфигурацию gst-gl-context-config, платформа=(GstGLPlatform)GST_GL_PLATFORM_CGL, альфа-размер=(int)8, глубина-размер=(int)0, размер-шаблона=(int)0, красный-размер=(int)8, зеленый-размер=(int)8, синий-размер=(int)8, образцы=(int)0, образцы-буферов=(int)0;
Конвейер в состоянии PREROLLING ...
Получен контекст от элемента 'autovideosink0': gst.gl.GLDisplay=context, gst.gl.GLDisplay=(GstGLDisplay)"\(GstGLDisplayCocoa\)\ gldisplaycocoa0";
Отсутствующий элемент: декодер KLV Metadata
0:00:04.044863208 88548    0x159039120 ERROR                tsdemux tsdemux.c:3412:parse_pes_metadata_frame: Не удалось разобрать PES-метаданные единицы доступа
0:00:04.044871333 88548    0x159039120 WARN              mpegtsbase mpegtsbase.c:1781:mpegts_base_loop:<tsdemux0> ошибка: Внутренняя ошибка потока данных.
0:00:04.044873833 88548    0x159039120 WARN              mpegtsbase mpegtsbase.c:1781:mpegts_base_loop:<tsdemux0> ошибка: потоковая передача остановлена, причина ошибка (-5)
ERROR: из элемента /GstPipeline:pipeline0/GstDecodeBin:decodebin0/GstTSDemux:tsdemux0: Внутренняя ошибка потока данных.
Дополнительная информация отладки:
../gst/mpegtsdemux/mpegtsbase.c(1781): mpegts_base_loop (): /GstPipeline:pipeline0/GstDecodeBin:decodebin0/GstTSDemux:tsdemux0:
передача остановлена, причина ошибка (-5)
ERROR: конвейер не хочет находиться в состоянии preroll.
Установка конвейера в состояние NULL ...
0:00:04.044940166 88548    0x159039180 WARN               decodebin gstdecodebin2.c:4737:gst_decode_bin_expose:<decodebin0> ошибка: подходящие плагины не найдены:
Отсутствующий декодер: KLV Metadata (meta/x-klv, parsed=(boolean)true)

ERROR: из элемента /GstPipeline:pipeline0/GstDecodeBin:decodebin0: Ваша установка GStreamer не имеет плагина.
Дополнительная информация отладки:
../gst/playback/gstdecodebin2.c(4737): gst_decode_bin_expose (): /GstPipeline:pipeline0/GstDecodeBin:decodebin0:
нет подходящих плагинов:
Отсутствующий декодер: KLV Metadata (meta/x-klv, parsed=(boolean)true)

ERROR: конвейер не хочет находиться в состоянии preroll.
Освобождение конвейера ..

Попытанное решение

Использование caps для decodebin, например, GST_DEBUG=3 ./gst-launch-1.0 filesrc location=reproducible.ts ! decodebin 'caps=video/x-raw(ANY); meta/x-klv' ! autovideosink, чтобы игнорировать данные klv. Это не изменяет никаких ошибок.

Ответ или решение

Ошибка, с которой вы столкнулись при воспроизведении MPEG2-TS потока с KLV метаданными в GStreamer версии 1.24, связана с изменениями в библиотеке, которые могли повлиять на поддержку обработки PES кадров с метаданными. Вот рекомендации по устранению проблемы и дополнительные сведения о работе с KLV метаданными.

1. Убедитесь, что у вас установлены все необходимые плагины

Для обработки KLV метаданных требуется наличие специальных плагинов. Первым шагом убедитесь, что ваша установка GStreamer включает поддержку метаданных KLV. В версиях GStreamer с 1.23 и выше могли произойти изменения. Вы можете проверить установленные плагины с помощью команды:

gst-inspect-1.0 | grep klv

Если необходимые плагины отсутствуют, попробуйте переустановить GStreamer с поддерживаемыми плагинами KLV.

2. Попробуйте использовать tsdemux с дополнительными параметрами

Судя по вашему сообщению, возникновение ошибки «Failed to parse PES metadata access units» говорит о том, что tsdemux не смог обработать метаданные. Попробуйте явно указать, что вас не интересуют KLV метаданные в командах. Например, вы можете попробовать следующее:

GST_DEBUG=3 ./gst-launch-1.0 filesrc location=reproducible.ts ! tsdemux ! h265parse ! avdec_h265 ! videoconvert ! autovideosink

или используйте tsdemux с дополнительными аргументами, игнорирующими KLV метаданные:

GST_DEBUG=3 ./gst-launch-1.0 filesrc location=reproducible.ts ! tsdemux name=d ! d.video_0 ! decodebin ! autovideosink d.klv_0 ! fakesink

3. Проверьте наличие необходимых библиотек

Логи показывают предупреждения о том, что библиотека libjack.0.dylib не найдена. Убедитесь, что все необходимые зависимости установлены правильно, особенно если вы используете GStreamer для разработки. Если хотите, установите jack и добавьте в свой путь:

brew install jack

4. Вернитесь к предыдущей версии GStreamer

Если вышеуказанные решения не помогли и вам критично необходимо использовать ваш MPEG2-TS поток, вы можете рассмотреть возможность отката на более раннюю версию GStreamer, которая работает (например, 1.22.12).

5. Устранение неполадок с помощью GST_DEBUG

Использование более высокого уровня отладки (например, GST_DEBUG=4 или GST_DEBUG=5) может дать больше информации о том, что именно происходит внутри tsdemux. Настройте переменную окружения перед запуском вашей команды:

GST_DEBUG=5 ./gst-launch-1.0 filesrc location=reproducible.ts ! tsdemux ! h265parse ! avdec_h265 ! videoconvert ! autovideosink

6. Обратите внимание на работу с KLV метаданными в будущем

Если вам нужно будет извлекать KLV метаданные, вам понадобится разработать отдельный поток обработки, который будет обрабатывать эти данные, независимо от основного видео потока. В GStreamer это обычно делается с использованием appsink.

Заключение

Проблема возникает от изменения обработки потоков в GStreamer, и пока лучший способ решения — это убедиться, что все необходимые плагины загружены и корректно работают. Если проблема сохраняется даже после выполнения всех шагов, рекомендуется обратиться в сообщество GStreamer или создать вопрос на GitHub с соответствующим флагом, чтобы получить дополнительную помощь.

Оцените материал
Добавить комментарий

Капча загружается...