decoder.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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. }
  12. }
  13. };
  14. self.importScripts("ffmpeghelper.js");
  15. self.importScripts("workerFakeDom.js");
  16. self.importScripts("jquery-1.11.0.min.js");
  17. self.addEventListener('message', function (e) {
  18. h264Queue.push(e.data);
  19. $('.leftmains').hide()
  20. $('.bottommains').hide()
  21. $('#btnMuted').hide()
  22. }, false);
  23. function PrintfLog(str) {
  24. var curTime = new Date().getTime();
  25. var objData = {
  26. cmd: 0,
  27. data: str,
  28. time: curTime
  29. };
  30. self.postMessage(objData);
  31. }
  32. function decodeAAC(data) {
  33. var retPtr = Module._malloc(4 * 5 * 1024); //接收的数据
  34. var inputPtr = Module._malloc(4 * data.length); //输入数据
  35. for (var i = 0; i < data.length; i++) {
  36. Module.HEAPU8[(inputPtr) + i] = data[i]; //转换为堆数据
  37. }
  38. var pcmLen = Module._feedData(retPtr, inputPtr, data.length);
  39. if (pcmLen > 0) {
  40. var pcmData = new Uint8Array(pcmLen);
  41. for (i = 0; i < pcmLen; i++) {
  42. pcmData[i] = Module.HEAPU8[(retPtr) + i]
  43. }
  44. player.feed(pcmData);
  45. }
  46. decodeCount++;
  47. Module._free(inputPtr);
  48. Module._free(retPtr);
  49. }
  50. setInterval(
  51. function () {
  52. if (h264Queue.length > 0 && isFinish) {
  53. if (isFirst) {
  54. PrintfLog("当前队列大小 :" + h264Queue.length);
  55. isFirst = false;
  56. }
  57. if (h264Queue.length > 10 && isFinish) {
  58. PrintfLog("解不过来 " + h264Queue.length);
  59. return;
  60. }
  61. decodeH264(h264Queue.shift());
  62. } else {
  63. }
  64. }, 1);
  65. function decodeH264(data) {
  66. var retPtr = Module._malloc(2457600); //接收的数据
  67. var inputPtr = Module._malloc(data.length); //输入数据
  68. for (var i = 0; i < data.length; i++) {
  69. Module.HEAPU8[(inputPtr) + i] = data[i]; //转换为堆数据
  70. }
  71. var time = new Date().getTime();
  72. var ret = Module._feedData(inputPtr, data.length, retPtr);
  73. if (ret >= 0) {
  74. if (decodeCount > 50) {
  75. var curCost = new Date().getTime() - time;
  76. PrintfLog("解码耗时 " + curCost + " ms");
  77. decodeCount = 0;
  78. }
  79. decodeCount++;
  80. }
  81. var yuvData = new Uint8Array(2457600);
  82. for (i = 0; i < yuvData.length; i++) {
  83. yuvData[i] = Module.HEAPU8[(retPtr) + i];
  84. }
  85. var curTime = new Date().getTime();
  86. var objData = {
  87. cmd: 1,
  88. data: yuvData,
  89. time: curTime
  90. };
  91. self.postMessage(objData);
  92. Module._free(inputPtr);
  93. Module._free(retPtr);
  94. }
  95. function closeDecoder() {
  96. Module._destroyDecoder();
  97. }