decoder.js 2.5 KB

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