diff --git a/src/JT1078.Hls.Test/TS_Package_Test.cs b/src/JT1078.Hls.Test/TS_Package_Test.cs index 4ae2a2a..60f1cfd 100644 --- a/src/JT1078.Hls.Test/TS_Package_Test.cs +++ b/src/JT1078.Hls.Test/TS_Package_Test.cs @@ -112,6 +112,9 @@ namespace JT1078.Hls.Test } } + /// + /// 可以用ffplay播放的JT1078_3.ts + /// [Fact] public void ToBufferTest3() { diff --git a/src/JT1078.Hls/TSEncoder.cs b/src/JT1078.Hls/TSEncoder.cs index 9b41a16..72de25d 100644 --- a/src/JT1078.Hls/TSEncoder.cs +++ b/src/JT1078.Hls/TSEncoder.cs @@ -28,6 +28,7 @@ namespace JT1078.Hls private const int FiexdTSLength = 188; private const string ServiceProvider = "JTT1078"; private const string ServiceName = "Koike&TK"; + private const int H264DefaultHZ = 90; public TSEncoder() { VideoCounter = new Dictionary(StringComparer.OrdinalIgnoreCase); @@ -133,11 +134,6 @@ namespace JT1078.Hls } } - public static long LastIFrameInterval = 0; - public static long LastFrameInterval = 0; - public static ulong? PrevTimestamp; - public static ulong TimestampTotal = 0; - public byte[] CreatePES(JT1078Package jt1078Package, int minBufferSize = 188) { //将1078一帧的数据拆分成一小段一小段的PES包 @@ -156,10 +152,6 @@ namespace JT1078.Hls package.Header.PID = 256; package.Header.PackageType = PackageType.Data_Start; string key = jt1078Package.GetKey(); - if (jt1078Package.Label3.DataType == JT1078DataType.视频P帧) - { - - } if(VideoCounter.TryGetValue(key,out byte counter)) { if (counter > 0xf) @@ -182,6 +174,7 @@ namespace JT1078.Hls //3 + 1 + 1 + 1 + 2 totalLength += (3+1+1+1+2); package.Payload.PTS_DTS_Flag = PTS_DTS_Flags.all; + long timestamp= (long)jt1078Package.Timestamp; if (jt1078Package.Label3.DataType== JT1078DataType.视频I帧) { //ts header adaptation @@ -189,32 +182,19 @@ namespace JT1078.Hls //1 + 6 totalLength += (1 + 6); package.Header.Adaptation.PCRIncluded = PCRInclude.包含; - if (!PrevTimestamp.HasValue) - { - PrevTimestamp = jt1078Package.Timestamp; - TimestampTotal = 0; - } - else - { - TimestampTotal += (jt1078Package.Timestamp - PrevTimestamp.Value); - PrevTimestamp = jt1078Package.Timestamp; - } - package.Header.Adaptation.Timestamp = (long)(jt1078Package.Timestamp / 1000); - //package.Header.Adaptation.Timestamp = (long)TimestampTotal; - LastIFrameInterval += jt1078Package.LastIFrameInterval; - package.Payload.DTS = LastIFrameInterval; - package.Payload.PTS = LastIFrameInterval; + package.Header.Adaptation.Timestamp = timestamp; + package.Payload.DTS = timestamp * H264DefaultHZ; + package.Payload.PTS = package.Payload.DTS + jt1078Package.LastIFrameInterval * H264DefaultHZ; } - else + else if(jt1078Package.Label3.DataType == JT1078DataType.视频P帧) { //ts header adaptation //PCRIncluded //1 totalLength += 1; package.Header.Adaptation.PCRIncluded = PCRInclude.不包含; - LastFrameInterval += jt1078Package.LastFrameInterval; - package.Payload.DTS = LastFrameInterval; - package.Payload.PTS = LastFrameInterval; + package.Payload.DTS = timestamp * H264DefaultHZ; + package.Payload.PTS = package.Payload.DTS + jt1078Package.LastFrameInterval * H264DefaultHZ; } //Flag1 + PTS_DTS_Flag + DTS + PTS //1 + 1 + 5 + 5 = 12