videoWorker.js 3.2 KB

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