Почему использование H264 в поручителях отправителя / приемникам вводится просто огромная задержка?

StackOverflow https://stackoverflow.com/questions/2893407

Вопрос

Когда я пытаюсь создать трубопровод, который использует H264 для передачи видео, я получаю огромную задержку, до 10 секунд, чтобы передавать видео с моей машины, чтобы ... Моя машина! Это недопустимо для моих целей, и я хотел бы проконсультироваться в Stackoverflow Over, что я (или кого-то еще) сделать неправильно.

Я взял трубопроводы из страницы документации Gstrtpbin и слегка модифицировал их, чтобы использовать SPEEX:

Это отправитель трубопроводов: #! / Bin / sh

gst-launch -v gstrtpbin name=rtpbin \
        v4l2src ! ffmpegcolorspace ! ffenc_h263 ! rtph263ppay ! rtpbin.send_rtp_sink_0 \
                  rtpbin.send_rtp_src_0 ! udpsink host=127.0.0.1 port=5000                            \
                  rtpbin.send_rtcp_src_0 ! udpsink host=127.0.0.1 port=5001 sync=false async=false    \
                  udpsrc port=5005 ! rtpbin.recv_rtcp_sink_0                           \
        pulsesrc ! audioconvert ! audioresample  ! audio/x-raw-int,rate=16000 !    \
                  speexenc bitrate=16000 ! rtpspeexpay ! rtpbin.send_rtp_sink_1                   \
                  rtpbin.send_rtp_src_1 ! udpsink host=127.0.0.1 port=5002                            \
                  rtpbin.send_rtcp_src_1 ! udpsink host=127.0.0.1 port=5003 sync=false async=false    \
                  udpsrc port=5007 ! rtpbin.recv_rtcp_sink_1

Трубопровод для ресивера:

! / bin / sh

gst-launch -v\
    gstrtpbin name=rtpbin                                          \
    udpsrc caps="application/x-rtp,media=(string)video, clock-rate=(int)90000, encoding-name=(string)H263-1998" \
            port=5000 ! rtpbin.recv_rtp_sink_0                                \
        rtpbin. ! rtph263pdepay ! ffdec_h263 ! xvimagesink                    \
     udpsrc port=5001 ! rtpbin.recv_rtcp_sink_0                               \
     rtpbin.send_rtcp_src_0 ! udpsink port=5005 sync=false async=false        \
    udpsrc caps="application/x-rtp,media=(string)audio, clock-rate=(int)16000, encoding-name=(string)SPEEX, encoding-params=(string)1, payload=(int)110" \
            port=5002 ! rtpbin.recv_rtp_sink_1                                \
        rtpbin. ! rtpspeexdepay ! speexdec ! audioresample ! audioconvert ! alsasink \
     udpsrc port=5003 ! rtpbin.recv_rtcp_sink_1                               \
     rtpbin.send_rtcp_src_1 ! udpsink host=127.0.0.1 port=5007 sync=false async=false

Эти трубопроводы, комбинация H263 и STEX, работают достаточно хорошо. Я поднял пальцы возле камеры и микропохин, а затем я вижу движение и слышу звук одновременно.

Затем я изменил трубопроводы, чтобы использовать H264 вдоль видео.

Отправитель становится: #! / Bin / Sh

gst-launch -v gstrtpbin name=rtpbin \
        v4l2src ! ffmpegcolorspace ! x264enc bitrate=300 ! rtph264pay ! rtpbin.send_rtp_sink_0 \
                  rtpbin.send_rtp_src_0 ! udpsink host=127.0.0.1 port=5000                            \
                  rtpbin.send_rtcp_src_0 ! udpsink host=127.0.0.1 port=5001 sync=false async=false    \
                  udpsrc port=5005 ! rtpbin.recv_rtcp_sink_0                           \
        pulsesrc ! audioconvert ! audioresample  ! audio/x-raw-int,rate=16000 !    \
                  speexenc bitrate=16000 ! rtpspeexpay ! rtpbin.send_rtp_sink_1                   \
                  rtpbin.send_rtp_src_1 ! udpsink host=127.0.0.1 port=5002                            \
                  rtpbin.send_rtcp_src_1 ! udpsink host=127.0.0.1 port=5003 sync=false async=false    \
                  udpsrc port=5007 ! rtpbin.recv_rtcp_sink_1

