나는 30 FPS 비디오 스트림을 렌더링 한 다음 실시간으로 WebM Byte Stream으로 인코딩 및 멀티플렉싱하는 서버 응용 프로그램을 보유하고 있습니다.라이브 MediaSource 비디오 스트림을 동기화 상태로 유지하는 방법은 무엇입니까?
클라이언트 측에서 HTML5 페이지는 연결을 수락 할 때 스트림 생성을 시작하는 WebSocket을 서버에 엽니 다. 헤더가 전달 된 후에는 각각의 WebSocket 프레임이 하나의 WebM SimpleBlock으로 구성됩니다. 키 프레임은 매 15 프레임마다 발생하고 새로운 클러스터가 시작될 때 발생합니다.
또한 클라이언트는 MediaSource을 만들고 WS에서 프레임을 수신하면 내용을 활성 버퍼에 추가합니다. <video>
은 첫 번째 프레임이 추가 된 직후에 재생을 시작합니다.
모든 것이 적절하게 작동합니다. 나의 유일한 문제는 네트워크 지터로 인해 재생 위치가 잠시 후 실제 시간에서 벗어나게된다는 것입니다. 현재 해결 방법은 updateend
이벤트에 연결하고 수신 클러스터의 video.currentTime
과 시간 코드의 차이를 확인하고 허용 범위를 벗어날 경우 currentTime
을 수동으로 업데이트하십시오. 불행하게도, 이것은 눈에 띄는 일시 정지와 다소 불쾌한 재생에서의 점프를 야기합니다.
해결책도 조금 이상합니다. 최신 키 프레임의 위치를 정확히 알고 있지만 currentTime
에 전달하기 전에 전체 키 프레임을 전체 초 (W3C 사양에 따라)로 변환해야합니다. 브라우저는 아마도 그 다음에 가야하고 가장 가까운 키 프레임을 찾아야합니다.
내 질문은 : 미디어 요소에 항상 최신 키 프레임을 검색하도록 요청하거나 재생 시간을 시스템 시간과 동기화하도록 설정하는 방법이 있습니까?
솔루션을 찾았습니까? –
currentTime을 변경하는 솔루션이 최고라는 것을 깨달았습니다. 그 원인은 네트워크 결함으로 인해 버퍼가 증가하여 문제를 해결할 수있는 또 다른 결함이 정상적이기 때문입니다. 스트림 중에 연속적인 연결 문제가있는 경우 글리치가 발생합니다. –