H265.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. importScripts('./jsFFMPEG.js');
  2. let initDecoder = null;
  3. let decoderContext = null;
  4. let decodeByFFMPEG = null;
  5. let getWidth = null;
  6. let getHeight = null;
  7. let closeContext = null;
  8. let context = null;
  9. let outpic = null;
  10. let outpicptr = null;
  11. let ID = 265;
  12. let initialized = false;
  13. let firstIFrame = true;
  14. class H265Decoder {
  15. constructor() {
  16. initDecoder = Module.cwrap('init_jsFFmpeg', 'void', []);
  17. decoderContext = Module.cwrap('context_jsFFmpeg', 'number', ['number']);
  18. decodeByFFMPEG = Module.cwrap('decode_video_jsFFmpeg', 'number', ['number', 'array', 'number', 'number']);
  19. getWidth = Module.cwrap('get_width', 'number', ['number']);
  20. getHeight = Module.cwrap('get_height', 'number', ['number']);
  21. closeContext = Module.cwrap('close_jsFFmpeg', 'number', ['number']);
  22. initDecoder();
  23. this.init();
  24. initialized = true;
  25. }
  26. init() {
  27. console.log("H265 Decoder init");
  28. if (context !== null) {
  29. closeContext(context);
  30. context = null;
  31. }
  32. context = decoderContext(ID);
  33. }
  34. setOutputSize(size) {
  35. console.log("H265 Decoder setOutputSize");
  36. let outpicsize = size * 1.5;
  37. outpicptr = Module._malloc(outpicsize);
  38. outpic = new Uint8Array(Module.HEAPU8.buffer, outpicptr, outpicsize);
  39. }
  40. decode(data) {
  41. if(!initialized) {
  42. console.log('未初始化完成')
  43. return null;
  44. }
  45. let frameType = (data[4] == 0x40) ? 'I' : 'P';
  46. //console.log(data[4] & 0x1f)
  47. if(frameType === 'I' && initialized) {
  48. firstIFrame = true;
  49. }
  50. if(!firstIFrame) {
  51. console.log('非 firstIFrame')
  52. return null;
  53. }
  54. let beforeDecoding = Date.now();
  55. let decodingTime = null;
  56. let frameData = null;
  57. decodeByFFMPEG(context, data, data.length, outpic.byteOffset);
  58. decodingTime = Date.now() - beforeDecoding;
  59. let width = getWidth(context);
  60. let height = getHeight(context);
  61. //console.log(width, height)
  62. if (width > 0 && height > 0) {
  63. let copyOutput = new Uint8Array(outpic);
  64. frameData = {
  65. 'data': copyOutput,
  66. 'width': width,
  67. 'height': height,
  68. 'codecType': 'h264',
  69. 'decodingTime': decodingTime,
  70. 'frameType': frameType,
  71. };
  72. return frameData;
  73. }
  74. }
  75. }