|
|
@@ -3,13 +3,12 @@ package com.jttserver.relay;
|
|
|
import org.junit.jupiter.api.BeforeEach;
|
|
|
import org.junit.jupiter.api.Test;
|
|
|
|
|
|
+import com.jttserver.codec.FlvPacketizer;
|
|
|
import com.jttserver.protocol.Jtt1078PacketParams;
|
|
|
|
|
|
import java.io.ByteArrayOutputStream;
|
|
|
import static org.junit.jupiter.api.Assertions.*;
|
|
|
|
|
|
-
|
|
|
-
|
|
|
public class FlvStreamRelayTest {
|
|
|
private FlvRealtimeStreamRelay flvStreamRelay;
|
|
|
|
|
|
@@ -23,8 +22,8 @@ public class FlvStreamRelayTest {
|
|
|
String channelId = "test_channel_avc";
|
|
|
|
|
|
// 简化的 H.264 SPS/PPS,与已有 FlvPacketizerTest 中的数据保持一致
|
|
|
- byte[] spsData = new byte[]{0x67, 0x42, 0x00, 0x0A, (byte)0xF8, 0x41, (byte)0xA2};
|
|
|
- byte[] ppsData = new byte[]{0x68, (byte)0xCB, (byte)0x8C, (byte)0xB2};
|
|
|
+ byte[] spsData = new byte[] { 0x67, 0x42, 0x00, 0x0A, (byte) 0xF8, 0x41, (byte) 0xA2 };
|
|
|
+ byte[] ppsData = new byte[] { 0x68, (byte) 0xCB, (byte) 0x8C, (byte) 0xB2 };
|
|
|
|
|
|
// 参数:payloadType=98 表示 H.264
|
|
|
Jtt1078PacketParams params = new Jtt1078PacketParams();
|
|
|
@@ -36,6 +35,8 @@ public class FlvStreamRelayTest {
|
|
|
|
|
|
// 验证初始化段(包含 FLV 头 + 序列头)
|
|
|
byte[] init = flvStreamRelay.getChannelInitVideoSegment(channelId);
|
|
|
+ init = concat(FlvPacketizer.FLV_HEADER_ALL, init);
|
|
|
+
|
|
|
assertNotNull(init);
|
|
|
assertTrue(init.length > 13, "初始化段应包含文件头和至少一个视频Tag");
|
|
|
|
|
|
@@ -58,14 +59,16 @@ public class FlvStreamRelayTest {
|
|
|
int tagStart = 13; // FLV头后的位置
|
|
|
assertEquals(0x09, init[tagStart], "首个Tag应为视频类型(0x09)");
|
|
|
|
|
|
- // 验证序列头标记:在Tag的11字节头之后,payload首字节为 FrameType+CodecID,下一字节为 AVCPacketType
|
|
|
+ // 验证序列头标记:在Tag的11字节头之后,payload首字节为 FrameType+CodecID,下一字节为 AVCPacketType
|
|
|
int payloadStart = tagStart + 11;
|
|
|
assertTrue(init.length > payloadStart + 2, "初始化段中的视频Tag的payload应存在");
|
|
|
assertEquals(0x17, init[payloadStart], "AVC序列头的FrameType+CodecID应为0x17");
|
|
|
assertEquals(0x00, init[payloadStart + 1], "AVCPacketType应为0x00(序列头)");
|
|
|
|
|
|
- // 替代验证:使用初始化段校验序列头,不依赖内存缓冲
|
|
|
+ // 替代验证:使用初始化段校验序列头,不依赖内存缓冲
|
|
|
byte[] initAgain = flvStreamRelay.getChannelInitVideoSegment(channelId);
|
|
|
+ initAgain = concat(FlvPacketizer.FLV_HEADER_ALL, initAgain);
|
|
|
+
|
|
|
assertNotNull(initAgain);
|
|
|
assertTrue(initAgain.length > tagStart + 11 + 2, "初始化段应包含FLV头和至少一个视频序列头Tag");
|
|
|
assertEquals(0x09, initAgain[tagStart + 0], "初始化段首个Tag应为视频类型(0x09)");
|
|
|
@@ -79,9 +82,9 @@ public class FlvStreamRelayTest {
|
|
|
void testPublishVideoSplitMultipleNalues_H264CombinedSpsPps() {
|
|
|
String channelId = "test_channel_avc_multi";
|
|
|
|
|
|
- byte[] startCode = new byte[]{0x00, 0x00, 0x00, 0x01};
|
|
|
- byte[] spsData = new byte[]{0x67, 0x42, 0x00, 0x0A, (byte)0xF8, 0x41, (byte)0xA2};
|
|
|
- byte[] ppsData = new byte[]{0x68, (byte)0xCB, (byte)0x8C, (byte)0xB2};
|
|
|
+ byte[] startCode = new byte[] { 0x00, 0x00, 0x00, 0x01 };
|
|
|
+ byte[] spsData = new byte[] { 0x67, 0x42, 0x00, 0x0A, (byte) 0xF8, 0x41, (byte) 0xA2 };
|
|
|
+ byte[] ppsData = new byte[] { 0x68, (byte) 0xCB, (byte) 0x8C, (byte) 0xB2 };
|
|
|
|
|
|
// 参数:payloadType=98 表示 H.264
|
|
|
Jtt1078PacketParams params = new Jtt1078PacketParams();
|
|
|
@@ -100,6 +103,8 @@ public class FlvStreamRelayTest {
|
|
|
|
|
|
// 验证初始化段(包含 FLV 头 + 序列头)
|
|
|
byte[] init = flvStreamRelay.getChannelInitVideoSegment(channelId);
|
|
|
+ init = concat(FlvPacketizer.FLV_HEADER_ALL, init);
|
|
|
+
|
|
|
assertNotNull(init);
|
|
|
assertTrue(init.length > 13, "初始化段应包含文件头和至少一个视频Tag");
|
|
|
// 校验 FLV 头(13字节:9字节头+4字节PreviousTagSize0)
|
|
|
@@ -128,6 +133,8 @@ public class FlvStreamRelayTest {
|
|
|
|
|
|
// 替代验证:使用初始化段再次校验序列头,不依赖内存缓冲
|
|
|
byte[] initAgain = flvStreamRelay.getChannelInitVideoSegment(channelId);
|
|
|
+ initAgain = concat(FlvPacketizer.FLV_HEADER_ALL, initAgain);
|
|
|
+
|
|
|
assertNotNull(initAgain);
|
|
|
assertTrue(initAgain.length > tagStart + 11 + 2, "初始化段应包含FLV头和至少一个视频序列头Tag");
|
|
|
assertEquals(0x09, initAgain[tagStart + 0], "初始化段首个Tag应为视频类型(0x09)");
|
|
|
@@ -135,4 +142,11 @@ public class FlvStreamRelayTest {
|
|
|
assertEquals(0x17, initAgain[tagStart + bufPayloadStart], "序列头的FrameType+CodecID应为0x17");
|
|
|
assertEquals(0x00, initAgain[tagStart + bufPayloadStart + 1], "AVCPacketType应为0x00(序列头)");
|
|
|
}
|
|
|
+
|
|
|
+ public static byte[] concat(byte[] a, byte[] b) {
|
|
|
+ byte[] result = new byte[a.length + b.length];
|
|
|
+ System.arraycopy(a, 0, result, 0, a.length);
|
|
|
+ System.arraycopy(b, 0, result, a.length, b.length);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
}
|