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