decoder.js 2.9 KB

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