RTP/UDP/TCP

Материал из virt2real wiki
Перейти к: навигация, поиск

Содержание

Передача видео

Большинство примеров по передаче видео и звука использует GStreamer для приёма потока. Версии могут отличаться (0.10 или 1.xx), основное отличие в цепочках - в GStreamer 1.xx элемент ffdec_h264 был переименован в avdec_h264.

RTP (SD)

Передача на Виртурилке:

gst-launch v4l2src always-copy=false chain-ipipe=true ! \
   video/x-raw-yuv,format='(fourcc)'NV12, width=640, height=480, framerate='(fraction)'30/1 ! \
   dmaiaccel ! \
   dmaienc_h264 ddrbuf=true encodingpreset=2 ratecontrol=4 targetbitrate=600000 ! \
   rtph264pay !  queue ! \
   udpsink port=3000 host=<ip_адрес_клиента> sync=false

Приём (Linux):

gst-launch udpsrc port=3000 ! \ 
   "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, \ 
   sprop-parameter-sets=(string)\"Z2QAKK2EBUViuKxUdCAqKxXFYqOhAVFYrisVHQgKisVxWKjoQFRWK4rFR0ICorFcVio6ECSFITk8nyfk/k/J8nm5s00IEkKQnJ5Pk/J/J+T5PNzZprQFAeyA\,aO48sA\=\=\", \
   payload=(int)96, ssrc=(guint)2498431066, clock-base=(guint)297251943, seqnum-base=(guint)34949" ! \
   rtph264depay ! queue ! avdec_h264 ! postproc_tmpnoise ! ffmpegcolorspace ! \
   ximagesink sync=false show-preroll-frame=false

Приём (Windows): Перед запуском в Windows рекомендуем в консоли (запускаемой пуск-выполнить-cmd.exe) перейти в папку с исполняемым файлом gstreamer-a. Обычно это c:\gstreamer\1.0\x64_86\bin. Путь может отличаться в зависимости от установленной версии gstreamer. Данный пример действителен для gstreamer 1.0

gst-launch-1.0 udpsrc port=3000 ! \
"application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, sprop-parameter-sets=(string)\"Z2QAM62EBUViuKxUdCAqKxXFYqOhAVFYrisVHQgKisVxWKjoQFRWK4rFR0ICorFcVio6ECSFITk8nyfk/k/J8nm5s00IEkKQnJ5Pk/J/J+T5PNzZprQFAeyA\,aO48sA\=\=\", \
payload=(int)96, ssrc=(guint)1501768479, clock-base=(guint)2009522317, seqnum-base=(guint)40332" ! \
rtph264depay ! \
avdec_h264 ! \
d3dvideosink sync=false enable-navigation-events=false show-preroll-frame=false max-lateness=10

Если работаете с gstreamer 0.10 то необходимо два изменения: gst-launch-0.10 вместо gst-launch-1.0 и avdec_h264 вместо ffdec_h264. Вот строка в Windows для gstreamer 0.10:

gst-launch-0.10 udpsrc port=3000 ! \
"application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, sprop-parameter-sets=(string)\"Z2QAM62EBUViuKxUdCAqKxXFYqOhAVFYrisVHQgKisVxWKjoQFRWK4rFR0ICorFcVio6ECSFITk8nyfk/k/J8nm5s00IEkKQnJ5Pk/J/J+T5PNzZprQFAeyA\,aO48sA\=\=\", \
payload=(int)96, ssrc=(guint)1501768479, clock-base=(guint)2009522317, seqnum-base=(guint)40332" ! \
rtph264depay ! \
ffdec_h264 ! \
d3dvideosink sync=false enable-navigation-events=false show-preroll-frame=false max-lateness=10

RTP (HD)

Передача на Виртурилке:

gst-launch v4l2src always-copy=false chain-ipipe=true ! \
   video/x-raw-yuv,format='(fourcc)'NV12, width=1280, height=720, framerate='(fraction)'30/1 ! \
   dmaiaccel ! \
   dmaienc_h264 ddrbuf=true encodingpreset=2 ratecontrol=4 targetbitrate=2000000 ! \
   rtph264pay !  queue ! \
   udpsink port=3000 host=<ip_адрес_клиента> sync=false


Приём (Windows):

Для gstreamer 1.0:

gst-launch-1.0 udpsrc port=3000 ! \
"application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, \
sprop-parameter-sets=(string)\"Z2QAKK2EBUViuKxUdCAqKxXFYqOhAVFYrisVHQgKisVxWKjoQFRWK4rFR0ICorFcVio6ECSFITk8nyfk/k/J8nm5s00IEkKQnJ5Pk/J/J+T5PNzZprQCgC3I\,aO48sA\=\=\", \
payload=(int)96, ssrc=(guint)321130676, clock-base=(guint)96808957, seqnum-base=(guint)33742" ! \
queue ! \
rtph264depay ! \
avdec_h264 ! \
queue ! \
d3dvideosink sync=false

Для gstreamer 0.10:

