Bộ điều chỉnh TV HDHomeRun với GStreamer


0

Tôi đã cố đọc nguồn cấp dữ liệu RTP từ bộ điều chỉnh HDHR của mình nhưng không thành công. Có ai có kinh nghiệm với điều này?

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
  • Tôi đã có được các khả năng thông qua tự động phát hiện bằng cách nào đó, tại một số điểm.

HDHR:

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

Khi tôi cố gửi qua RTP (rtp: //192.168.5.102: 5000, thay vì sử dụng UDP, như trên), tôi luôn gặp lỗi UDP, bất kể khả năng là gì, bất cứ khi nào nó chìm xuống gstrtpbin:

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

Tôi cho rằng điều này có nghĩa là các khả năng không khớp giữa các miếng đệm được liên kết.

Khi tôi sử dụng lược đồ UDP (ban đầu, ở trên), tôi không gặp bất kỳ lỗi nào, nhưng không có dữ liệu nào di chuyển qua đường ống.

--gst-debug trên các yếu tố khác nhau ở các cấp độ khác nhau đã không cho tôi bất cứ điều gì hữu ích.

VLC hoạt động hoàn hảo, cho dù tôi đang gửi tới rtp: //xxx.xxx.xxx.xxx: nnnn và nhận trên rtp: //: nnnn hoặc gửi tới udp: //xxx.xxx.xxx.xxx: nnnn và nhận trên udp: //: nnnn.

Có suy nghĩ gì không?

Ngoài ra, GST không thể tự động xác định khả năng của luồng RTP? Tôi không biết làm thế nào tôi vấp phải nó (để có được các khả năng ở trên), nhưng nó không có vẻ rất trực quan. Có vẻ như nếu VLC (siêu đa năng) có thể làm điều đó, GStreamer (cũng siêu linh hoạt) có thể làm điều đó.

Cảm ơn.

Bụi

Nhân tiện, tôi đã nhận được điều này bằng cách sử dụng 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

Bụi

Câu trả lời:


1

Bạn có thể sử dụng GStreamer, nhưng dường như có khó khăn nhất quán từ dữ liệu MPEGTS để video được giải mã sẵn sàng để kết xuất. Tôi tin rằng các plugin MPEGTS tiêu chuẩn bị sặc trên các khung không đúng định dạng, cũng như VLC.

Vì vậy, nếu bạn chỉ muốn đẩy dữ liệu MPEGTS thô từ RTP sang mplayer, nó sẽ hoạt động tốt (mplayer thật tuyệt vời khi giải mã luồng MPEGTS có lỗi):

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

Giá trị cho khả năng "tải trọng" đến từ "Hồ sơ âm thanh / video RTP" cho các luồng MPEG2 được bọc bởi MPEGTS trong RFC 3551. VLC có thể cố gắng giải mã theo một vài trong số các mã này để dễ dàng nhận được một số luồng RTP, chẳng hạn như từ HDHomeRun và do đó tránh được yêu cầu của tệp SDP gây phiền nhiễu.

Mặt khác, nếu bạn không ngại sử dụng các công cụ HDHomeRun để lấy dữ liệu MPEGTS, thì GStreamer sẽ xem nó một cách hoàn hảo.

Phiên bản dễ dàng:

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

Phiên bản cụ thể (lọc giới hạn được sử dụng để làm rõ dữ liệu nào đang di chuyển):

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

Rõ ràng, các ví dụ không liên quan đến các luồng âm thanh (video luôn là ưu tiên cao hơn và là nguồn gây ra lỗi / rủi ro lớn nhất, ít nhất là với tôi).

Các anh chàng Fluendo nói với tôi rằng các plugin GStreamer của họ sẽ bị lỗi. Tôi chưa thử nghiệm điều này. Plugin của họ cũng chỉ hoạt động bên trong GStreamer .10.

CHỈNH SỬA

Đây là dòng lệnh để "xem" nguồn cấp dữ liệu HDHomeRun. Lưu ý rằng số cổng và số chương trình sẽ cần được đặt cho bất cứ thứ gì bạn đang xem và thư viện AC3 "A52" phải được cài đặt cùng với plugin "a52dec" "xấu" tương ứng:

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

Lưu ý rằng bạn có thể nhận được một sơ đồ thông tin thực sự bằng cách sử dụng biến môi trường GST_DEBUG_DUMP_DOT_DIR kết hợp với playbin (nếu bạn có sẵn tất cả các plugin cần thiết).


Hóa ra GStreamer và VLC không bị nghẹt dữ liệu không đúng định dạng. Thay vào đó, tôi đã thử nghiệm với lập trình không dây, và rõ ràng, các gói PMT đang bị tước bởi "zap" hoặc không có mặt. mencoder / mplayer phải làm thêm để tìm ra những gì còn thiếu. Xem stackoverflow.com/questions/14607860/ cấp .
Dustin Oprea

Để chỉnh sửa nhận xét ở trên, zap có tham số "-p" sẽ khiến các gói PMT không được lọc. Do đó, MPEGTS sẽ hoàn toàn chính xác và có bố cục tốt. Tôi đang sử dụng "azap", và, không giống như ba anh chị em của nó, nó có sự trợ giúp "-h" rất kém. Thêm vào đó, tham số "-p" không được xác định trong trang chủ (ít nhất là trong phiên bản tôi có).
Dustin Oprea

1

Sau khi loay hoay với điều này trong vài ngày, tôi đã có thể làm việc này trên bo mạch linux Jetson TK1 của mình. Bạn không cần sử dụng hdhomerun_config hoặc mở luồng rtp / udp. Từ HDHR, bạn chỉ có thể lấy luồng qua http (nếu bạn đang sử dụng HDHR PRIME).

Dưới đây là những điều sau đây tôi cần để kết xuất một kênh vào một tệp cho POC. Phần quan trọng nhất là "video / x-raw, format = I420" hoặc bạn sẽ gặp lỗi. omxh264enc cực kỳ kén chọn kích thước khung hình và với I420 bạn có thể sử dụng bất kỳ kích thước nào.

# 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.

Bây giờ tôi muốn và sử dụng flvmux + rtmpsink, nhưng tôi không chắc cách xây dựng đường ống.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.