decoder.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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.addEventListener('message', function (e) {
  16. h264Queue.push(e.data);
  17. }, false);
  18. function PrintfLog(str) {
  19. var curTime = new Date().getTime();
  20. var objData = {
  21. cmd: 0,
  22. data: str,
  23. time: curTime
  24. };
  25. self.postMessage(objData);
  26. }
  27. setInterval(
  28. function () {
  29. if (h264Queue.length > 0 && isFinish) {
  30. if (isFirst) {
  31. PrintfLog("当前队列大小 :" + h264Queue.length);
  32. isFirst = false;
  33. }
  34. if (h264Queue.length > 10 && isFinish) {
  35. PrintfLog("解不过来 " + h264Queue.length);
  36. return;
  37. }
  38. decodeH264(h264Queue.shift());
  39. }
  40. }, 1);
  41. function decodeH264(data) {
  42. var retPtr = Module._malloc(2457600); //接收的数据
  43. var inputPtr = Module._malloc(data.length); //输入数据
  44. for (var i = 0; i < data.length; i++) {
  45. Module.HEAPU8[(inputPtr) + i] = data[i]; //转换为堆数据
  46. }
  47. var time = new Date().getTime();
  48. var ret = Module._feedData(inputPtr, data.length, retPtr);
  49. if (ret >= 0) {
  50. if (decodeCount > 50) {
  51. var curCost = new Date().getTime() - time;
  52. PrintfLog("解码耗时 " + curCost + " ms");
  53. decodeCount = 0;
  54. }
  55. decodeCount++;
  56. }
  57. var yuvData = new Uint8Array(2457600);
  58. for (var i = 0; i < yuvData.length; i++) {
  59. yuvData[i] = Module.HEAPU8[(retPtr) + i];
  60. }
  61. var curTime = new Date().getTime();
  62. var objData = {
  63. cmd: 1,
  64. data: yuvData,
  65. time: curTime
  66. };
  67. self.postMessage(objData);
  68. Module._free(inputPtr);
  69. Module._free(retPtr);
  70. }
  71. function closeDecoder() {
  72. Module._destroyDecoder();
  73. }