decoder.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. var isFinish = false;
  2. var decodeCount = 0;
  3. var h264Queue = [];
  4. var isFirst = true;
  5. self.Module =
  6. {
  7. onRuntimeInitialized: function ()
  8. {
  9. isFinish = true;
  10. var ret = Module._openDecoder(720, 1280);
  11. if(!ret)
  12. {
  13. console.log("打开编码器成功");
  14. }
  15. }
  16. };
  17. self.importScripts("ffmpeghelper.js");
  18. self.addEventListener('message', function (e)
  19. {
  20. h264Queue.push(e.data);
  21. }, false);
  22. function PrintfLog(str)
  23. {
  24. var curTime = new Date().getTime();
  25. var objData = {cmd:0, data:str, time:curTime};
  26. self.postMessage(objData);
  27. }
  28. function decodeAAC(data)
  29. {
  30. var retPtr = Module._malloc(4 * 5 * 1024);//接收的数据
  31. var inputPtr = Module._malloc(4 * data.length);//输入数据
  32. for( i =0;i < data.length;i++)
  33. {
  34. Module.HEAPU8[(inputPtr)+i] = data[i];//转换为堆数据
  35. }
  36. var pcmLen = Module._feedData(retPtr, inputPtr, data.length);
  37. if(pcmLen > 0)
  38. {
  39. var pcmData = new Uint8Array(pcmLen);
  40. for(i = 0;i < pcmLen;i++)
  41. {
  42. pcmData[i] = Module.HEAPU8[(retPtr)+i]
  43. }
  44. player.feed(pcmData);
  45. }
  46. else
  47. {
  48. console.log("%d帧 aac 解码失败, %d", decodeCount, pcmLen);
  49. }
  50. decodeCount++;
  51. Module._free(inputPtr);
  52. Module._free(retPtr);
  53. }
  54. setInterval(
  55. function()
  56. {
  57. if(h264Queue.length > 0 && isFinish)
  58. {
  59. if(isFirst)
  60. {
  61. PrintfLog("当前队列大小 :" + h264Queue.length);
  62. isFirst = false;
  63. }
  64. if(h264Queue.length > 10 && isFinish)
  65. {
  66. PrintfLog("解不过来 " + h264Queue.length);
  67. //h264Queue.length = 0;
  68. return;
  69. }
  70. decodeH264(h264Queue.shift());
  71. }
  72. else
  73. {
  74. }
  75. }
  76. ,1);
  77. function decodeH264(data)
  78. {
  79. var retPtr = Module._malloc(2457600);//接收的数据
  80. var inputPtr = Module._malloc(data.length);//输入数据
  81. for( i =0;i < data.length;i++)
  82. {
  83. Module.HEAPU8[(inputPtr)+i] = data[i];//转换为堆数据
  84. }
  85. var time = new Date().getTime();
  86. var ret = Module._feedData(inputPtr, data.length, retPtr);
  87. if(ret >= 0)
  88. {
  89. //console.log("解码成功 %d, 耗时 %d ms", ret, new Date().getTime() - time);
  90. if(decodeCount > 50)
  91. {
  92. var curCost = new Date().getTime() - time;
  93. PrintfLog("解码耗时 " + curCost + " ms");
  94. decodeCount = 0;
  95. }
  96. decodeCount++;
  97. //console.log("解码耗时 %d ms", curCost);
  98. }
  99. else
  100. {
  101. //console.log("解码失败 %d", ret);
  102. }
  103. var yuvData = new Uint8Array(2457600);
  104. for(i = 0;i < yuvData.length;i++)
  105. {
  106. yuvData[i] = Module.HEAPU8[(retPtr)+i];
  107. }
  108. var curTime = new Date().getTime();
  109. var objData = {cmd:1, data:yuvData, time:curTime};
  110. self.postMessage(objData);
  111. //webglPlayer.renderFrame(yuvData, 720, 1280, 720*1280, (720/2)*(1280/2));
  112. Module._free(inputPtr);
  113. Module._free(retPtr);
  114. }
  115. function closeDecoder()
  116. {
  117. Module._destroyDecoder();
  118. }