123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- 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();
- }
|