UDP를 통해 MPEG-TS를 스트리밍하는 방법은 무엇입니까?

UDP를 통해 MPEG-TS를 스트리밍하는 방법은 무엇입니까?

UdpSink를 모방하는 사용자 정의 AppSink를 통해 스트리밍하기 위해 gstreamer를 사용하고 있습니다. 우리는 일부 메타데이터에 대해 다른 포트에서 수신 대기를 통합할 수 있도록 이 방식을 사용하고 있습니다. 또한 재고 UdpSink가 손상되었습니다. 어쨌든 비디오 스트리밍에는 성공했지만 UDP 패킷이 올바르게 패키징되지 않은 것 같습니다. 내가 어떤 단계를 놓쳤는지 궁금합니다.

내 전송 파이프라인은 다음과 같습니다.

filesrc (mpeg TS file) ! displayQueue ! streamTee ! tsdemux ! decoder ! videosink

streamTee ! sendQueue ! udpSink (our custom one)

수신 측:

UdpSrc (custom) ! queue ! mpegtsdemux ! queue ! (mpegdecode || h264decode) ! ... ! videosink

스트리밍이 작동합니다. 그러나 그것은 매우 취약한 것 같습니다. 때로는 그냥 멈추는 경우도 있습니다. 유물이 많이 있습니다.

그래서 VLC를 사용해 보았습니다. UDP 유니캐스트를 통해 스트리밍하도록 설정했습니다. 잘 작동합니다. VLC가 내 파이프라인과 다른 방식으로 비디오를 보내는 것을 발견했습니다. Wireshark를 사용하여 패킷을 분석했습니다.

사용된 프로토콜: VLC: IP:UDP:MP2T(및 패킷 및 PET기타 PMT모든 종류의 TS 관련 항목)

내 거:IP:UDP:Data

내가 사용하고 있는 파이프라인은 오류 수정 없이 UDP를 통해 원시 비디오를 보내는 것 같습니다. 내가 무엇을 놓치고 있나요? 사용된 비디오는 h264 또는 mpeg로 인코딩된 .mpg파일입니다.

사용자 정의 UdpSink 및 UdpSrc 요소를 프로그래밍하기 위해 gstreamer-java를 사용하고 있지만 재고 이후 테스트를 위해 콘솔에서 gstreamer를 사용할 수 없습니다.UdpSink 플러그인이 손상되었습니다.. Linux VM에서 간단한 파이프라인을 시도했고 VLC와 비슷한 패킷 묶음을 얻었습니다.

gst-launch-0.10 -v videotestsrc ! mpeg2enc ! mpegtsmux ! udpsink host=192.168.2.100 port=1234

답변1

이것은 단지 생각일 뿐입니다. 저는 gstreamer에 그다지 익숙하지 않아서 어떻게 작동하는지 모르지만 filesrcMPEG-TS를 이해하지 못하는 것으로 가정합니다. MPEG-TS에서는 패킷이 특정 경계(보통 188바이트)로 들어오도록 요구합니다. 나는 demux 뒤에 티를 넣은 다음 mpegtsmux를 udpSink.

나는 이것이 더 많은 작업을 수행할 것이라는 것을 알고 있으며 실제로 필요한 것입니다(다시 다중화하기 위한 demux). 그러나 패킷이 올바르게 정렬되도록 보장합니다. 작동하고 오버헤드를 제거해야 하는 경우 더 스마트한 파일 소스 구현을 검토해야 할 수도 있습니다.

답변2

당신은 가깝습니다. filesrc 플러그인은 읽고 있는 파일의 내용에 대해 아무것도 모릅니다. GStreamer는 데이터를 올바르게 스트리밍하기 위해 데이터가 전송 스트림이라는 것을 알아야 합니다. 스트림을 역다중화 및 다중화하는 동안 해당 작업을 수행하는 동안 더 좋은 방법이 있습니다.

Source: gst-launch -v filesrc location=myvideo.ts ! tsparse set-timestamps=true ! udpsink host=192.168.2.100 port=1234

Dest:   gst-launch udpsrc caps="video/mpegts, systemstream=(boolean)true, packetsize=(int)188" port=1234 ! tsdemux ! (video decoder) ! autovideosink

플러그인 tsparse는 스트림을 읽고 스트림에 대한 정보를 구문 분석합니다. 또한 출력을 전송 스트림으로 식별합니다. udpsink가 데이터가 188바이트 패킷에 있음을 알 수 있도록 허용하므로 그 자체로 스트리밍 요구 사항에 충분할 수 있습니다. 수신 측에서는 실제 비디오 스트림을 구문 분석하기 위해 tsdemux가 필요합니다. "set-timestamps" 요소는 tsparse에게 나가는 패킷에 타임스탬프를 설정하도록 지시하여 udpsink가 가능한 한 빠른 속도가 아닌 시간에 맞춰 각 프레임을 보낼 수 있도록 합니다.

udpsink가 보낼 데이터를 패킷화하는 rtpmp2tpay 및 rptmp2depay를 사용할 수도 있습니다. 또한 인코딩 이름을 MP2T로 설정합니다. 두 가지 방법을 모두 시도해 볼 수 있습니다.

Source: gst-launch -v filesrc location=myvideo.ts ! tsparse set-timestamps=true ! rtpmp2tpay ! udpsink host=192.168.2.100 port=1234

Dest:   gst-launch udpsrc caps="application/x-rtp, systemstream=(boolean)true, packetsize=(int)188" port=1234 ! rtpmp2tdepay ! tsdemux ! (video decoder) ! autovideosink

관련 정보