И приемник становится: #! / Bin / sh

gst-launch -v\
    gstrtpbin name=rtpbin                                          \
    udpsrc caps="application/x-rtp,media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264" \
            port=5000 ! rtpbin.recv_rtp_sink_0                                \
        rtpbin. ! rtph264depay ! ffdec_h264 ! xvimagesink                    \
     udpsrc port=5001 ! rtpbin.recv_rtcp_sink_0                               \
     rtpbin.send_rtcp_src_0 ! udpsink port=5005 sync=false async=false        \
    udpsrc caps="application/x-rtp,media=(string)audio, clock-rate=(int)16000, encoding-name=(string)SPEEX, encoding-params=(string)1, payload=(int)110" \
            port=5002 ! rtpbin.recv_rtp_sink_1                                \
        rtpbin. ! rtpspeexdepay ! speexdec ! audioresample ! audioconvert ! alsasink \
     udpsrc port=5003 ! rtpbin.recv_rtcp_sink_1                               \
     rtpbin.send_rtcp_src_1 ! udpsink host=127.0.0.1 port=5007 sync=false async=false

Это то, что происходит под Ubuntu 10.04. Я не заметил такие огромные задержки на Ubuntu 9.04 - задержки там находились в диапазоне 2-3 секунды, afair.

Это было полезно?

Решение

С некоторой помощью от «Sharktooth» в # X264 на Freenode я обнаружил, что Git версия GST-плагинов-уродливых поддерживает предустановку «нулевой задержки».

http://cgit.freedesktop.org/gstreamer/gst-plugins-ugly.

Я настраивал ваш пример, чтобы установить «CH264ENC Pass Pass = Qual Clantizer = 20 Tune = Zerolatency», и задержка, кажется, остается на 0,7 - 0,9 секунды. Я не могу понять, как получить его ниже.

Другие советы

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

X264 по умолчанию буферы по умолчанию вход, чтобы иметь больше данных для работы. Увеличение задержки от Ubuntu 10.04, скорее всего, потому что он застрял на старой версии X264, до введения --mbtree и --rc-lookahead.

В Эта страница Mewiki Вы можете увидеть, как рассчитать задержку, в количестве кадров и следующее, на то, что вы должны сначала отключить, чтобы уменьшить задержку:

Возможна уменьшение задержки X264, но снижает качество. Если вы не хотите задержки, установите itune Zerolatency. Если вы можете справиться с небольшой задержкой (т.е. до 1 секунды), стоит настроить параметры, чтобы позволить этому. Вот серия шагов, которые вы можете постепенно сократить задержку. Стоп, когда ваша задержка достаточно низкая:

  1. Начните с по умолчанию
  2. Убить Sync-lookahead
  3. Drop RC-Lookahead до не менее ~ 10
  4. Падение нити до более низкого значения (т. Е. Скажи 6 вместо 12)
  5. Используйте нарезанные нити
  6. Отключить RC-lookahead
  7. Отключить B-кадры
  8. Теперь вы в том --tune Zerolatency

Итак, вы должны сначала попытаться добавить в свою командную строку что-то вроде

Sync-lookahead = 0, RC-lookahead = 10 (я не уверен в форматировании командной строки в вашем приложении)

Это должно побриться большую часть задержки, при низкой стоимости эффективности сжатия. Если у вас есть много ядер (например, квадроцикл с HT), это также может быть стоить номера 4., на небольшую стоимость скорости.

Используйте Tune = Zerolatency, согласно рекомендациям Sharktooth, если это все еще недостаточно.

Подробнее по теме: http://x264dev.multimedia.cx/Чахивы/249.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top