From f890b02681a98ff98c5d3c093e7f4f5238d40587 Mon Sep 17 00:00:00 2001 From: "SmallChi(Koike)" <564952747@qq.com> Date: Wed, 20 May 2020 17:52:03 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9sdt=E5=92=8Cpes=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/JT1078.Hls.Test/TS_Package_Test.cs | 5 ++ src/JT1078.Hls.Test/TS_SDT_Package_Test.cs | 6 +-- .../Descriptors/TS_SDT_Service_Descriptor.cs | 11 ++--- src/JT1078.Hls/TSEncoder.cs | 47 +++++++++++++++++++ src/JT1078.Hls/TS_AdaptationInfo.cs | 2 + 5 files changed, 62 insertions(+), 9 deletions(-) diff --git a/src/JT1078.Hls.Test/TS_Package_Test.cs b/src/JT1078.Hls.Test/TS_Package_Test.cs index ef61ed4..9a9a0d8 100644 --- a/src/JT1078.Hls.Test/TS_Package_Test.cs +++ b/src/JT1078.Hls.Test/TS_Package_Test.cs @@ -37,7 +37,11 @@ namespace JT1078.Hls.Test JT1078Package fullpackage = JT1078Serializer.Merge(package); if (fullpackage != null) { + var sdt = tSEncoder.CreateSDT(fullpackage); + string sdtHEX = sdt.ToHexString(); + fileStream.Write(sdt); var pat = tSEncoder.CreatePAT(fullpackage); + string patHEX = pat.ToHexString(); fileStream.Write(pat); var pmt = tSEncoder.CreatePMT(fullpackage); fileStream.Write(pmt); @@ -56,6 +60,7 @@ namespace JT1078.Hls.Test fileStream?.Dispose(); } } + [Fact] public void ToBufferTest3() { diff --git a/src/JT1078.Hls.Test/TS_SDT_Package_Test.cs b/src/JT1078.Hls.Test/TS_SDT_Package_Test.cs index 6e0a97b..277e523 100644 --- a/src/JT1078.Hls.Test/TS_SDT_Package_Test.cs +++ b/src/JT1078.Hls.Test/TS_SDT_Package_Test.cs @@ -37,10 +37,10 @@ namespace JT1078.Hls.Test FreeCAMode = 0x00, Descriptors = new List { new Descriptors.TS_SDT_Service_Descriptor{ - DescriptorTag=0x48, + Tag=0x48, ServiceType= TS_SDT_Service_Descriptor_ServiceType.数字电视业务, - ServiceProvider="FFmpeg", - ServiceName="Service01" + ServiceProvider="FFmpeg", + ServiceName="Service01" } } }) ; diff --git a/src/JT1078.Hls/Descriptors/TS_SDT_Service_Descriptor.cs b/src/JT1078.Hls/Descriptors/TS_SDT_Service_Descriptor.cs index 0d44811..9c49630 100644 --- a/src/JT1078.Hls/Descriptors/TS_SDT_Service_Descriptor.cs +++ b/src/JT1078.Hls/Descriptors/TS_SDT_Service_Descriptor.cs @@ -11,18 +11,17 @@ namespace JT1078.Hls.Descriptors /// /// 涓氬姟鎻忚堪鏈嶅姟鎻忚堪 /// - public class TS_SDT_Service_Descriptor : ITSMessagePackFormatter + public class TS_SDT_Service_Descriptor : DescriptorBase { /// /// 涓氬姟鎻忚堪绗 /// 8bit /// - public byte DescriptorTag { get; set; } = 0x48; + public override byte Tag { get; set; } = 0x48; /// - /// /// 8bit /// - internal byte DescriptorLength { get; set; } + public override byte Length { get; set; } /// /// /// 8bit @@ -48,9 +47,9 @@ namespace JT1078.Hls.Descriptors /// ServiceNameLenth /// internal string ServiceName { get; set; } - public void ToBuffer(ref TSMessagePackWriter writer) + public override void ToBuffer(ref TSMessagePackWriter writer) { - writer.WriteByte(DescriptorTag); + writer.WriteByte(Tag); writer.Skip(1,out var position); writer.WriteByte((byte)ServiceType); writer.Skip(1, out var serviceProviderLengthPosition); diff --git a/src/JT1078.Hls/TSEncoder.cs b/src/JT1078.Hls/TSEncoder.cs index ed9c604..ba74ed6 100644 --- a/src/JT1078.Hls/TSEncoder.cs +++ b/src/JT1078.Hls/TSEncoder.cs @@ -10,6 +10,7 @@ using JT1078.Hls.MessagePack; using JT1078.Hls.Enums; using System.Collections.Concurrent; using System.Security.Cryptography; +using JT1078.Hls.Descriptors; [assembly: InternalsVisibleTo("JT1078.Hls.Test")] @@ -24,8 +25,54 @@ namespace JT1078.Hls { private const int FiexdSegmentPESLength = 184; private const int FiexdTSLength = 188; + private const string ServiceProvider = "JTT1078"; + private const string ServiceName = "Koike&TK"; private ConcurrentDictionary VideoCounter = new ConcurrentDictionary(); //private ConcurrentDictionary AudioCounter = new ConcurrentDictionary(); + public byte[] CreateSDT(JT1078Package jt1078Package, int minBufferSize = 188) + { + byte[] buffer = TSArrayPool.Rent(minBufferSize); + try + { + TS_SDT_Package package = new TS_SDT_Package(); + package.Header = new TS_Header(); + package.Header.PID = 0x0011; + package.Header.AdaptationFieldControl = AdaptationFieldControl.鏃犺嚜閫傚簲鍩焈浠呭惈鏈夋晥璐熻浇; + package.Header.ContinuityCounter = 0; + package.TableId = 0x42; + package.TransportStreamId = 0x0001; + package.VersionNumber = 0; + package.CurrentNextIndicator = 0x01; + package.SectionNumber = 0x00; + package.LastSectionNumber = 0x00; + package.OriginalNetworkId = 0xFF01; + package.Services = new List(); + package.Services.Add(new TS_SDT_Service() + { + ServiceId = 0x0001, + EITScheduleFlag = 0x00, + EITPresentFollowingFlag = 0x00, + RunningStatus = TS_SDT_Service_RunningStatus.杩愯, + FreeCAMode = 0x00, + Descriptors = new List + { + new TS_SDT_Service_Descriptor{ + Tag=0x48, + ServiceType= TS_SDT_Service_Descriptor_ServiceType.鏁板瓧鐢佃涓氬姟, + ServiceProvider=ServiceProvider, + ServiceName=ServiceName + } + } + }); + TSMessagePackWriter writer = new TSMessagePackWriter(buffer); + package.ToBuffer(ref writer); + return writer.FlushAndGetArray(); + } + finally + { + TSArrayPool.Return(buffer); + } + } public byte[] CreatePAT(JT1078Package jt1078Package, int minBufferSize = 188) { byte[] buffer = TSArrayPool.Rent(minBufferSize); diff --git a/src/JT1078.Hls/TS_AdaptationInfo.cs b/src/JT1078.Hls/TS_AdaptationInfo.cs index 6e84c79..0b1189e 100644 --- a/src/JT1078.Hls/TS_AdaptationInfo.cs +++ b/src/JT1078.Hls/TS_AdaptationInfo.cs @@ -31,6 +31,8 @@ namespace JT1078.Hls if (PCRIncluded== PCRInclude.鍖呭惈) { writer.WriteInt5(PCR); +#warning PCR 0???? + writer.WriteByte(0); } if (FillSize > 0) {