123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- 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);
- }
|