您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

55 行
1.8 KiB

  1. using JT1078.Protocol.Enums;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Text;
  5. namespace JT1078.Protocol.Audio
  6. {
  7. public class AudioCodecFactory
  8. {
  9. private readonly AdpcmCodec adpcmCodec = new AdpcmCodec();
  10. private readonly G711ACodec g711ACodec = new G711ACodec();
  11. private readonly G711UCodec g711UCodec = new G711UCodec();
  12. private readonly IFaacEncoder faacEncoder = new FaacEncoder(8000, 1, 16);
  13. //海思芯片编码的音频需要移除海思头,可能还有其他的海思头
  14. private static byte[] HI = new byte[] { 0x00, 0x01, 0x52, 0x00 };
  15. public byte[] Encode(JT1078AVType aVType, byte[] bodies)
  16. {
  17. byte[] pcm = null;
  18. switch (aVType)
  19. {
  20. case JT1078AVType.ADPCM:
  21. ReadOnlySpan<byte> adpcm = bodies;
  22. if (adpcm.StartsWith(HI)) adpcm = adpcm.Slice(4);
  23. pcm = adpcmCodec.ToPcm(adpcm.Slice(4).ToArray(), new AdpcmState()
  24. {
  25. Valprev = (short)((adpcm[1] << 8) | adpcm[0]),
  26. Index = adpcm[2],
  27. Reserved = adpcm[3]
  28. });
  29. //todo:编码mp3
  30. return faacEncoder.Encode(pcm);
  31. case JT1078AVType.G711A:
  32. pcm = g711ACodec.ToPcm(bodies, null);
  33. //todo:编码mp3
  34. return faacEncoder.Encode(pcm);
  35. case JT1078AVType.AACLC:
  36. //直接AAC出去
  37. return bodies;
  38. case JT1078AVType.MP3:
  39. //直接MP3出去
  40. return bodies;
  41. default:
  42. return bodies;
  43. }
  44. }
  45. }
  46. }