Синхронизация потоковой передачи аудио и видео для контейнера mp4 с использованием фреймворка Gstreamer

Я новичок в gstreamer, и я хочу транслировать видео в формате mp4, которое имеет аудио и видео как с моего хоста (ПК с Ubuntu), так и на целевую плату. Я успешно транслировал только видео. Но потоковой передачи (аудио и видео) не происходит.

Конвейер для потоковой передачи только видео, как показано ниже

Отправитель:

gst-launch-1.0 -v filesrc location = video.mp4! decodebin! x264enc! rtph264pay! udpsink host = 192.168.2.136 port = 5000

получатель:

gst-launch-1.0 -v udpsrc port = 5000 caps = "application / x-rtp, media = video, clock-rate = 90000, encoding-name = H264, payload = 96, ssrc = 3394826012, timestamp-offset. = 2215812541, seqnum-offset = 46353 "! rtph264depay! avdec_h264! видеоконвертировать! ximagesink sync = false

Следовательно, можно увидеть видео по цели.

Сделал стриминг только аудио из mp4 файла.

Конвейер для потоковой передачи только видео, как показано ниже

Отправитель:

gst-launch-1.0 -v filesrc location = video.mp4! qtdemux name = демультиплексор демультиплексора. ! очередь ! rtpmp4apay pt = 97! udpsink host = 192.168.2.69 port = 5000

Получатель:

gst-launch-1.0 -v udpsrc port = 5000 caps = "application / x-rtp, media = audio, clock-rate = 44100, encoding-name = MP4A-LATM, cpresent = 0, config = 40002420, payload = 97, ssrc = 3386264266, timestamp-offset = 2822202855, seqnum-offset = 17719 "! rtpmp4adepay! decodebin! alsasink &

Это тоже работает успешно.

Но когда я попытался под конвейером синхронизировать потоковую передачу аудио / видео:

Отправитель:

gst-launch-1.0 -v filesrc location = sample.mp4! qtdemux name = demux demux. ! очередь ! rtph264pay pt = 96! udpsink host = 192.168.3.101 port = 5000 demux. ! очередь ! rtpmp4apay pt = 97! udpsink host = 192.168.3.101 port = 5001

Получатель:

gst-launch-1.0 -v udpsrc port = 5000 caps = "application / x-rtp, media = video, clock-rate = 90000, encoding-name = H264, payload = 96, ssrc = 2226494377, timestamp-offset. = 3242004369, seqnum-offset = 17021 "! rtph264depay! decodebin! ximagesink udpsrc port = 5001 caps = "application / x-rtp, media = audio, clock-rate = 44100, encoding-name = MP4A-LATM, cpresent = 0, config = 40002420, payload = 97, ssrc = 1499706502, timestamp- offset = 190741668, seqnum-offset = 24774 "! rtpmp4adepay! decodebin! alsasink

Но: получите вывод, как показано ниже:

ОШИБКА: из элемента / GstPipeline: pipeline0 / GstDecodeBin: decodebin1 / GstFaad: faad0: не удалось декодировать поток.

терпит неудачу. Кто-нибудь может предложить мне конвейер, который может синхронно передавать аудио / видео на целевое устройство.

Заранее спасибо.


person Sandeep Kumar    schedule 07.03.2016    source источник


Ответы (3)


Кажется, есть проблемы с AAC в RTP, а также с другими загрузчиками RTP в gstreamer.

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

Поэтому я предлагаю повторно объединить потоки данных в MPEG2-TS и передать их через RTP. Это дает несколько преимуществ, например хорошую повторную синхронизацию после потери пакета и то, что аудио / видео всегда остается синхронизированным.

Пример

У меня это работает с gstreamer 1.2.4:

Отправитель

gst-launch-1.0 -v filesrc location=/foo/bar.mp4 ! \
  qtdemux name=demux demux. ! h264parse config-interval=10 ! queue ! mux. \
  mpegtsmux name=mux ! rtpmp2tpay ! udpsink host=10.0.0.1 port=5003 \
  demux. ! aacparse ! queue ! mux.

Получатель (файл)

gst-launch-1.0 -v udpsrc port=5003 caps="application/x-rtp" ! \
  rtpmp2tdepay ! tsparse !  filesink location=/foo/bar.ts

Приемник (выход)

Эта команда основана на командах в вопросе, не удалось проверить ее с помощью ALSA:

gst-launch-1.0 -v udpsrc port=5003 caps="application/x-rtp" ! \
  rtpmp2tdepay ! tsparse ! tsdemux name=demux \
  demux. ! queue ! audioconvert ! alsasink \
  demux. ! queue ! xvimagesink
