var isFinish = false; var decodeCount = 0; var h264Queue = []; var isFirst = true; var ret = '' self.Module = { onRuntimeInitialized: function () { ret = Module._openDecoder(720, 1280); if (!ret) { isFinish = true; } } }; self.importScripts("ffmpeghelper.js"); self.addEventListener('message', function (e) { h264Queue.push(e.data); }, false); function PrintfLog(str) { var curTime = new Date().getTime(); var objData = { cmd: 0, data: str, time: curTime }; self.postMessage(objData); } setInterval( function () { if (h264Queue.length > 0 && isFinish) { if (isFirst) { PrintfLog("当前队列大小 :" + h264Queue.length); isFirst = false; } if (h264Queue.length > 10 && isFinish) { PrintfLog("解不过来 " + h264Queue.length); return; } decodeH264(h264Queue.shift()); } }, 1); function decodeH264(data) { var retPtr = Module._malloc(2457600); //接收的数据 var inputPtr = Module._malloc(data.length); //输入数据 for (var i = 0; i < data.length; i++) { Module.HEAPU8[(inputPtr) + i] = data[i]; //转换为堆数据 } var time = new Date().getTime(); var ret = Module._feedData(inputPtr, data.length, retPtr); if (ret >= 0) { if (decodeCount > 50) { var curCost = new Date().getTime() - time; PrintfLog("解码耗时 " + curCost + " ms"); decodeCount = 0; } decodeCount++; } var yuvData = new Uint8Array(2457600); for (var i = 0; i < yuvData.length; i++) { yuvData[i] = Module.HEAPU8[(retPtr) + i]; } var curTime = new Date().getTime(); var objData = { cmd: 1, data: yuvData, time: curTime }; self.postMessage(objData); Module._free(inputPtr); Module._free(retPtr); } function closeDecoder() { Module._destroyDecoder(); }