Может ли ошибка sdp вызвать повреждение потока? - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь получить живой поток RTP (через udp) (h264) от моего Raspberry Pi, используя GStreamer (rpicamsrc). Видео захватывается и пересылается в браузер с помощью Kurento Media Server, то есть RPi -> KMS -> Browser.

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

Отображение поврежденного потока:

image

Некоторые коллеги предложили проблемы с чересстрочными / p-кадрами (?), Но я не имею ни малейшего понятия об этом или о том, что мне следует искать.

искажение SDP от получателя

String rtpSdpOffer =
    "v=0\r\n"
    + "o=- 0 0 IN IP4 " + senderIp + "\r\n"
    + "s=Kurento Tutorial - RTP Player\r\n"
    + "c=IN IP4 " + senderIp + "\r\n"
    + "t=0 0\r\n";

if (useAudio) {
  rtpSdpOffer +=
      "m=audio " + senderRtpPortA + " RTP/AVPF 96\r\n"
      + "a=rtpmap:96 opus/48000/2\r\n"
      + "a=sendonly\r\n"
      + sdpComediaAttr
      + "a=ssrc:" + senderSsrcA + " cname:" + senderCname + "\r\n";
}

rtpSdpOffer +=
    "m=video " + senderRtpPortV + " " + senderProtocol + " 103\r\n"
    + sdpCryptoAttr
    + "a=rtpmap:103 " + senderCodecV + "/90000\r\n"
    + "a=rtcp-fb:103 goog-remb\r\n"
    + "a=sendonly\r\n"
    + sdpComediaAttr
    + "a=ssrc:" + senderSsrcV + " cname:" + senderCname + "\r\n"
    + "";

Gstreamer скрипт для начала потока

    PEER_A={KMS_AUDIO_PORT} PEER_V={KMS_VIDEO_PORT} PEER_IP={KMS_PUBLIC_IP} \
SELF_PATH="{PATH_TO_VIDEO_FILE}" \
SELF_A=5006 SELF_ASSRC=445566 \
SELF_V=5004 SELF_VSSRC=112233 \
bash -c 'gst-launch-1.0 -e \
    rtpbin name=r sdes="application/x-rtp-source-sdes,cname=(string)\"user\@example.com\"" \
    rpicamsrc ! video/x-raw,width=200,height=150,framerate=25/1 ! decodebin name=d \
    d. ! x264enc tune=zerolatency \
        ! rtph264pay ! "application/x-rtp,payload=(int)103,clock-rate=(int)90000,ssrc=(uint)$SELF_VSSRC" \
        ! r.send_rtp_sink_1 \
    r.send_rtp_src_1 ! udpsink host=$PEER_IP port=$PEER_V bind-port=$SELF_V \
    r.send_rtcp_src_1 ! udpsink host=$PEER_IP port=$((PEER_V+1)) bind-port=$((SELF_V+1)) sync=false async=false \
    udpsrc port=$((SELF_V+1)) ! tee name=t \
        t. ! queue ! r.recv_rtcp_sink_1 \
        t. ! queue ! fakesink dump=true async=false'

Любая помощь с благодарностью

1 Ответ

0 голосов
/ 04 сентября 2018

SDP может привести к коррупции. Если данные кодека, которые вы передаете туда, не соответствуют потоку. Но похоже, что вы не передаете данные кодека через SDP, но, вероятно, внутриполосные.

Артефакт на изображении выглядит как проблема с байтом / шагом. Возможно, это связано с размерами вашего видео. Рекомендуется использовать разрешения, кратные 16. Однако это все равно должно работать. Возможно, что декодер / рендерер делает что-то странное. Я бы попытался получить поток и сохранить его в файл, посмотреть его в обычном видеоплеере и проверить, отображается ли он лучше, и о каких видеоизображениях сообщается.

...