videoWorker.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. importScripts(
  2. './H264SPSParser.js',
  3. './H264Session.js',
  4. './H265Session.js',
  5. './libffmpeg.js'
  6. );
  7. addEventListener('message', receiveMessage);
  8. let sdpInfo = null;
  9. let rtpSession = null;
  10. let videoCHID = -1;
  11. let videoRtpSessionsArray = [];
  12. function receiveMessage(event) {
  13. console.log("h265有数据->",event.data)
  14. var message = event.data;
  15. switch (message.type) {
  16. case 'sdpInfo':
  17. sdpInfo = message.data;
  18. initRTPSession(sdpInfo.sdpInfo);
  19. case 'rtpDataArray':
  20. //console.log(message.data.length)
  21. for (let num = 0; num < message.data.length; num++) {
  22. receiveMessage({
  23. 'type': 'rtpData',
  24. 'data': message.data[num],
  25. });
  26. }
  27. break;
  28. case 'rtpData':
  29. videoCHID = message.data.rtspInterleave[1];
  30. if (typeof videoRtpSessionsArray[videoCHID] !== "undefined") {
  31. videoRtpSessionsArray[videoCHID].remuxRTPData(message.data.rtspInterleave,
  32. message.data.header, message.data.payload);
  33. }else { // RTCP包
  34. //console.log('Interleave: ' + videoCHID);
  35. //console.log(message.data.rtspInterleave, message.data.header);
  36. //return;
  37. }
  38. break;
  39. }
  40. }
  41. function initRTPSession(sdpInfo) {
  42. for(let [i, len] = [0, sdpInfo.length]; i < len; i++) {
  43. if(sdpInfo[i].codecName === 'H264') {
  44. //console.log(sdpInfo)
  45. rtpSession = new H264Session();
  46. rtpSession.init();
  47. rtpSession.rtpSessionCallback = RtpReturnCallback;
  48. if(sdpInfo[i].Framerate) {
  49. rtpSession.setFrameRate(sdpInfo[i].Framerate);
  50. }
  51. }
  52. if(sdpInfo[i].codecName === 'H265') {
  53. rtpSession = new H265Session();
  54. rtpSession.init();
  55. rtpSession.rtpSessionCallback = RtpCallbackH265;
  56. if(sdpInfo[i].Framerate) {
  57. rtpSession.setFrameRate(sdpInfo[i].Framerate);
  58. }
  59. }
  60. if(rtpSession !== null) {
  61. videoCHID = sdpInfo[i].RtpInterlevedID;
  62. videoRtpSessionsArray[videoCHID] = rtpSession;
  63. }
  64. }
  65. }
  66. function RtpCallbackH265(dataInfo) {
  67. console.log('callback->',dataInfo)
  68. }
  69. function RtpReturnCallback(dataInfo) {
  70. if(dataInfo === null || dataInfo === undefined) {
  71. //console.log('数据为空')
  72. return;
  73. }
  74. let mediaData = dataInfo;
  75. if(mediaData.decodeMode === 'canvas') {
  76. sendMessage('YUVData', mediaData.frameData);
  77. return;
  78. }
  79. //console.log( mediaData.SEIInfo)
  80. if(mediaData.initSegmentData !== null && mediaData.initSegmentData !== undefined) {
  81. //sendMessage('codecInfo', mediaData.codecInfo)
  82. //sendMessage('initSegment', mediaData.initSegmentData);
  83. sendMessage('videoInit', mediaData);
  84. sendMessage('firstvideoTimeStamp', mediaData.timeStamp);
  85. }
  86. if(mediaData.SEIInfo !== null && mediaData.SEIInfo !== undefined) {//SEI信息
  87. sendMessage('SEI', mediaData.SEIInfo);
  88. }
  89. if (mediaData.frameData && mediaData.frameData.length > 0) {
  90. sendMessage('videoTimeStamp', mediaData.timeStamp);
  91. sendMessage('mediaSample', mediaData.mediaSample);
  92. //console.log(mediaData.frameData.length)
  93. sendMessage('videoRender', mediaData.frameData);
  94. }
  95. mediaData = null;
  96. }
  97. function sendMessage(type, data) {
  98. let event = {
  99. type: type,
  100. data: data
  101. }
  102. if(type === 'videoRender') {
  103. postMessage(event, [data.buffer]);
  104. }else {
  105. postMessage(event);
  106. }
  107. event = null;
  108. }