gst-launch-0.10 udpsrc port=3000 ! \
"application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, \
sprop-parameter-sets=(string)\"Z2QAKK2EBUViuKxUdCAqKxXFYqOhAVFYrisVHQgKisVxWKjoQFRWK4rFR0ICorFcVio6ECSFITk8nyfk/k/J8nm5s00IEkKQnJ5Pk/J/J+T5PNzZprQCgC3I\,aO48sA\=\=\", \
payload=(int)96, ssrc=(guint)321130676, clock-base=(guint)96808957, seqnum-base=(guint)33742" ! \
queue ! \
rtph264depay ! \
ffdec_h264 ! \
queue ! \
d3dvideosink sync=false

MJPEG + TCP (SD)

Запустим MJPEG-сервер на порту 8888 на виртурилке:

gst-launch v4l2src always-copy=false chain-ipipe=true  ! \
   video/x-raw-yuv,format=\(fourcc\)NV12, width=640, height=480, framerate=\(fraction\)30/1 ! \
   dmaiaccel ! dmaienc_mjpeg qValue=40 copyOutput=true outputBufferSize=0 ! \
   tcpserversink port=8888  sync=false

MJPEG + UDP

Передача (на Виртурилке):

gst-launch v4l2src always-copy=FALSE chain-ipipe=true ! \ 
   video/x-raw-yuv,format=\(fourcc\)NV12, width=640, height=480, framerate=\(fraction\)30/1 ! \
   dmaiaccel ! queue ! dmaienc_mjpeg qValue=40 ! \ 
   udpsink port=3000 host=192.168.1.44 sync=false enable-last-buffer=false

Приём (Linux):

gst-launch udpsrc port=3000 caps="image/jpeg, width=(int)640, heigth=(int)480, framerate=30/1" ! \
   queue ! jpegdec ! ffmpegcolorspace ! ximagesink sync=false

Добавим таймер поверх видео и фильтрацию шумов на приёмной стороне:

gst-launch udpsrc port=3000 caps="image/jpeg, width=(int)640, heigth=(int)480, framerate=30/1" ! \
   queue ! jpegdec ! postproc_tmpnoise !  ffmpegcolorspace ! \
   clockoverlay shaded-background=true halignment=2 line-alignment=2 ! \
   timeoverlay shaded-background=true  ! \
   ximagesink sync=false

Передача звука

AAC (unicast)

На виртурилке:

gst-launch alsasrc buffer-time=200000 latency-time=200000 slave-method=0 ! "audio/x-raw-int, channels=1, rate=16000, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16" ! dmaienc_aac copyOutput=false outputBufferSize=20000  bitrate=16000 downmix=false invquant=1 tns=true outputformat=1 ! rtpmp4apay ! udpsink port=3000 host=192.168.1.10


Приём юникаста на десктопе под виндой (под линухом аналогично но в конце alsasink, а не autoaudiosink):

e:\gstreamer-sdk\0.10\x86_64\bin\gst-launch-0.10 udpsrc port=3000 caps="application/x-rtp, media=(string)audio, clock-rate=(int)16000, encoding-name=(string)MP4A-LATM, cpresent=(string)0, config=(string)40002810, payload=(int)96, ssrc=(uint)723033857, clock-base=(uint)3702678, seqnum-base=(uint)15429"  ! rtpmp4adepay  ! decodebin2 ! autoaudiosink sync=false

AAC (multicast)

Отправка мультикастом с виртурилки на виртурилку:

gst-launch alsasrc buffer-time=200000 latency-time=200000 slave-method=0 ! "audio/x-raw-int, channels=2, rate=16000, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16" ! dmaienc_aac copyOutput=false outputBufferSize=20000  bitrate=16000 downmix=false invquant=1 tns=true outputformat=1 ! rtpmp4apay ! udpsink port=3000 host=224.1.1.1 auto-multicast=true

Приём мультикаста на виртурилке:

gst-launch udpsrc port=3000 multicast-group=224.1.1.1 auto-multicast=true caps="application/x-rtp, media=(string)audio, clock-rate=(int)16000, encoding-name=(string)MP4A-LATM, cpresent=(string)0, config=(string)40002820, payload=(int)96, ssrc=(uint)3286409006, clock-base=(uint)651450343, seqnum-base=(uint)59757"  ! rtpmp4adepay queue-delay=0 ! dmaidec_aac generateTimestamps=true ! alsasink sync=false discont-wait=0 slave-method=2 latency-time=1 buffer-time=20000 max-lateness=1

Передача видео и звука

RTP (HD H.264 + AAC)

На виртурилке:

#!/bin/sh
IP=192.168.10.10
VPORT=5000
APORT=5001
gst-launch -ve \
        v4l2src always-copy=false chain-ipipe=true ! \
        video/x-raw-yuv,format='(fourcc)'NV12, width=1280, height=720, \
                framerate='(fraction)'30/1 ! \
        dmaiaccel ! \
        dmaienc_h264 ddrbuf=true rcalgo=0 bytestream=true encodingpreset=2 \
                ratecontrol=1 intraframeinterval=46 idrinterval=46 targetbitrate=1000000 ! \
        rtph264pay ! \
        udpsink port=$VPORT host=$IP sync=false enable-last-buffer=false \
        alsasrc latency-time=10000 slave-method=0 ! \
        audio/x-raw-int, channels=1, rate=16000, \
                endianness=1234,signed=true,width=16,depth=16 ! \
        dmaienc_aac bitrate=32000 tns=false copyOutput=true outputBufferSize=90000 ! \
        queue ! \
        udpsink host=$IP port=$APORT