저는 현재 화상 통화에서 IP- 웹캠에서 SIP 사용자에게 RTP-Stream을 전달 (나중에 트랜스 코딩)하는 프로젝트를 진행하고 있습니다.
다음과 같은 gstreamer 파이프 라인을 생각해 냈습니다.
gst-launch -v rtspsrc location="rtsp://user:[email protected]:554/axis-media/media.amp?videocodec=h264" ! rtph264depay ! rtph264pay ! udpsink sync=false host=xxx.xxx.xx.xx port=xxxx
아주 잘 작동합니다. 이제 Java를 사용하여이 파이프 라인을 만들고 싶습니다. 다음은 파이프를 만드는 코드입니다.
Pipeline pipe = new Pipeline("IPCamStream");
// Source
Element source = ElementFactory.make("rtspsrc", "source");
source.set("location", ipcam);
//Elements
Element rtpdepay = ElementFactory.make("rtph264depay", "rtpdepay");
Element rtppay = ElementFactory.make("rtph264pay", "rtppay");
//Sink
Element udpsink = ElementFactory.make("udpsink", "udpsink");
udpsink.set("sync", "false");
udpsink.set("host", sinkurl);
udpsink.set("port", sinkport);
//Connect
pipe.addMany(source, rtpdepay, rtppay, udpsink);
Element.linkMany(source, rtpdepay, rtppay, udpsink);
return pipe;
파이프 라인을 시작 / 설정할 때 wireshark를 사용하여 카메라의 입력을 볼 수 있지만 안타깝게도 UDP-Sink 로의 전송이 없습니다. 코드에서 실수를 몇 번 확인했으며 파일 (filesrc)에서 동일한 udpsink로 스트리밍하기위한 파이프 라인도 설정했으며 제대로 작동합니다.
그러나 UDP-Sink로 IP-Cam의 "전달"이이 Java-Pipeline에서 작동하지 않는 이유는 무엇입니까?
Java 버전의 GStreamer를 사용하지는 않았지만 링크 할 때 알아야 할 사항은 때때로 요소의 소스 패드를 즉시 사용할 수 없다는 것입니다.
gst-inspect rtspsrc 를 수행 하고 패드를 살펴보면 다음과 같이 표시됩니다.
Pad Templates:
SRC template: 'stream_%u'
Availability: Sometimes
Capabilities:
application/x-rtp
application/x-rdt
"가용성 : 가끔"은 초기 링크가 실패한다는 것을 의미합니다. 원하는 소스 패드는 몇 개의 RTP 패킷이 도착한 후에 만 나타납니다.
이 경우 패드가 추가 된 이벤트 를 기다리면서 수동으로 요소를 연결해야 하거나 C에서 원하는 작업은 gst_parse_bin_from_description 함수를 사용하는 것 입니다. Java에도 비슷한 것이있을 것입니다. 패드가 추가 된 이벤트에 대한 리스너를 자동으로 추가하고 파이프 라인을 연결합니다.
gst-launch는 이러한 동일한 parse_bin 함수를 사용한다고 생각합니다. 그것이 항상 일을 잘 연결하는 이유입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다