![](/img/trans.png)
[英]HTML5 Video, MediaSource, appendBuffer, How to skip some chunks
[英]HTML5 Video stream from websocket via MediaSource and MediaSourceBuffer
我正在嘗試從 websocket 播放視頻
<video id="output" width="320" height="240" autoplay></video>
<script>
function sockets(buffer) {
const socket = new WebSocket('wss://localhost:5002/ws')
socket.onmessage = async function (event) {
// event.data is a blob
buffer.appendBuffer(new Uint8Array(event.data))
}
}
let ms = new MediaSource()
let output = document.getElementById('output')
output.src = URL.createObjectURL(ms)
ms.onsourceopen = () => {
let buffer = ms.addSourceBuffer('video/webm; codecs="vorbis,vp8"')
sockets(buffer)
}
</script>
我在這里接收 MediaRecorder 塊作為 Blob,並嘗試使用 MediaSource API 順序播放它們。 沒有錯誤,也沒有任何反應。 這里有什么根本錯誤嗎?
我試過了:
更新:這是視頻的制作方式:
let options = { mimeType: 'video/webm;codecs=vp8' }
let stream = await navigator.mediaDevices.getUserMedia({ video: true })
mediaRecorder = new MediaRecorder(stream, options)
mediaRecorder.ondataavailable = event => {
if (event.data && event.data.size > 0) {
send(event.data)
}
}
這里的根本問題是您不能 stream 那些來自MediaRecorder
的數據並期望另一端播放它; 這不是一個完整的視頻。 只有在接收端能夠接收初始化字節時它才會起作用——我懷疑這在現實世界的場景中是否會起作用。
您可以做的是創建一個間隔,例如每 1 秒啟動/停止MediaRecorder
,以制作 1 秒的視頻塊,您可以通過網絡傳輸(我知道和測試的最好的是 websockets)
我強烈建議不要使用MediaRecorder
,因為您正在執行帖子中未指明的實時視頻流,但如果是,最好創建一個 canvas 來復制 stream 並做一些可以捕獲您的requestAnimationFrame
的東西視頻 stream 變成你可以傳輸的東西。
以我的經驗, MediaRecorder
響應延遲,這通常會在視頻中增加相當大的延遲,更不用說套接字也會引入的延遲。
通常,其他開發人員會建議您只走 WebRTC 路線,但根據我的經驗,WebRTC 通常也不會更快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.