var isFinish = false; var decodeCount = 0; var h264Queue = []; var isFirst = true; self.Module = { onRuntimeInitialized: function () { isFinish = true; var ret = Module._openDecoder(720, 1280); if(!ret) { console.log("打开编码器成功"); } } }; 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); } function decodeAAC(data) { var retPtr = Module._malloc(4 * 5 * 1024);//接收的数据 var inputPtr = Module._malloc(4 * data.length);//输入数据 for( i =0;i < data.length;i++) { Module.HEAPU8[(inputPtr)+i] = data[i];//转换为堆数据 } var pcmLen = Module._feedData(retPtr, inputPtr, data.length); if(pcmLen > 0) { var pcmData = new Uint8Array(pcmLen); for(i = 0;i < pcmLen;i++) { pcmData[i] = Module.HEAPU8[(retPtr)+i] } player.feed(pcmData); } else { console.log("%d帧 aac 解码失败, %d", decodeCount, pcmLen); } decodeCount++; Module._free(inputPtr); Module._free(retPtr); } setInterval( function() { if(h264Queue.length > 0 && isFinish) { if(isFirst) { PrintfLog("当前队列大小 :" + h264Queue.length); isFirst = false; } if(h264Queue.length > 10 && isFinish) { PrintfLog("解不过来 " + h264Queue.length); //h264Queue.length = 0; return; } decodeH264(h264Queue.shift()); } else { } } ,1); function decodeH264(data) { var retPtr = Module._malloc(2457600);//接收的数据 var inputPtr = Module._malloc(data.length);//输入数据 for( 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) { //console.log("解码成功 %d, 耗时 %d ms", ret, new Date().getTime() - time); if(decodeCount > 50) { var curCost = new Date().getTime() - time; PrintfLog("解码耗时 " + curCost + " ms"); decodeCount = 0; } decodeCount++; //console.log("解码耗时 %d ms", curCost); } else { //console.log("解码失败 %d", ret); } var yuvData = new Uint8Array(2457600); for(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); //webglPlayer.renderFrame(yuvData, 720, 1280, 720*1280, (720/2)*(1280/2)); Module._free(inputPtr); Module._free(retPtr); } function closeDecoder() { Module._destroyDecoder(); }