GStreamer и его цепочки
За трансляцию, запись и преобразование мультимедиа-информации в Virt2real отвечает приложение Gstreamer - модульное приложение, позволяющее строить цепочки обработки аудио-видео-потоков. К сожалению, альтернативные варианты почти полностью вытеснены этим продуктом из-за его тесной интеграциии в продукты TI. Эта интеграция состоит в наличии интерфейса к закрытым кодекам h.264/aac и уже реализованного механизма минимального копирования данных при обработке потока, что значительно сказывается на производительности.
Содержание |
Сборка SDK
После make defconfig выполнить Package Selection for the target -> Audio and video applications должны быть выбраны базовые модули gstreamer-a + gst-ti-dmai (собственно, поддержка кодеков). Если вы пользуетесь прошивкой по умолчанию - там уже все есть, беспокоится не надо. Особо отметим, что сборка DVSDK (а именно - DMAI) должна предшествовать сборке buildroot, потому что в при компиляции gst-ti-dmai потребуются готовые библиотеки.
Первые шаги
Установка ПО
Windows
GStreamer для Windows можно скачать с оф. сайта http://gstreamer.freedesktop.org/data/pkg/windows/1.0.10/ В процессе установки нужно выбрать "Выборочную установку" и выбрать все компоненты gstreamer.
Для Windows x86 необходимо уставить пакеты:
Для Windows x64 необходимо уставить пакеты:
Linux (deb-дистрибутивы)
Полный комплект gstreamer-a:
sudo apt-get install gstreamer0*
Базовый комплект (без шелухи):
sudo apt-get install gstreamer0.10 gstreamer0.10-plugins-base gstreamer0.10-plugins-bad gstreamer0.10-plugins-good gstreamer0.10-plugins-ugly
Mac OS X
Ставим необходимые пакеты
brew install gstreamer gst-libav gst-plugins-bad gst-plugins-base gst-plugins-good gst-plugins-ugly
Трансляция (UDP)
Для трансляции на комп 192.168.1.10 запустить на virt2real
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 rcalgo=0 \ bytestream=true encodingpreset=2 ratecontrol=1 intraframeinterval=46 idrinterval=46 \ targetbitrate=1000000 ! rtph264pay ! udpsink port=3000 host=192.168.1.10 sync=false enable-last-buffer=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)\"Z2QAKK2EBUViuKxUdCAqKxXFYqOhAVFYrisVHQg\ KisVxWKjoQFRWK4rFR0ICorFcVio6ECSFITk8nyfk/k/J8nm5s00IEkKQnJ5Pk/J/J+T5PNzZprQFAeyA\,aO48sA\=\=\", \ payload=(int)96, ssrc=(guint)2498431066, clock-base=(guint)297251943, seqnum-base=(guint)34949" ! \ rtph264depay ! queue ! ffdec_h264 ! ffmpegcolorspace ! videoscale ! ximagesink sync=false \ show-preroll-frame=false
Прием на Mac OS X:
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)\"Z2QAKK2EBUViuKxUdCAqKxXFYqOhAVFYrisVHQg\ KisVxWKjoQFRWK4rFR0ICorFcVio6ECSFITk8nyfk/k/J8nm5s00IEkKQnJ5Pk/J/J+T5PNzZprQFAeyA\,aO48sA\=\=\", \ payload=(int)96, ssrc=(guint)2498431066, clock-base=(guint)297251943, seqnum-base=(guint)34949" ! \ rtph264depay ! queue ! avdec_h264 ! videoconvert ! videoscale ! osxvideosink sync=false \ show-preroll-frame=false
Вторые шаги
Прием потока через TCP на плейер VLC
На виртурилке
gst-launch v4l2src always-copy=false chain-ipipe=true ! video/x-raw-yuv,format=\(fourcc\)NV12, \ width=640, height=480, framerate=\(fraction\)30/1 ! queue ! dmaienc_mjpeg ! multipartmux ! tcpserversink \ port=3000 sync=false
В VLC открываем url
tcp://адрес_virt2real:3000
Трансляция в HD
- на стороне устройства:
HOST_ADDR=<Client's IP address> PORT=3000 gst-launch -e v4l2src always-copy=FALSE input-src=composite chain-ipipe=true ! video/x-raw-yuv,format=\(fourcc\)NV12, width=1280, height=720, framerate=\(fraction\)23/1 ! queue ! dmaiaccel ! dmaienc_h264 encodingpreset=2 ratecontrol=2 intraframeinterval=23 idrinterval=46 targetbitrate=3000000 ! rtph264pay ! udpsink port=$PORT host=$HOST_ADDR sync=false enable-last-buffer=false &
- на стороне клиента (версия Ubuntu)
PORT=3000 gst-launch -v 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)1335677188, clock-base=(guint)2580247201, seqnum-base=(guint)5999' ! rtph264depay ! 'video/x-h264' ! ffdec_h264 ! 'video/x-raw-yuv, width=(int)1280, height=(int)720, framerate=(fraction)25/1, format=(fourcc)I420, interlaced=(boolean)false' ! xvimagesink
Остальные примеры цепочек приведены в соответствующих разделах пункта Видео-Аудио.