@@ -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() | |||
{ | |||
@@ -37,10 +37,10 @@ namespace JT1078.Hls.Test | |||
FreeCAMode = 0x00, | |||
Descriptors = new List<Descriptors.TS_SDT_Service_Descriptor> { | |||
new Descriptors.TS_SDT_Service_Descriptor{ | |||
DescriptorTag=0x48, | |||
Tag=0x48, | |||
ServiceType= TS_SDT_Service_Descriptor_ServiceType.Êý×ÖµçÊÓÒµÎñ, | |||
ServiceProvider="FFmpeg", | |||
ServiceName="Service01" | |||
ServiceProvider="FFmpeg", | |||
ServiceName="Service01" | |||
} | |||
} | |||
}) ; | |||
@@ -11,18 +11,17 @@ namespace JT1078.Hls.Descriptors | |||
/// <summary> | |||
/// 业务描述服务描述 | |||
/// </summary> | |||
public class TS_SDT_Service_Descriptor : ITSMessagePackFormatter | |||
public class TS_SDT_Service_Descriptor : DescriptorBase | |||
{ | |||
/// <summary> | |||
/// 业务描述符 | |||
/// 8bit | |||
/// </summary> | |||
public byte DescriptorTag { get; set; } = 0x48; | |||
public override byte Tag { get; set; } = 0x48; | |||
/// <summary> | |||
/// | |||
/// 8bit | |||
/// </summary> | |||
internal byte DescriptorLength { get; set; } | |||
public override byte Length { get; set; } | |||
/// <summary> | |||
/// | |||
/// 8bit | |||
@@ -48,9 +47,9 @@ namespace JT1078.Hls.Descriptors | |||
/// ServiceNameLenth | |||
/// </summary> | |||
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); | |||
@@ -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<string, byte> VideoCounter = new ConcurrentDictionary<string, byte>(); | |||
//private ConcurrentDictionary<string, byte> AudioCounter = new ConcurrentDictionary<string, byte>(); | |||
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<TS_SDT_Service>(); | |||
package.Services.Add(new TS_SDT_Service() | |||
{ | |||
ServiceId = 0x0001, | |||
EITScheduleFlag = 0x00, | |||
EITPresentFollowingFlag = 0x00, | |||
RunningStatus = TS_SDT_Service_RunningStatus.运行, | |||
FreeCAMode = 0x00, | |||
Descriptors = new List<TS_SDT_Service_Descriptor> | |||
{ | |||
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); | |||
@@ -31,6 +31,8 @@ namespace JT1078.Hls | |||
if (PCRIncluded== PCRInclude.包含) | |||
{ | |||
writer.WriteInt5(PCR); | |||
#warning PCR 0???? | |||
writer.WriteByte(0); | |||
} | |||
if (FillSize > 0) | |||
{ | |||