@@ -37,7 +37,11 @@ namespace JT1078.Hls.Test | |||||
JT1078Package fullpackage = JT1078Serializer.Merge(package); | JT1078Package fullpackage = JT1078Serializer.Merge(package); | ||||
if (fullpackage != null) | if (fullpackage != null) | ||||
{ | { | ||||
var sdt = tSEncoder.CreateSDT(fullpackage); | |||||
string sdtHEX = sdt.ToHexString(); | |||||
fileStream.Write(sdt); | |||||
var pat = tSEncoder.CreatePAT(fullpackage); | var pat = tSEncoder.CreatePAT(fullpackage); | ||||
string patHEX = pat.ToHexString(); | |||||
fileStream.Write(pat); | fileStream.Write(pat); | ||||
var pmt = tSEncoder.CreatePMT(fullpackage); | var pmt = tSEncoder.CreatePMT(fullpackage); | ||||
fileStream.Write(pmt); | fileStream.Write(pmt); | ||||
@@ -56,6 +60,7 @@ namespace JT1078.Hls.Test | |||||
fileStream?.Dispose(); | fileStream?.Dispose(); | ||||
} | } | ||||
} | } | ||||
[Fact] | [Fact] | ||||
public void ToBufferTest3() | public void ToBufferTest3() | ||||
{ | { | ||||
@@ -37,10 +37,10 @@ namespace JT1078.Hls.Test | |||||
FreeCAMode = 0x00, | FreeCAMode = 0x00, | ||||
Descriptors = new List<Descriptors.TS_SDT_Service_Descriptor> { | Descriptors = new List<Descriptors.TS_SDT_Service_Descriptor> { | ||||
new Descriptors.TS_SDT_Service_Descriptor{ | new Descriptors.TS_SDT_Service_Descriptor{ | ||||
DescriptorTag=0x48, | Tag=0x48, | ||||
ServiceType= TS_SDT_Service_Descriptor_ServiceType.Êý×ÖµçÊÓÒµÎñ, | ServiceType= TS_SDT_Service_Descriptor_ServiceType.Êý×ÖµçÊÓÒµÎñ, | ||||
ServiceProvider="FFmpeg", | ServiceProvider="FFmpeg", | ||||
ServiceName="Service01" | ServiceName="Service01" | ||||
} | } | ||||
} | } | ||||
}) ; | }) ; | ||||
@@ -11,18 +11,17 @@ namespace JT1078.Hls.Descriptors | |||||
/// <summary> | /// <summary> | ||||
/// 业务描述服务描述 | /// 业务描述服务描述 | ||||
/// </summary> | /// </summary> | ||||
public class TS_SDT_Service_Descriptor : ITSMessagePackFormatter | public class TS_SDT_Service_Descriptor : DescriptorBase | ||||
{ | { | ||||
/// <summary> | /// <summary> | ||||
/// 业务描述符 | /// 业务描述符 | ||||
/// 8bit | /// 8bit | ||||
/// </summary> | /// </summary> | ||||
public byte DescriptorTag { get; set; } = 0x48; | public override byte Tag { get; set; } = 0x48; | ||||
/// <summary> | /// <summary> | ||||
/// | |||||
/// 8bit | /// 8bit | ||||
/// </summary> | /// </summary> | ||||
internal byte DescriptorLength { get; set; } | public override byte Length { get; set; } | ||||
/// <summary> | /// <summary> | ||||
/// | /// | ||||
/// 8bit | /// 8bit | ||||
@@ -48,9 +47,9 @@ namespace JT1078.Hls.Descriptors | |||||
/// ServiceNameLenth | /// ServiceNameLenth | ||||
/// </summary> | /// </summary> | ||||
internal string ServiceName { get; set; } | 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.Skip(1,out var position); | ||||
writer.WriteByte((byte)ServiceType); | writer.WriteByte((byte)ServiceType); | ||||
writer.Skip(1, out var serviceProviderLengthPosition); | writer.Skip(1, out var serviceProviderLengthPosition); | ||||
@@ -10,6 +10,7 @@ using JT1078.Hls.MessagePack; | |||||
using JT1078.Hls.Enums; | using JT1078.Hls.Enums; | ||||
using System.Collections.Concurrent; | using System.Collections.Concurrent; | ||||
using System.Security.Cryptography; | using System.Security.Cryptography; | ||||
using JT1078.Hls.Descriptors; | |||||
[assembly: InternalsVisibleTo("JT1078.Hls.Test")] | [assembly: InternalsVisibleTo("JT1078.Hls.Test")] | ||||
@@ -24,8 +25,54 @@ namespace JT1078.Hls | |||||
{ | { | ||||
private const int FiexdSegmentPESLength = 184; | private const int FiexdSegmentPESLength = 184; | ||||
private const int FiexdTSLength = 188; | 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> VideoCounter = new ConcurrentDictionary<string, byte>(); | ||||
//private ConcurrentDictionary<string, byte> AudioCounter = 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) | public byte[] CreatePAT(JT1078Package jt1078Package, int minBufferSize = 188) | ||||
{ | { | ||||
byte[] buffer = TSArrayPool.Rent(minBufferSize); | byte[] buffer = TSArrayPool.Rent(minBufferSize); | ||||
@@ -31,6 +31,8 @@ namespace JT1078.Hls | |||||
if (PCRIncluded== PCRInclude.包含) | if (PCRIncluded== PCRInclude.包含) | ||||
{ | { | ||||
writer.WriteInt5(PCR); | writer.WriteInt5(PCR); | ||||
#warning PCR 0???? | |||||
writer.WriteByte(0); | |||||
} | } | ||||
if (FillSize > 0) | if (FillSize > 0) | ||||
{ | { | ||||