Sfoglia il codice sorgente

feat(audio): 添加无头PCM音频数据接收支持

- 配置文件中新增raw-pcm-bytes参数,默认值设为81920(80K)
- 在AudioFrameDecoder中实现PCM数据帧解码逻辑
- 添加resynchronizing状态用于处理损坏WAV头后的重新同步
- NettyServerThread中集成PCM字节长度配置注入
- 支持80K无头PCM接收并自动补全WAV头部信息
- 兼容原有带头WAV格式的正常接收处理
林仔 4 settimane fa
parent
commit
e706237814

+ 3 - 2
audio-service/src/main/java/com/zksy/audio/config/NettyServerThread.java

@@ -27,8 +27,9 @@ public class NettyServerThread {
 	private int port;
     @Value("${collection.worker-threads:16}")
     private int businessThreads = 16;
-    @Value("${wlds.raw-pcm-bytes:0}")
-    private int rawPcmBytes;
+    // 厂家handler.txt支持80KiB无头PCM,收齐后补WAV头;带头WAV仍按RIFF长度接收。
+    @Value("${wlds.raw-pcm-bytes:81920}")
+    private int rawPcmBytes = 80 * 1024;
     @Value("${device.offline.timeout-minutes:1560}")
     private int offlineTimeoutMinutes = 1560;
 	private static Logger logger = LoggerFactory.getLogger(NettyServerThread.class);

+ 6 - 1
audio-service/src/main/java/com/zksy/audio/utils/AudioFrameDecoder.java

@@ -11,6 +11,8 @@ import java.util.List;
 public final class AudioFrameDecoder extends ByteToMessageDecoder {
     private static final int MAX_WAV_BYTES = 8 * 1024 * 1024;
     private final int rawPcmBytes;
+    // 损坏WAV头之后寻找下一条元数据或有效WAV,不能将坏头残留误当80K PCM等待。
+    private boolean resynchronizing;
     public AudioFrameDecoder() { this(0); }
     public AudioFrameDecoder(int rawPcmBytes) {
         if (rawPcmBytes < 0 || rawPcmBytes > MAX_WAV_BYTES - 44 || rawPcmBytes % 2 != 0) {
@@ -33,16 +35,19 @@ public final class AudioFrameDecoder extends ByteToMessageDecoder {
                     return;
                 }
                 out.add(in.readRetainedSlice(end - start));
+                resynchronizing = false;
             } else if (prefix.equals("RIFF")) {
                 if (in.readableBytes() < 12) return;
                 long length = in.getUnsignedIntLE(start + 4) + 8;
                 if (length < 44 || length > MAX_WAV_BYTES || in.getInt(start + 8) != 0x57415645) {
                     in.skipBytes(4);
+                    resynchronizing = true;
                     continue;
                 }
                 if (in.readableBytes() < length) return;
                 out.add(in.readRetainedSlice((int) length));
-            } else if (rawPcmBytes > 0) {
+                resynchronizing = false;
+            } else if (rawPcmBytes > 0 && !resynchronizing) {
                 if (in.readableBytes() < rawPcmBytes) return;
                 ByteBuf wav = Unpooled.buffer(44 + rawPcmBytes);
                 wav.writeInt(0x52494646).writeIntLE(36 + rawPcmBytes).writeInt(0x57415645);

+ 1 - 0
audio-service/src/main/resources/application-dev.yaml

@@ -20,6 +20,7 @@ device:
     timeout-minutes: 1560 # 每24小时上报,超过26小时未收到有效数据才判离线
     check-interval-ms: 300000
 wlds:
+  raw-pcm-bytes: 81920 # 厂家80K无头PCM接收长度,另兼容带头WAV;0仅接收带头WAV
   retransmission-window-seconds: 120 # 每24小时上传正常/异常录音;同内容连续重传刷新2分钟静默窗口
   fileUploadBaseDir: D:\home\wlds\uploads
   leak:

+ 1 - 0
audio-service/src/main/resources/application-druid.yaml

@@ -20,6 +20,7 @@ device:
     timeout-minutes: 1560 # 每24小时上报,超过26小时未收到有效数据才判离线
     check-interval-ms: 300000
 wlds:
+  raw-pcm-bytes: 81920 # 厂家80K无头PCM接收长度,另兼容带头WAV;0仅接收带头WAV
   retransmission-window-seconds: 120 # 每24小时上传正常/异常录音;同内容连续重传刷新2分钟静默窗口
   fileUploadBaseDir: \home\wlds\uploads
   leak:

+ 1 - 0
audio-service/src/main/resources/application-prod.yaml

@@ -14,6 +14,7 @@ device:
     timeout-minutes: 1560 # 每24小时上报,超过26小时未收到有效数据才判离线
     check-interval-ms: 300000
 wlds:
+  raw-pcm-bytes: 81920 # 厂家80K无头PCM接收长度,另兼容带头WAV;0仅接收带头WAV
   retransmission-window-seconds: 120 # 每24小时上传正常/异常录音;同内容连续重传刷新2分钟静默窗口
   fileUploadBaseDir: \home\wlds\uploads
   leak: