Home Reference Source

src/remux/aac-helper.ts

  1. /**
  2. * AAC helper
  3. */
  4.  
  5. class AAC {
  6. static getSilentFrame(
  7. codec?: string,
  8. channelCount?: number
  9. ): Uint8Array | undefined {
  10. switch (codec) {
  11. case 'mp4a.40.2':
  12. if (channelCount === 1) {
  13. return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x23, 0x80]);
  14. } else if (channelCount === 2) {
  15. return new Uint8Array([
  16. 0x21, 0x00, 0x49, 0x90, 0x02, 0x19, 0x00, 0x23, 0x80,
  17. ]);
  18. } else if (channelCount === 3) {
  19. return new Uint8Array([
  20. 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,
  21. 0x00, 0x8e,
  22. ]);
  23. } else if (channelCount === 4) {
  24. return new Uint8Array([
  25. 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,
  26. 0x00, 0x80, 0x2c, 0x80, 0x08, 0x02, 0x38,
  27. ]);
  28. } else if (channelCount === 5) {
  29. return new Uint8Array([
  30. 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,
  31. 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x38,
  32. ]);
  33. } else if (channelCount === 6) {
  34. return new Uint8Array([
  35. 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,
  36. 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x00, 0xb2,
  37. 0x00, 0x20, 0x08, 0xe0,
  38. ]);
  39. }
  40.  
  41. break;
  42. // handle HE-AAC below (mp4a.40.5 / mp4a.40.29)
  43. default:
  44. if (channelCount === 1) {
  45. // ffmpeg -y -f lavfi -i "aevalsrc=0:d=0.05" -c:a libfdk_aac -profile:a aac_he -b:a 4k output.aac && hexdump -v -e '16/1 "0x%x," "\n"' -v output.aac
  46. return new Uint8Array([
  47. 0x1, 0x40, 0x22, 0x80, 0xa3, 0x4e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0,
  48. 0x0, 0x1c, 0x6, 0xf1, 0xc1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,
  49. 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,
  50. 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,
  51. 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,
  52. 0x5a, 0x5e,
  53. ]);
  54. } else if (channelCount === 2) {
  55. // ffmpeg -y -f lavfi -i "aevalsrc=0|0:d=0.05" -c:a libfdk_aac -profile:a aac_he_v2 -b:a 4k output.aac && hexdump -v -e '16/1 "0x%x," "\n"' -v output.aac
  56. return new Uint8Array([
  57. 0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0,
  58. 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a,
  59. 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,
  60. 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,
  61. 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,
  62. 0x5a, 0x5e,
  63. ]);
  64. } else if (channelCount === 3) {
  65. // ffmpeg -y -f lavfi -i "aevalsrc=0|0|0:d=0.05" -c:a libfdk_aac -profile:a aac_he_v2 -b:a 4k output.aac && hexdump -v -e '16/1 "0x%x," "\n"' -v output.aac
  66. return new Uint8Array([
  67. 0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0,
  68. 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a,
  69. 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,
  70. 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,
  71. 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,
  72. 0x5a, 0x5e,
  73. ]);
  74. }
  75. break;
  76. }
  77. return undefined;
  78. }
  79. }
  80.  
  81. export default AAC;