#video-streaming #h.264 #gstreamer #rtp
#потоковое видео #глава264 #gstreamer #rtp
Вопрос:
Я хотел бы создать приложение для потоковой передачи видео по беспроводной сети с использованием GStreamer. Мои требования таковы: кодек H.264, поток RTP / MPEG2-TS и протокол RTP по сети.
Не мог бы кто-нибудь, пожалуйста, объяснить, что мне нужно создать какой-либо плагин для этого или существующие плагины могут предоставить все функциональные возможности? Если да, то какие плагины я должен использовать? Я хотел бы добавить еще один момент, что я буду снимать видео с помощью телефона и передавать с этого устройства по сети на один или несколько конкретных адресов. Пожалуйста, ответьте. Заранее спасибо.
Ответ №1:
gstrtpbin должен удовлетворять всем вашим потребностям в потоковой передаче. Это позволит вам передавать поток RTP на один или несколько адресов. Для получения инструкций по его использованию в исходном коде gstreamer есть несколько примеров на нескольких разных языках. Gstreamer также позволит вам кодировать видео в поток H.264 с использованием x264. Это включено в пакет «уродливых» плагинов.
Ответ №2:
Учитывая RTP (измените хост / ip по мере необходимости), следующие конвейеры должны помочь. В соответствии с вашими требованиями вы можете заменить ffenc_mpeg4
на x264enc pass=qual quantizer=20 tune=zerolatency
, rtpmp4vpay
на rtph264pay
. Аналогично на стороне декодера вы можете заменить ffdec_mpeg4
на x264dec
, rtpmp4vdepay
на rtph264depay
. Возможно, потребуется также изменить несколько других параметров.
1) RTP отправляет веб-камеру и аудио
gst-launch gstrtpbin name=rtpbin latency=0 v4l2src device=/dev/video0 ! typefind ! ffmpegcolorspace ! videoscale ! video/x-raw-yuv, width=640, height=480 ! videorate ! video/x-raw-yuv, framerate=30/1 ! ffenc_mpeg4 ! rtpmp4vpay send-config=true ! rtpbin.send_rtp_sink_0 rtpbin.send_rtp_src_0 ! udpsink port=5502 host=127.0.0.1 rtpbin.send_rtcp_src_0 ! udpsink port=5510 host=127.0.0.1 sync=false async=false udpsrc port=5510 ! rtpbin.recv_rtcp_sink_0 autoaudiosrc samplesperbuffer=1000 ! alawenc ! rtppcmapay ! rtpbin.send_rtp_sink_1 rtpbin.send_rtp_src_1 ! udpsink port=5504 host=127.0.0.1 rtpbin.send_rtcp_src_1 ! udpsink port=5512 host=127.0.0.1 sync=false async=false udpsrc port=5512 ! rtpbin.recv_rtcp_sink_1
2) RTP принимает веб-камеру и аудио
gst-launch gstrtpbin name=rtpbin2 latency=0 udpsrc caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)MP4V-ES, profile-level-id=(string)1" port=5502 ! rtpbin2.recv_rtp_sink_0 rtpbin2. ! rtpmp4vdepay ! ffdec_mpeg4 ! videoscale ! video/x-raw-yuv, width=640, height=480 ! videorate ! video/x-raw-yuv, framerate=30/1 ! ffmpegcolorspace ! autovideosink udpsrc port=5510 ! rtpbin2.recv_rtcp_sink_0 rtpbin2.send_rtcp_src_0 ! udpsink host=127.0.0.1 port=5510 sync=false async=false udpsrc caps="application/x-rtp,media=(string)audio, clock-rate=(int)8000, encoding-name=(string)PCMA" port=5504 ! rtpbin2.recv_rtp_sink_1 rtpbin2. ! rtppcmadepay ! alawdec ! autoaudiosink buffer-time=10000 udpsrc port=5512 ! rtpbin2.recv_rtcp_sink_1 rtpbin2.send_rtcp_src_1 ! udpsink host=127.0.0.1 port=5512 sync=false async=false