Я обслуживаю этот фрагментированный файл mp4 , созданный ffmpeg.
Вот код на стороне клиента:
<!DOCTYPE html>
<html>
<head>
<title>WebSocket and MSE demo</title>
</head>
<body>
<video id="livestream" width="640" height="480" autoplay />
</body>
<script>
//var verbose = false;
var verbose = true;
// set mimetype and codec
var mimeType = "video/mp4";
var codecPars = mimeType;
var streamingStarted = false; // is the sourceBuffer updateend callback active nor not
// create media source instance
var ms = new MediaSource();
// queue for incoming media packets
var queue = [];
var ws; // websocket
// ** two callbacks **
// - pushPacket : called when websocket receives data
// - loadPacket : called when sourceBuffer is ready for more data
// Both operate on a common fifo
function pushPacket(arr) { // receives ArrayBuffer. Called when websocket gets more data
// first packet ever to arrive: write directly to sourceBuffer
// sourceBuffer ready to accept: write directly to SourceBuffer
// otherwise insert to fifo
var view = new Uint8Array(arr);
if (verbose) { console.log("got", arr.byteLength, "bytes. Values=", view[0], view[1], view[2], view[3], view[4]); }
data = arr;
if (!streamingStarted && !sourceBuffer.updating) {
if (verbose) console.log("Streaming started with", view[0], view[1], view[2], view[3], view[4]);
sourceBuffer.appendBuffer(data);
streamingStarted=true;
return;
}
queue.push(data); // add to the end
if (verbose) { console.log("queue push:", queue.length); }
}
function loadPacket() { // called when sourceBuffer is ready for more
if (!sourceBuffer.updating) { // really, really ready
if (queue.length>0) {
inp = queue.shift(); // pop from the beginning
if (verbose) { console.log("queue PULL:", queue.length); }
var view = new Uint8Array(inp);
if (verbose) { console.log(" writing buffer with", view[0], view[1], view[2], view[3], view[4]); }
sourceBuffer.appendBuffer(inp);
}
else { // the queue runs empty, so we must force-feed the next packet
streamingStarted = false;
}
}
else { // so it was not?
}
}
function opened() { // now the MediaSource object is ready to go
sourceBuffer = ms.addSourceBuffer(codecPars);
sourceBuffer.addEventListener("updateend",loadPacket);
// set up the websocket
ws = new WebSocket("ws://videoserver");
ws.binaryType = "arraybuffer";
ws.onmessage = function (event) {
pushPacket(event.data);
};
}
function startup() {
// add event listeners
ms.addEventListener('sourceopen',opened,false);
// get reference to video
var livestream = document.getElementById('livestream');
// set mediasource as source of video
livestream.src = window.URL.createObjectURL(ms);
}
window.onload = function() {
startup();
}
</script>
</html>
Видеофайл является сервером поверх websocket.
Решение работает в (не ниже Windows 10):
- Chrome browser Версия 80.0.3987.116 (Официальная сборка) (64-разрядная) )
- Microsoft Edge 44.18362.449.0
- Inte rnet Explorer 11.657.18362.0
- Opera 66.0.3515.103
Однако не работает в:
- Firefox 73.0.1 (64-разрядная версия) ( под Windows 10)
- Firefox 73.0 (64-бит) под Ubuntu 18.04
Видео не воспроизводится в браузере Firefox и браузер утверждает Media resource blob:http://abcdef could not be decoded.
.
Как мне отладить Firefox, чтобы увидеть, в чем проблема?