person Roy D'atze    schedule 07.03.2016
comment
Сторона приемника для прямого воспроизведения видео и аудио у меня не работает. - person Sandeep Kumar; 08.03.2016
comment
Что-то вроде сообщения об ошибке или вывода программы было бы немного полезнее! - person Roy D'atze; 09.03.2016
comment
Привет! Ваш пример у меня работает. Но только тогда, когда я запускаю серверные и клиентские команды на локальном компьютере. Если я пытаюсь транслировать видео на другой компьютер, у меня появляется следующий erorr: `ERROR: from element / GstUDPSrc: source: Could not get / set settings from / on resource./GstPlayBin:playbin0/GstURIDecodeBin:uridecodebin0/GstUDPSrc:source: bind failed : Ошибка привязки к адресу: Запрошенный адрес недействителен в своем. Что случилось со стримингом? - person JDo; 30.08.2018
comment
JDo, это похоже на несвязанную проблему, и вы должны создать с ней новый пост, включая вывод gstreamer и т. Д. - person Roy D'atze; 30.08.2018

Нет простого способа передать синхронно с gstreamer, если вы демультиплексируете видео- и аудиопоток на стороне отправителя. Информация о метке времени хранится в контейнере (в данном случае MP4), который теряется при демультиплексировании.

Попробуйте отправить MP4 на приемник, а затем демультиплексировать туда. Базовый пример можно найти здесь: Потоковое видео Mp4 через Протокол RTP с использованием Gstreamer в Ubuntu

person Roy D'atze    schedule 07.03.2016
comment
спасибо за ответ, но я могу получать видео, но предоставленная вами ссылка бесполезна для меня, так как мне тоже нужно транслировать аудио. Если у вас есть представление о том, как я могу транслировать аудио из mp4, пожалуйста, предложите это мне. - person Sandeep Kumar; 07.03.2016
comment
Поскольку он показывает ошибку декодирования: вы перепроверили, например с помощью ffprobe, что файл MP4 содержит аудиоданные AAC? - person Roy D'atze; 07.03.2016
comment
Да при применении вывода ffprob - поток № 0.1 (eng): Аудио: aac, 44100 Гц, стерео, s16, 93 кб / с Метаданные: creation_time: 2014-10-28 18:06:24 Не могли бы вы предоставить конвейер, который может транслировать только аудио из mp4. Таким образом, я могу убедиться, что звук передается правильно, поскольку я не могу этого сделать. - person Sandeep Kumar; 07.03.2016
comment
Я могу заставить его работать без части UDP: ....! qtdemux name = demux demux. ! очередь ! поддельный демультиплексор. ! очередь ! rtpmp4apay pt = 97! rtpmp4adepay! decodebin! audioconvert .... Но декодирование за UDP действительно глючное. Я смогу разобраться позже. - person Roy D'atze; 07.03.2016

Отправитель

gst-launch-1.0 filesrc location = ~ / 1.mp4! qtdemux name = d! очередь ! h264parse! rtph264pay config-interval = 10 pt = 96! udpsink host = 10.24.217.30 порт = 5000 d. ! очередь ! aacparse! rtpmp4apay pt = 97! udpsink host = 10.24.217.30 порт = 5001 -v

Получатель

gst-launch-1.0 udpsrc port = 5000 caps = application / x-rtp, media = (string) video, clock-rate = (int) 90000, payload = (int) 96, encoding-name = (string) H264! rtph264depay! тождество молчание = 0! avdec_h264! видеоконвертировать! ximagesink sync = 0 async = 0 udpsrc port = 5001 caps = application / x-rtp, media = audio, clock-rate = 44100, encoding-name = MP4A-LATM, cpresent = 0, config = 40002420, payload = 97, ssrc = 1499706502, смещение отметки времени = 190741668, смещение порядкового номера = 24774! rtpmp4adepay! avdec_aac! тождество молчание = 0! alsasink sync = 0 async = 0

Это работает правильно.

Примечание. Запуск получателя раньше, чем отправитель, выдает ошибку на стороне получателя при запуске отправителя. ** (gst-launch-1.0: 26959): CRITICAL **: 15: 15: 51.191: gst_audio_decoder_set_output_format: assertion 'GST_AUDIO_INFO_IS_VALID (info)' не удалось ОШИБКА: от элемента / GstPipeline: pipeline0 / avdec_aacr: avdec_aacr: avdec_aacr: avdec_aacr . Дополнительная отладочная информация: gstavauddec.c (449): gst_ffmpegauddec_negotiate (): / GstPipeline: pipeline0 / avdec_aac: avdec_aac0: Не удалось установить ограничения для декодера libav (aac), не исправлено?

Это могло быть ошибкой в ​​GST при согласовании ограничений. WAR должен начинать получатель после отправителя.

person Viranjan Pagar    schedule 16.07.2021