Вопрос или проблема
Я пытаюсь транслировать файл .264.
Хотя прямая труба без udp стриминга воспроизводит видео нормально, при использовании udp sink и src виден только один кадр видео.
Прямая труба
gst-launch-1.0 filesrc location=football35228830.264 ! h264parse ! rtph264pay pt=96 ! rtph264depay ! avdec_h264 ! autovideosink
Это воспроизводит видео нормально.
Теперь, при запуске этих команд, появляется застывший кадр видео.
На стороне передачи
gst-launch-1.0 -v filesrc location=football35228830.264 ! h264parse ! rtph264pay pt=96 ! udpsink host=127.0.0.1 port=9001
На стороне клиента
gst-launch-1.0 udpsrc port=42050 ! application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=H264,payload=96 ! rtph264depay ! h264parse ! avdec_h264 ! autovideosink
Есть ли проблема с трубами, или требуются дополнительные элементы?
:Есть несколько возможных причин: Файл загружается и воспроизводится слишком быстро => используйте multifilesrc. Также я добавляю caps к отправителю. Наконец, в вашем примере порты различаются.
Отправитель:
gst-launch-1.0 -v multifilesrc location=public/media/video.h264 loop=true ! \
video/x-h264,width=1920,height=1080,framerate=30/1,profile=constrained-baseline ! h264parse ! rtph264pay pt=10 ! udpsink host=127.0.0.1 port=9001
Получатель:
gst-launch-1.0 udpsrc port=9001 ! 'application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=H264,payload=16' ! \
rtph264depay ! h264parse ! avdec_h264 ! autovideosink
Ответ или решение
Теория
Потоковая передача видеофайлов в формате .264 с использованием GStreamer 1.0 предполагает ряд тонкостей и нюансов, которые могут затруднить процесс, особенно когда необходимо передавать данные по сети с использованием протокола UDP. GStreamer — это мощная мультимедийная платформа, предназначенная для работы с потоками данных, и именно её гибкость может стать как её сильной стороной, так и источником потенциальных проблем для неопытных пользователей.
Первым этапом следует разобраться с особенностями формата H.264, который активно используется для сжатия видео. Особенность формата заключается в том, что он требует определённые метаданные для правильной декомпрессии видеопотока. При неверной сборке конвейера в GStreamer, легко натолкнуться на возникновение проблем с синхронизацией или искажением данных, что и случается в приведённом вопросе.
Пример
В вашем случае наблюдаются проблемы с передачей видеоданных по протоколу UDP. Из вопроса понятно, что при локальном воспроизведении видеопоток работает корректно, но при попытке передачи данных через сеть наблюдаются проблемы — видео замирает на одной из первых кадров. Это может быть вызвано несколькими факторами:
-
Несоответствующие порты: Ваш пример показал использование разных портов для отправки и получения данных (9001 входит и 42050 выходит), что недопустимо — они должны совпадать.
-
Отсутствие корректных метаданных (капсов): Для стабильного потока, необходимо добавить caps (caption descriptions) в вашу отправляющую пайплайну, чтобы указать параметры видеопотока, такие как разрешение, частота кадров и профиль кодека. Это помогает приемнику правильно интерпретировать и декодировать поток.
-
Скорость передачи файлов: Использование
filesrc
с реальном потоке может вызвать проблемы с синхронизацией, и как альтернативу рекомендуетсяmultifilesrc
.
Применение
Используя вышеописанные методы, возможно правильно передать потоковое видео следующим образом:
Отправляющий конвейер:
gst-launch-1.0 -v multifilesrc location=public/media/video.h264 loop=true ! \
video/x-h264,width=1920,height=1080,framerate=30/1,profile=constrained-baseline ! h264parse ! rtph264pay pt=96 ! udpsink host=127.0.0.1 port=9001
Здесь применяются более подходящие параметры caps (описание медиа), которые помогут приемнику правильно распознать и обрабатывать потоковое видео.
Приемный конвейер:
gst-launch-1.0 udpsrc port=9001 ! 'application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=H264,payload=96' ! \
rtph264depay ! h264parse ! avdec_h264 ! autovideosink
Обратите внимание, что номера портов совпадают, и payload значения также согласованы, что минимизирует синтаксические ошибки при рассмотрении потоков.
Возвращаясь к озвученной проблеме, благодаря применению этих технических решений возможно устранение заиканий и зависания видео при воспроизведении через сеть. Также используйте возможность указать ключевые параметры медиа, такие как фреймрейт и разрешение, чтобы поток воспроизводился с заданным качеством и характеристиками. Это сильно уменьшает шанс возникновения проблем с интерпретацией медиафайла программой на стороне клиента.
Таким образом, соблюдение всех описанных выше рекомендаций и сочетание их в работе с практическим опытом использования GStreamer, позволит не только устранить текущие затруднения, но и сделает вас более уверенным в работе с другими сложными сценариями потоковой передачи мультимедиа в будущем. Четкое понимание каждого элемента цепочки обработки данных, от начального источника до конечного устройства воспроизведения, является ключевым фактором в успешной реализации мультимедийных проектов.