From d569724a7f4a29f87deb0a516155387b047906fb Mon Sep 17 00:00:00 2001
From: "SmallChi(Koike)" <564952747@qq.com>
Date: Mon, 25 May 2020 14:48:10 +0800
Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90DTS=E5=92=8CPTS=E7=9A=84?=
=?UTF-8?q?=E8=AE=A1=E7=AE=97=EF=BC=8C=E5=8F=AF=E4=BB=A5=E5=9C=A8ffplay?=
=?UTF-8?q?=E6=92=AD=E6=94=BE=E4=BA=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/JT1078.Hls.Test/TS_Package_Test.cs | 3 +++
src/JT1078.Hls/TSEncoder.cs | 36 ++++++--------------------
2 files changed, 11 insertions(+), 28 deletions(-)
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