Я пытался прочитать канал RTP с моего HDHR-тюнера с нулевым успехом. У кого-нибудь есть опыт с этим?

GStreamer:

gst-launch --gst-debug=udpsrc:5 udpsrc port=5000 caps="application/x-rtp,media=(string)video,format=(fourcc)I420, width=(int)720, height=(int)480,encoding-name=(string)RAW,sampling=(string)YUV,pixel-aspect-ratio=(fraction)8/9, framerate=(fraction)30000/1001, interlaced=(boolean)true" ! gstrtpbin ! rtpvrawdepay ! filesink location=/tmp/output
  • В какой-то момент я получил возможности через автоопределение.

HDHR:

hdhomerun_config 1310DA25 set /tuner2/target udp://192.168.5.102:5000

Когда я пытаюсь отправить через RTP (rtp://192.168.5.102:5000, вместо использования UDP, как описано выше), я получаю ошибку UDP каждый раз, независимо от того, какие возможности, всякий раз, когда она опускается в gstrtpbin:

ERROR: from element /GstPipeline:pipeline0/GstUDPSrc:udpsrc0: Internal data flow error.

Я предполагаю, что это означает, что возможности не совпадают между связанными площадками.

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

--gst-debug для различных элементов на разных уровнях не дал мне ничего полезного.

VLC работает отлично, отправляю ли я на rtp://xxx.xxx.xxx.xxx:nnnn и получаю на rtp://:nnnn, или отправляю на udp://xxx.xxx.xxx.xxx:nnnn и получение по udp://:nnnn.

Какие-нибудь мысли?

Кроме того, не может ли GST автоматически определить возможности потока RTP? Я не знаю, как я споткнулся об этом (чтобы получить описанные выше возможности), но это не кажется очень интуитивным. Похоже, что если бы VLC (супер-универсальный) мог сделать это, GStreamer (также супер-универсальный) мог бы сделать это.

Благодарю.

Dustin

Кстати, я получил это с помощью playbin2:

dustin@dustinlenovo:/tmp$ gst-launch --gst-debug=playbin2:5 playbin2 uri=udp://192.168.5.102:5000
0:00:00.021952272 32470  0x9683400 LOG                 playbin2 gstplaybin2.c:1318:gst_playbin_uri_is_valid:<playbin20> checking uri 'udp://192.168.5.102:5000'
0:00:00.022006314 32470  0x9683400 DEBUG               playbin2 gstplaybin2.c:1372:gst_play_bin_set_uri: set new uri to udp://192.168.5.102:5000
Setting pipeline to PAUSED ...
0:00:00.022144060 32470  0x9683400 LOG                 playbin2 gstplaybin2.c:3895:gst_play_bin_change_state:<playbin20> clearing shutdown flag
0:00:00.022164495 32470  0x9683400 DEBUG               playbin2 gstplaybin2.c:3790:setup_next_source:<playbin20> setup sources
0:00:00.022194614 32470  0x9683400 DEBUG               playbin2 gstplaybin2.c:3477:activate_group:<playbin20> activating group 0x9711318
0:00:00.022208169 32470  0x9683400 DEBUG               playbin2 gstplaybin2.c:3498:activate_group:<playbin20> making new uridecodebin
0:00:00.022597792 32470  0x9683400 DEBUG               playbin2 gstplaybin2.c:3456:group_set_locked_state_unlocked:<playbin20> locked_state 0 on group 0x9711318
0:00:00.023812556 32470  0x9683400 DEBUG               playbin2 gstplaybin2.c:2317:gst_play_bin_handle_message:<playbin20> Ignoring async state change of uridecodebin: uridecodebin0
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock





0:00:14.542698212 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3214:autoplug_continue_cb:<playbin20> continue autoplugging group 0x9711318 for '':decodepad0, video/mpegts, systemstream=(boolean)true, packetsize=(int)188: 1
0:00:14.542910589 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3049:autoplug_factories_cb:<playbin20> factories group 0x9711318 for '':decodepad0, video/mpegts, systemstream=(boolean)true, packetsize=(int)188
0:00:14.550811109 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3059:autoplug_factories_cb:<playbin20> found factories 0xb64189b0
0:00:14.551117538 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3268:autoplug_select_cb:<playbin20> select group 0x9711318 for '':decodepad0, video/mpegts, systemstream=(boolean)true, packetsize=(int)188
0:00:14.551202471 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3271:autoplug_select_cb:<playbin20> checking factory mpegtsdemux
0:00:14.713355113 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3214:autoplug_continue_cb:<playbin20> continue autoplugging group 0x9711318 for '':decodepad1, audio/x-ac3: 1
0:00:14.713401299 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3049:autoplug_factories_cb:<playbin20> factories group 0x9711318 for '':decodepad1, audio/x-ac3
0:00:14.713622715 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3059:autoplug_factories_cb:<playbin20> found factories 0xb6418b80
0:00:14.714048757 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3268:autoplug_select_cb:<playbin20> select group 0x9711318 for '':decodepad1, audio/x-ac3
0:00:14.714097628 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3271:autoplug_select_cb:<playbin20> checking factory pulsesink
0:00:14.714125521 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3344:autoplug_select_cb:<playbin20> we found a sink
0:00:14.714151129 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3350:autoplug_select_cb:<playbin20> we found an audio sink
0:00:14.714177845 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3393:autoplug_select_cb:<playbin20> we have no pending sink, try to create one
0:00:14.724957778 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3268:autoplug_select_cb:<playbin20> select group 0x9711318 for '':decodepad1, audio/x-ac3
0:00:14.725003694 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3271:autoplug_select_cb:<playbin20> checking factory ac3parse
0:00:14.725687536 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3049:autoplug_factories_cb:<playbin20> factories group 0x9711318 for '':decodepad2, audio/x-ac3, framed=(boolean)true, channels=(int)[ 1, 6 ], rate=(int)[ 8000, 48000 ], alignment=(string){ iec61937, frame }; audio/x-eac3, framed=(boolean)true, channels=(int)[ 1, 6 ], rate=(int)[ 8000, 48000 ], alignment=(string){ iec61937, frame }
0:00:14.725996661 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3059:autoplug_factories_cb:<playbin20> found factories 0xb6458eb0
0:00:14.728966979 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3214:autoplug_continue_cb:<playbin20> continue autoplugging group 0x9711318 for '':decodepad3, video/mpeg, mpegversion=(int)2, systemstream=(boolean)false: 1
0:00:14.729094763 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3049:autoplug_factories_cb:<playbin20> factories group 0x9711318 for '':decodepad3, video/mpeg, mpegversion=(int)2, systemstream=(boolean)false
0:00:14.730460890 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3059:autoplug_factories_cb:<playbin20> found factories 0xb6418620
0:00:14.731074426 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3268:autoplug_select_cb:<playbin20> select group 0x9711318 for '':decodepad3, video/mpeg, mpegversion=(int)2, systemstream=(boolean)false
0:00:14.731165683 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3271:autoplug_select_cb:<playbin20> checking factory mpegvideoparse
0:00:14.744258860 32470 0xb643be90 DEBUG               playbin2 gstplaybin2.c:3214:autoplug_continue_cb:<playbin20> continue autoplugging group 0x9711318 for '':decodepad5, video/mpeg, mpegversion=(int)2, systemstream=(boolean)false, parsed=(boolean)true: 1
0:00:14.744409010 32470 0xb643be90 DEBUG               playbin2 gstplaybin2.c:3049:autoplug_factories_cb:<playbin20> factories group 0x9711318 for '':decodepad5, video/mpeg, mpegversion=(int)2, systemstream=(boolean)false, parsed=(boolean)true
0:00:14.744667670 32470 0xb643be90 DEBUG               playbin2 gstplaybin2.c:3059:autoplug_factories_cb:<playbin20> found factories 0xb4c00950
0:00:14.744743720 32470 0xb643be90 DEBUG               playbin2 gstplaybin2.c:3268:autoplug_select_cb:<playbin20> select group 0x9711318 for '':decodepad5, video/mpeg, mpegversion=(int)2, systemstream=(boolean)false, parsed=(boolean)true
0:00:14.744758143 32470 0xb643be90 DEBUG               playbin2 gstplaybin2.c:3271:autoplug_select_cb:<playbin20> checking factory mpeg2dec
0:00:14.854031750 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3214:autoplug_continue_cb:<playbin20> continue autoplugging group 0x9711318 for '':decodepad7, audio/x-ac3: 1
0:00:14.854191602 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3049:autoplug_factories_cb:<playbin20> factories group 0x9711318 for '':decodepad7, audio/x-ac3
0:00:14.854649600 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3059:autoplug_factories_cb:<playbin20> found factories 0xb6471880
0:00:14.855619479 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3268:autoplug_select_cb:<playbin20> select group 0x9711318 for '':decodepad7, audio/x-ac3
0:00:14.855700091 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3271:autoplug_select_cb:<playbin20> checking factory pulsesink
0:00:14.855776440 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3344:autoplug_select_cb:<playbin20> we found a sink
0:00:14.855877980 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3350:autoplug_select_cb:<playbin20> we found an audio sink
0:00:14.855955069 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3393:autoplug_select_cb:<playbin20> we have no pending sink, try to create one
0:00:14.861079720 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3268:autoplug_select_cb:<playbin20> select group 0x9711318 for '':decodepad7, audio/x-ac3
0:00:14.861206558 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3271:autoplug_select_cb:<playbin20> checking factory ac3parse
0:00:14.861928499 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3049:autoplug_factories_cb:<playbin20> factories group 0x9711318 for '':decodepad8, audio/x-ac3, framed=(boolean)true, channels=(int)[ 1, 6 ], rate=(int)[ 8000, 48000 ], alignment=(string){ iec61937, frame }; audio/x-eac3, framed=(boolean)true, channels=(int)[ 1, 6 ], rate=(int)[ 8000, 48000 ], alignment=(string){ iec61937, frame }
0:00:14.862580662 32470  0x95e5720 DEBUG               playbin2 gstplaybin2.c:3059:autoplug_factories_cb:<playbin20> found factories 0xb646de20
0:00:14.864351517 32470 0xb643bf50 DEBUG               playbin2 gstplaybin2.c:3214:autoplug_continue_cb:<playbin20> continue autoplugging group 0x9711318 for '':decodepad9, audio/x-ac3, framed=(boolean)true, rate=(int)48000, channels=(int)2, alignment=(string)frame: 1
0:00:14.864560656 32470 0xb643bf50 DEBUG               playbin2 gstplaybin2.c:3049:autoplug_factories_cb:<playbin20> factories group 0x9711318 for '':decodepad9, audio/x-ac3, framed=(boolean)true, rate=(int)48000, channels=(int)2, alignment=(string)frame
0:00:14.865104298 32470 0xb643bf50 DEBUG               playbin2 gstplaybin2.c:3059:autoplug_factories_cb:<playbin20> found factories 0xb4101e40
0:00:14.865443547 32470 0xb643bf50 DEBUG               playbin2 gstplaybin2.c:3268:autoplug_select_cb:<playbin20> select group 0x9711318 for '':decodepad9, audio/x-ac3, framed=(boolean)true, rate=(int)48000, channels=(int)2, alignment=(string)frame
0:00:14.865580106 32470 0xb643bf50 DEBUG               playbin2 gstplaybin2.c:3271:autoplug_select_cb:<playbin20> checking factory pulsesink
0:00:14.865655838 32470 0xb643bf50 DEBUG               playbin2 gstplaybin2.c:3344:autoplug_select_cb:<playbin20> we found a sink
0:00:14.865725210 32470 0xb643bf50 DEBUG               playbin2 gstplaybin2.c:3350:autoplug_select_cb:<playbin20> we found an audio sink
0:00:14.865796342 32470 0xb643bf50 DEBUG               playbin2 gstplaybin2.c:3393:autoplug_select_cb:<playbin20> we have no pending sink, try to create one
0:00:14.871464068 32470 0xb643bf50 DEBUG               playbin2 gstplaybin2.c:3268:autoplug_select_cb:<playbin20> select group 0x9711318 for '':decodepad9, audio/x-ac3, framed=(boolean)true, rate=(int)48000, channels=(int)2, alignment=(string)frame
0:00:14.871598227 32470 0xb643bf50 DEBUG               playbin2 gstplaybin2.c:3271:autoplug_select_cb:<playbin20> checking factory a52dec

Dustin

2 ответа2

1

Вы можете использовать GStreamer, но, похоже, существует постоянная проблема с получением данных MPEGTS с готовностью декодированного видео для рендеринга. Я полагаю, что стандартные плагины MPEGTS подавляют искаженные кадры, как и VLC.

Итак, если вы просто хотите перенести необработанные данные MPEGTS из RTP в mplayer, все будет работать нормально (mplayer великолепно декодирует поток MPEGTS, содержащий ошибку):

gst-launch udpsrc port=5011 caps="application/x-rtp, media=video, payload=33, clock-rate=90000" ! fdsink | mplayer -

Значение для возможности "полезной нагрузки" берется из «Аудио / видео профиля RTP» для потоков MPEG2 в оболочке MPEGTS в RFC 3551. VLC, вероятно, пытается декодировать под несколько из этих кодов, чтобы без особых усилий принимать некоторые RTP-потоки, такие как от HDHomeRun, и, таким образом, избежать требования раздражающего файла SDP.

С другой стороны, если вы не возражаете против использования инструментов HDHomeRun для получения данных MPEGTS, то GStreamer будет просматривать их отлично.

Простая версия:

hdhomerun_config FFFFFFFF save /tuner0/ - | gst-launch-1.0 fdsrc ! decodebin ! autovideosink

Конкретная версия (фильтрация шапки используется, чтобы прояснить, какие данные перемещаются):

hdhomerun_config FFFFFFFF save /tuner0/ - | gst-launch-1.0 fdsrc ! video/mpegts ! tsdemux ! video/mpeg ! queue ! mpegvideoparse ! mpeg2dec ! xvimagesink

Очевидно, что примеры не касаются аудиопотоков (видео всегда имеет более высокий приоритет и является источником наибольшей ошибки / риска, по крайней мере для меня).

Ребята из Fluendo говорят мне, что их плагины GStreamer должны учитывать ошибки. Мне еще предстоит это проверить. Их плагин также работает только внутри GStreamer .10.

РЕДАКТИРОВАТЬ

Это командная строка для "просмотра" канала HDHomeRun. Обратите внимание, что номер порта и номер программы должны быть установлены для того, что вы смотрите, и должна быть установлена библиотека AC3 "A52" вместе с соответствующим "плохим" плагином "a52dec":

gst-launch-0.10 udpsrc port=5011 caps="application/x-rtp, media=video, encoding-name=H264, clock-rate=90000" ! \
    gstrtpbin ! rtpmp2tdepay ! tsdemux program-number=12 name=demux \
        demux. ! queue ! ac3parse ! a52dec ! queue ! audioconvert ! audioresample ! volume ! autoaudiosink \
        demux. ! queue ! mpegvideoparse ! mpeg2dec ! xvimagesink

Обратите внимание, что вы можете получить действительно информативную блок-схему, используя переменную среды GST_DEBUG_DUMP_DOT_DIR в сочетании с playbin (если у вас есть все необходимые плагины).

1

Поработав с этим в течение нескольких дней, я смог заставить это работать на моей плате Jetson TK1 linux. Вам не нужно использовать hdhomerun_config или открыть поток rtp / udp. С HDHR вы можете просто получить поток через http (если вы используете HDHR PRIME).

Ниже приведено следующее, что мне нужно, чтобы записать канал в файл для POC. Наиболее важной частью является "video/x-raw, format = I420", иначе вы получите ошибку. omxh264enc очень требователен к размеру кадра, а с I420 вы можете использовать любой размер.

# 10.10.10.100 is the IP of the HDHR
# v588 is the example virtual channel to grab on the HDHR
# Audio is encoded to aac @ 192k

sudo gst-launch-1.0 souphttpsrc location="http://10.10.10.100:5004/auto/v588" is-live=true ! decodebin name=demux demux. ! queue ! audioresample ! audioconvert dithering=0 ! "audio/x-raw,channels=2" ! voaacenc bitrate=192000 ! mux. matroskamux name=mux streamable=true ! filesink location=output.mkv demux. ! queue ! videoconvert ! video/x-raw,format=I420 ! omxh264enc ! video/x-h264,stream-format=byte-stream,profile=high ! h264parse ! mux.

Теперь я хотел бы использовать flvmux + rtmpsink, но я не уверен, как построить трубу.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .