웹 브라우저에서 gstreamer의 스트림을 재생하고 싶습니다.
RTP, WebRTC 및 SDP 파일을 가지고 놀았지만 VLC는 간단한 SDP로 스트리밍에 연결할 수 있었지만 브라우저는 그렇지 않았습니다. 나중에 WebRTC에는 문제를 복잡하게 만들고 내 목적에 필요하지 않은 보안 연결이 필요하다는 것을 이해했습니다. html5의 MSE ( Media Source Extension)를 우연히 발견 했는데 도움이 될 것 같지만 gstreamer가 올바른 데이터를 스트리밍하도록하고 나중에 MSE를 사용하여 재생하는 방법에 대한 포괄적 인 자습서 나 적절한 사양을 찾을 수 없습니다. . MSE를 사용할 때 대기 시간도 확실하지 않습니다.
그렇다면 브라우저에서 gstreamer의 스트림을 재생하는 방법이 있습니까? 감사.
node webrtc project를 사용하여 gstreamer의 출력을 webrtc 호출과 결합 할 수있었습니다. gstreamer의 경우 gstreamer superficial 노드와 함께 사용할 수있는 프로젝트가 있습니다 . 따라서 기본적으로 노드 프로세스에서 gstremaer 프로세스를 실행해야합니다. 그러면 gstremaer의 출력을 제어 할 수 있습니다. 모든 gstreamer 프레임에는 프레임을 가져와 webrtc 호출로 보낼 수있는 콜백이 있습니다.
그런 다음 webrtc 호출을 구현해야합니다. 통화를 위해 몇 가지 신호 프로토콜이 필요합니다. 호출의 한쪽은 서버가되고 다른 쪽은 두 개의 브라우저가 아닌 클라이언트의 브라우저가됩니다. 그런 다음 gstreamer superficial의 프레임이 푸시되는 비디오 트랙이 생성됩니다.
const { RTCVideoSource } = require("wrtc").nonstandard;
const gstreamer = require("gstreamer-superficial");
const source = new RTCVideoSource();
// This is WebRTC video track which should be used with addTransceiver see below
const track = source.createTrack();
const frame = {
width: 1920,
height: 1080,
data: null
};
const pipeline = new gstreamer.Pipeline("v4l2src ! videorate ! video/x-raw,format=YUY2,width=1920,height=1080,framerate=25/1 ! videoconvert ! video/x-raw,format=I420 ! appsink name=sink");
const appsink = pipeline.findChild("sink");
const pull = function() {
appsink.pull(function(buf, caps) {
if (buf) {
frame.data = new Uint8Array(buf);
try {
source.onFrame(frame);
} catch (e) {}
pull();
} else if (!caps) {
console.log("PULL DROPPED");
setTimeout(pull, 500);
}
});
};
pipeline.play();
pull();
// Example:
const useTrack = SomeRTCPeerConnection => SomeRTCPeerConnection.addTransceiver(track, { direction: "sendonly" });
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다