You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

183 line
7.8 KiB

  1. using JT808.Protocol.Formatters;
  2. using JT808.Protocol.Interfaces;
  3. using JT808.Protocol.MessagePack;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Text;
  7. using System.Text.Json;
  8. namespace JT808.Protocol.Extensions.JT1078.MessageBody
  9. {
  10. /// <summary>
  11. /// 终端上传音视频属性
  12. /// </summary>
  13. public class JT808_0x1003 : JT808MessagePackFormatter<JT808_0x1003>, JT808Bodies, IJT808Analyze
  14. {
  15. /// <summary>
  16. /// 输入音频编码方式
  17. /// </summary>
  18. public byte EnterAudioEncoding { get; set; }
  19. /// <summary>
  20. /// 输入音频声道数
  21. /// </summary>
  22. public byte EnterAudioChannelsNumber { get; set; }
  23. /// <summary>
  24. /// 输入音频采样率
  25. /// </summary>
  26. public byte EnterAudioSampleRate { get; set; }
  27. /// <summary>
  28. /// 输入音频采样位数
  29. /// </summary>
  30. public byte EnterAudioSampleDigits { get; set; }
  31. /// <summary>
  32. /// 音频帧长度
  33. /// </summary>
  34. public ushort AudioFrameLength { get; set; }
  35. /// <summary>
  36. /// 是否支持音频输出
  37. /// </summary>
  38. public byte IsSupportedAudioOutput { get; set; }
  39. /// <summary>
  40. /// 视频编码方式
  41. /// </summary>
  42. public byte VideoEncoding { get; set; }
  43. /// <summary>
  44. /// 终端支持的最大音频物理通道数量
  45. /// </summary>
  46. public byte TerminalSupportedMaxNumberOfAudioPhysicalChannels{ get; set; }
  47. /// <summary>
  48. /// 终端支持的最大视频物理通道数量
  49. /// </summary>
  50. public byte TerminalSupportedMaxNumberOfVideoPhysicalChannels { get; set; }
  51. /// <summary>
  52. ///
  53. /// </summary>
  54. public ushort MsgId => 0x1003;
  55. /// <summary>
  56. ///
  57. /// </summary>
  58. public bool SkipSerialization => false;
  59. /// <summary>
  60. ///
  61. /// </summary>
  62. public string Description => "终端上传音视频属性";
  63. /// <summary>
  64. ///
  65. /// </summary>
  66. /// <param name="reader"></param>
  67. /// <param name="writer"></param>
  68. /// <param name="config"></param>
  69. public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
  70. {
  71. JT808_0x1003 value = new JT808_0x1003();
  72. value.EnterAudioEncoding = reader.ReadByte();
  73. writer.WriteString($"[{value.EnterAudioEncoding.ReadNumber()}]输入音频编码方式", AudioVideoEncodingDisplay(value.EnterAudioEncoding));
  74. value.EnterAudioChannelsNumber = reader.ReadByte();
  75. writer.WriteNumber($"[{value.EnterAudioChannelsNumber.ReadNumber()}]输入音频声道数", value.EnterAudioChannelsNumber);
  76. value.EnterAudioSampleRate = reader.ReadByte();
  77. writer.WriteString($"[{value.EnterAudioSampleRate.ReadNumber()}]输入音频采样率", AudioSampleRateDisplay(value.EnterAudioSampleRate));
  78. value.EnterAudioSampleDigits = reader.ReadByte();
  79. writer.WriteString($"[{value.EnterAudioSampleDigits.ReadNumber()}]输入音频采样位数", AudioSampleDigitsDisplay(value.EnterAudioSampleDigits));
  80. value.AudioFrameLength = reader.ReadUInt16();
  81. writer.WriteNumber($"[{value.AudioFrameLength.ReadNumber()}]音频帧长度", value.AudioFrameLength);
  82. value.IsSupportedAudioOutput = reader.ReadByte();
  83. writer.WriteString($"[{value.IsSupportedAudioOutput.ReadNumber()}]是否支持音频输出", value.IsSupportedAudioOutput==0?"不支持":"支持");
  84. value.VideoEncoding = reader.ReadByte();
  85. writer.WriteString($"[{value.VideoEncoding.ReadNumber()}]视频编码方式", AudioVideoEncodingDisplay(value.VideoEncoding));
  86. value.TerminalSupportedMaxNumberOfAudioPhysicalChannels = reader.ReadByte();
  87. writer.WriteNumber($"[{value.TerminalSupportedMaxNumberOfAudioPhysicalChannels.ReadNumber()}]终端支持的最大音频物理通道数量", value.TerminalSupportedMaxNumberOfAudioPhysicalChannels);
  88. value.TerminalSupportedMaxNumberOfVideoPhysicalChannels = reader.ReadByte();
  89. writer.WriteNumber($"[{value.TerminalSupportedMaxNumberOfVideoPhysicalChannels.ReadNumber()}]终端支持的最大视频物理通道数量", value.TerminalSupportedMaxNumberOfVideoPhysicalChannels);
  90. string AudioVideoEncodingDisplay(byte AudioVideoEncoding) {
  91. switch (AudioVideoEncoding)
  92. {
  93. case 19:
  94. return "AAC";
  95. case 25:
  96. return "MP3";
  97. case 91:
  98. return "透传";
  99. case 98:
  100. return "H.264";
  101. case 99:
  102. return "H.265";
  103. default:
  104. break;
  105. }
  106. return "未解析";
  107. }
  108. string AudioSampleRateDisplay(byte AudioSampleRate) {
  109. switch (AudioSampleRate)
  110. {
  111. case 0:
  112. return "8 kHz";
  113. case 1:
  114. return "22.05 kHz";
  115. case 2:
  116. return "44.1 kHz";
  117. case 3:
  118. return "48 kHz";
  119. default:
  120. break;
  121. }
  122. return "未知";
  123. }
  124. string AudioSampleDigitsDisplay(byte AudioSampleDigits) {
  125. switch (AudioSampleDigits)
  126. {
  127. case 0:
  128. return "8 位";
  129. case 1:
  130. return "16 位";
  131. case 2:
  132. return "32 位";
  133. default:
  134. break;
  135. }
  136. return "未知";
  137. }
  138. }
  139. /// <summary>
  140. ///
  141. /// </summary>
  142. /// <param name="reader"></param>
  143. /// <param name="config"></param>
  144. /// <returns></returns>
  145. public override JT808_0x1003 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
  146. {
  147. JT808_0x1003 jT808_0x1003 = new JT808_0x1003();
  148. jT808_0x1003.EnterAudioEncoding = reader.ReadByte();
  149. jT808_0x1003.EnterAudioChannelsNumber = reader.ReadByte();
  150. jT808_0x1003.EnterAudioSampleRate = reader.ReadByte();
  151. jT808_0x1003.EnterAudioSampleDigits = reader.ReadByte();
  152. jT808_0x1003.AudioFrameLength = reader.ReadUInt16();
  153. jT808_0x1003.IsSupportedAudioOutput = reader.ReadByte();
  154. jT808_0x1003.VideoEncoding = reader.ReadByte();
  155. jT808_0x1003.TerminalSupportedMaxNumberOfAudioPhysicalChannels = reader.ReadByte();
  156. jT808_0x1003.TerminalSupportedMaxNumberOfVideoPhysicalChannels = reader.ReadByte();
  157. return jT808_0x1003;
  158. }
  159. /// <summary>
  160. ///
  161. /// </summary>
  162. /// <param name="writer"></param>
  163. /// <param name="value"></param>
  164. /// <param name="config"></param>
  165. public override void Serialize(ref JT808MessagePackWriter writer, JT808_0x1003 value, IJT808Config config)
  166. {
  167. writer.WriteByte(value.EnterAudioEncoding);
  168. writer.WriteByte(value.EnterAudioChannelsNumber);
  169. writer.WriteByte(value.EnterAudioSampleRate);
  170. writer.WriteByte(value.EnterAudioSampleDigits);
  171. writer.WriteUInt16(value.AudioFrameLength);
  172. writer.WriteByte(value.IsSupportedAudioOutput);
  173. writer.WriteByte(value.VideoEncoding);
  174. writer.WriteByte(value.TerminalSupportedMaxNumberOfAudioPhysicalChannels);
  175. writer.WriteByte(value.TerminalSupportedMaxNumberOfVideoPhysicalChannels);
  176. }
  177. }
  178. }