decoder.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. var isFinish = false;
  2. var decodeCount = 0;
  3. var h264Queue = [];
  4. var isFirst = true;
  5. var parameters = GetRequest();
  6. var deviceBoard = parameters['deviceBoard'];
  7. var videoWidth = deviceBoard.substring(0, 2) === 'MTK' ? 1080 : 720
  8. var videoHeight = deviceBoard.substring(0, 2) === 'MTK' ? 1920 : 1280
  9. var ret = ''
  10. self.Module = {
  11. onRuntimeInitialized: function () {
  12. ret = Module._openDecoder(videoWidth, videoHeight);
  13. if (!ret) {
  14. isFinish = true;
  15. }
  16. }
  17. };
  18. self.importScripts("ffmpeghelper.js");
  19. self.addEventListener('message', function (e) {
  20. h264Queue.push(e.data);
  21. }, false);
  22. function PrintfLog(str) {
  23. var curTime = new Date().getTime();
  24. var objData = {
  25. cmd: 0,
  26. data: str,
  27. time: curTime
  28. };
  29. self.postMessage(objData);
  30. }
  31. setInterval(
  32. function () {
  33. if (h264Queue.length > 0 && isFinish) {
  34. if (isFirst) {
  35. PrintfLog("当前队列大小 :" + h264Queue.length);
  36. isFirst = false;
  37. }
  38. if (h264Queue.length > 10 && isFinish) {
  39. PrintfLog("解不过来 " + h264Queue.length);
  40. return;
  41. }
  42. decodeH264(h264Queue.shift());
  43. }
  44. }, 1);
  45. function decodeH264(data) {
  46. var size = videoWidth * videoHeight *3;
  47. var retPtr = Module._malloc(size); //接收的数据
  48. var inputPtr = Module._malloc(data.length); //输入数据
  49. for (var i = 0; i < data.length; i++) {
  50. Module.HEAPU8[(inputPtr) + i] = data[i]; //转换为堆数据
  51. }
  52. var time = new Date().getTime();
  53. var ret = Module._feedData(inputPtr, data.length, retPtr);
  54. if (ret >= 0) {
  55. if (decodeCount > 50) {
  56. var curCost = new Date().getTime() - time;
  57. PrintfLog("解码耗时 " + curCost + " ms");
  58. decodeCount = 0;
  59. }
  60. decodeCount++;
  61. }
  62. var yuvData = new Uint8Array(size);
  63. for (var i = 0; i < yuvData.length; i++) {
  64. yuvData[i] = Module.HEAPU8[(retPtr) + i];
  65. }
  66. var curTime = new Date().getTime();
  67. var objData = {
  68. cmd: 1,
  69. data: yuvData,
  70. time: curTime
  71. };
  72. self.postMessage(objData);
  73. Module._free(inputPtr);
  74. Module._free(retPtr);
  75. }
  76. function closeDecoder() {
  77. Module._destroyDecoder();
  78. }
  79. // 获取url中"?"符后的字串
  80. function GetRequest() {
  81. var url = location.search;
  82. var obj = new Object();
  83. if (url.indexOf("?") != -1) {
  84. var str = url.substr(1);
  85. strs = str.split("&");
  86. for (var i = 0; i < strs.length; i++) {
  87. obj[strs[i].split("=")[0]] = (strs[i].split("=")[1]);
  88. }
  89. }
  90. return obj;
  91. }