- Вопрос или проблема
- Моя команда
- Ошибка
- Полные журналы
- Попытанное решение
- Ответ или решение
- 1. Убедитесь, что у вас установлены все необходимые плагины
- 2. Попробуйте использовать tsdemux с дополнительными параметрами
- 3. Проверьте наличие необходимых библиотек
- 4. Вернитесь к предыдущей версии GStreamer
- 5. Устранение неполадок с помощью GST_DEBUG
- 6. Обратите внимание на работу с KLV метаданными в будущем
- Заключение
Вопрос или проблема
Я не могу воспроизвести поток 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 с соответствующим флагом, чтобы получить дополнительную помощь.