소스 검색

完成DTS和PTS的计算,可以在ffplay播放了

tags/v1.1.0
SmallChi(Koike) 5 년 전
부모
커밋
d569724a7f
2개의 변경된 파일11개의 추가작업 그리고 28개의 파일을 삭제
  1. +3
    -0
      src/JT1078.Hls.Test/TS_Package_Test.cs
  2. +8
    -28
      src/JT1078.Hls/TSEncoder.cs

+ 3
- 0
src/JT1078.Hls.Test/TS_Package_Test.cs 파일 보기

@@ -112,6 +112,9 @@ namespace JT1078.Hls.Test
} }
} }


/// <summary>
/// 可以用ffplay播放的JT1078_3.ts
/// </summary>
[Fact] [Fact]
public void ToBufferTest3() public void ToBufferTest3()
{ {


+ 8
- 28
src/JT1078.Hls/TSEncoder.cs 파일 보기

@@ -28,6 +28,7 @@ namespace JT1078.Hls
private const int FiexdTSLength = 188; private const int FiexdTSLength = 188;
private const string ServiceProvider = "JTT1078"; private const string ServiceProvider = "JTT1078";
private const string ServiceName = "Koike&TK"; private const string ServiceName = "Koike&TK";
private const int H264DefaultHZ = 90;
public TSEncoder() public TSEncoder()
{ {
VideoCounter = new Dictionary<string, byte>(StringComparer.OrdinalIgnoreCase); VideoCounter = new Dictionary<string, byte>(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) public byte[] CreatePES(JT1078Package jt1078Package, int minBufferSize = 188)
{ {
//将1078一帧的数据拆分成一小段一小段的PES包 //将1078一帧的数据拆分成一小段一小段的PES包
@@ -156,10 +152,6 @@ namespace JT1078.Hls
package.Header.PID = 256; package.Header.PID = 256;
package.Header.PackageType = PackageType.Data_Start; package.Header.PackageType = PackageType.Data_Start;
string key = jt1078Package.GetKey(); string key = jt1078Package.GetKey();
if (jt1078Package.Label3.DataType == JT1078DataType.视频P帧)
{

}
if(VideoCounter.TryGetValue(key,out byte counter)) if(VideoCounter.TryGetValue(key,out byte counter))
{ {
if (counter > 0xf) if (counter > 0xf)
@@ -182,6 +174,7 @@ namespace JT1078.Hls
//3 + 1 + 1 + 1 + 2 //3 + 1 + 1 + 1 + 2
totalLength += (3+1+1+1+2); totalLength += (3+1+1+1+2);
package.Payload.PTS_DTS_Flag = PTS_DTS_Flags.all; package.Payload.PTS_DTS_Flag = PTS_DTS_Flags.all;
long timestamp= (long)jt1078Package.Timestamp;
if (jt1078Package.Label3.DataType== JT1078DataType.视频I帧) if (jt1078Package.Label3.DataType== JT1078DataType.视频I帧)
{ {
//ts header adaptation //ts header adaptation
@@ -189,32 +182,19 @@ namespace JT1078.Hls
//1 + 6 //1 + 6
totalLength += (1 + 6); totalLength += (1 + 6);
package.Header.Adaptation.PCRIncluded = PCRInclude.包含; 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 //ts header adaptation
//PCRIncluded //PCRIncluded
//1 //1
totalLength += 1; totalLength += 1;
package.Header.Adaptation.PCRIncluded = PCRInclude.不包含; 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 //Flag1 + PTS_DTS_Flag + DTS + PTS
//1 + 1 + 5 + 5 = 12 //1 + 1 + 5 + 5 = 12


불러오는 중...
취소
저장