Gstreamer: приостановка / возобновление видео в потоках RTP - PullRequest
2 голосов
/ 17 января 2011

Я создаю конвейер gstreamer, который получает два потока RTP из сетевого источника:

  1. Поток аудио ILBC + соответствующий поток RTCP
  2. H263 Видеопоток + соответствующий поток RTCP

Все помещено в один конвейер gstreamer, поэтому он будет использовать RTCP из обоих потоков для синхронизации аудио / видео. До сих пор я придумал это (используя gst-launch для создания прототипов):

gst-launch -vvv  gstrtpbin name=rtpbin
  udpsrc caps="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H263-2000" port=40000 ! rtpbin.recv_rtp_sink_0
  rtpbin. ! rtph263pdepay ! ffdec_h263 ! xvimagesink
  udpsrc port=40001 ! rtpbin.recv_rtcp_sink_0
  rtpbin.send_rtcp_src_0 ! udpsink port=40002 sync=false async=false

  udpsrc caps="application/x-rtp,media=(string)audio,clock-rate=(int)8000,encoding-name=(string)PCMU,encoding-params=(string)1,octet-align=(string)1" port=60000 rtpbin.recv_rtp_sink_1
  rtpbin. ! rtppcmudepay ! autoaudiosink
  udpsrc port=60001 ! rtpbin.recv_rtcp_sink_1 
  rtpbin.send_rtcp_src_1 ! udpsink port=60002 sync=false async=false

Этот конвейер работает хорошо, если сетевой источник начинает с отправки как видео, так и аудио. Если видеопоток будет приостановлен позже, gstreamer все равно будет воспроизводить аудио и даже начнет воспроизводить видео, когда сетевой источник возобновит видеопоток.

Однако моя проблема заключается в том, что если сетевой источник запускается только с аудиопотоком (видео может быть добавлено позже), конвейер, кажется, приостанавливается / останавливается до тех пор, пока не начнется видеопоток.

Поскольку видео является необязательным (и может быть добавлено / удалено пользователем по желанию) в моем приложении, есть ли какой-нибудь способ, которым я могу подключить, например, 'videotestsrc', который предоставит некоторые резервные видеоданные для сохранения конвейер работает, когда нет сетевых видеоданных?

Я попытался поэкспериментировать с videotestsrc и штукой под названием videomixer, но я думаю, что микшер все еще требует, чтобы оба потока были живы. Любая обратная связь с благодарностью!

1 Ответ

1 голос
/ 14 октября 2011

Я представляю простую функцию для возобновления паузы путем изменения бункеров.В следующем примере я предоставляю логику для динамического изменения места назначения.Я не верю, что это полностью остановит трубопровод.Аналогичная логика может быть использована для бункеров src.Здесь вы можете удалить свою сетевую исходную ячейку и соответствующие ячейки декодера / демультиплексора и добавить ячейки videotestsrc.

private static void dynamic_bin_replacement(Pipeline pipe, Element src_bin, Element dst_bin_new, Element dst_bin_old) {
pipe.pause();
src_bin.unlink(dst_bin_old);                     
pipe.remove(dst_bin_old);
pipe.add(dst_bin_new);
dst_bin_new.syncStateWithParent();
src_bin.link(dst_bin_new);
pipe.ready();                    
pipe.play();
}

Другая логика, которую вы, возможно, захотите попробовать, - это «PADLOCKING».Пожалуйста, взгляните на следующие сообщения

http://cgit.freedesktop.org/gstreamer/gstreamer/tree/docs/design/part-block.txt

и

http://web.archiveorange.com/archive/v/8yxpz7FmOlGqxVYtkPb4

и

Добавлениеи удаление аудиоисточников в / из конвейера GStreamer на ходу

ОБНОВЛЕНИЕ

  1. Try output-selector и входные селекторы бункеров, так как они кажутся лучшей альтернативой.Я нашел их наиболее надежными и мне очень повезло с ними.Я использую fakesink или fakesrc соответственно в качестве другого конца селектора.

  2. клапан bin - еще одна альтернатива, котораяЯ обнаружил, что даже не нужно поддонов или поддонов корзин.Это также чрезвычайно надежно.

Также правильный порядок перехода состояний для источника медиа-файла

NULL -> READY -> PAUSED -> PLAYING (вверх)

PLAYING -> PAUSED -> READY -> NULL (Вниз)

Мой заказ в вышеприведенном примере должен быть исправлен, когда ready () должен предшествоватьПауза().Также я склонен думать, что отсоединение должно выполняться после состояния null (), а не после pause ().Я не пробовал эти изменения, но теоретически они должны работать.

Подробную информацию см. По следующей ссылке

http://cgit.freedesktop.org/gstreamer/gstreamer/tree/docs/design/part-states.txt?h=BRANCH-RELEASE-0_10_19

...