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