【发布时间】:2020-08-11 01:37:42
【问题描述】:
我正在尝试从 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>
我在这里以 Blob 形式接收 MediaRecorder 块,并尝试使用 MediaSource API 顺序播放它们。没有错误,也没有任何反应。这里有什么根本错误吗?
我试过了:
- 使用不同的编解码器
- 使用媒体源模式播放,例如序列/片段
- 我还尝试了不同的方法,您不使用 MediaSource API 但面临其他挑战,而 MediaSource 似乎是我的最佳方法。
更新:这就是视频的制作方式:
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)
}
}
【问题讨论】:
-
视频是如何制作的。什么编解码器/容器? chrome 媒体内部人员怎么说?
-
@szatmary 我已经更新了帖子。请看一下
-
@Andrei 按照 szatmary 的建议转到
chrome://media-internals以获取更多信息。此外,您的源只有一个视频流,但您在接收端指定了视频和音频编解码器。您也不应该假设您从 MediaRecorder 返回的编解码器将是您请求的编解码器。在 blob 上使用生成的mimeType。
标签: javascript html websocket http-live-streaming media-source