Home Reference Source

src/demux/aacdemuxer.ts

  1. /**
  2. * AAC demuxer
  3. */
  4. import BaseAudioDemuxer from './base-audio-demuxer';
  5. import * as ADTS from './adts';
  6. import { logger } from '../utils/logger';
  7. import * as ID3 from '../demux/id3';
  8. import type { HlsEventEmitter } from '../events';
  9. import type { HlsConfig } from '../config';
  10.  
  11. class AACDemuxer extends BaseAudioDemuxer {
  12. private readonly observer: HlsEventEmitter;
  13. private readonly config: HlsConfig;
  14.  
  15. constructor(observer, config) {
  16. super();
  17. this.observer = observer;
  18. this.config = config;
  19. }
  20.  
  21. resetInitSegment(
  22. initSegment: Uint8Array | undefined,
  23. audioCodec: string | undefined,
  24. videoCodec: string | undefined,
  25. trackDuration: number
  26. ) {
  27. super.resetInitSegment(initSegment, audioCodec, videoCodec, trackDuration);
  28. this._audioTrack = {
  29. container: 'audio/adts',
  30. type: 'audio',
  31. id: 2,
  32. pid: -1,
  33. sequenceNumber: 0,
  34. segmentCodec: 'aac',
  35. samples: [],
  36. manifestCodec: audioCodec,
  37. duration: trackDuration,
  38. inputTimeScale: 90000,
  39. dropped: 0,
  40. };
  41. }
  42.  
  43. // Source for probe info - https://wiki.multimedia.cx/index.php?title=ADTS
  44. static probe(data): boolean {
  45. if (!data) {
  46. return false;
  47. }
  48.  
  49. // Check for the ADTS sync word
  50. // Look for ADTS header | 1111 1111 | 1111 X00X | where X can be either 0 or 1
  51. // Layer bits (position 14 and 15) in header should be always 0 for ADTS
  52. // More info https://wiki.multimedia.cx/index.php?title=ADTS
  53. const id3Data = ID3.getID3Data(data, 0) || [];
  54. let offset = id3Data.length;
  55.  
  56. for (let length = data.length; offset < length; offset++) {
  57. if (ADTS.probe(data, offset)) {
  58. logger.log('ADTS sync word found !');
  59. return true;
  60. }
  61. }
  62. return false;
  63. }
  64.  
  65. canParse(data, offset) {
  66. return ADTS.canParse(data, offset);
  67. }
  68.  
  69. appendFrame(track, data, offset) {
  70. ADTS.initTrackConfig(
  71. track,
  72. this.observer,
  73. data,
  74. offset,
  75. track.manifestCodec
  76. );
  77. const frame = ADTS.appendFrame(
  78. track,
  79. data,
  80. offset,
  81. this.basePTS as number,
  82. this.frameIndex
  83. );
  84. if (frame && frame.missing === 0) {
  85. return frame;
  86. }
  87. }
  88. }
  89.  
  90. export default AACDemuxer;