var isFinish = false; var decodeCount = 0; var h264Queue = []; var ret; self.Module = { onRuntimeInitialized: function() { isFinish = true; ret = Module._openDecoder(720, 1280); if (!ret) { console.log("打开编码器成功"); } } }; self.importScripts("ffmpeghelper.js"); self.addEventListener('message', function(e) { var buffer = e.data; if(buffer[0] == 0xff)//音频解码 { if(isFinish) { decodeAAC(buffer); } } else { h264Queue.push(buffer); } }, 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(2048);//接收的数据 var inputPtr = Module._malloc(data.length);//输入数据 for( i = 0;i < data.length;i++) { Module.HEAPU8[(inputPtr)+i] = data[i];//转换为堆数据 } var pcmLen = Module._feedAudio(inputPtr, data.length, retPtr); if(pcmLen > 0) { var pcmData = new Uint8Array(pcmLen); for(i = 0;i < pcmLen;i++) { pcmData[i] = Module.HEAPU8[(retPtr)+i]; } var curTime = new Date().getTime(); var objData = {cmd:2, data:pcmData, time:curTime}; self.postMessage(objData); } else { console.log("aac 解码失败, %d", pcmLen); } Module._free(inputPtr); Module._free(retPtr); } var timeFlag = setInterval( function() { if (h264Queue.length > 0 && isFinish) { if (h264Queue.length > 15 && isFinish) { PrintfLog("-------解不过来 ---------" + h264Queue.length); h264Queue.length = 0; return; } decodeH264(h264Queue.shift()); } else { } }, 1); function decodeH264(data) { var nalType = data[4] & 0x1f; if(nalType == 7) { console.log("decode sps"); } if(nalType == 8) { console.log("decode pps"); } if(nalType == 5) { console.log("decode i"); } var yuvData = new Uint8Array(2457600); var retPtr = Module._malloc(2457600); //接收的数据 if(retPtr == undefined) { 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); } 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); Module._free(inputPtr); Module._free(retPtr); } function closeDecoder() { Module._destroyDecoder(); clearInterval(timeFlag); }