From 6b7cd78e74de72767cee59e516fa3aadee770ce7 Mon Sep 17 00:00:00 2001 From: waterliu99 Date: Mon, 6 Jul 2020 23:16:40 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=B8=8B=EF=BC=8C=E8=BF=98?= =?UTF-8?q?=E6=B2=A1=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/JT1078.Hls.Test/M3U8_Test.cs | 28 +++++----- src/JT1078.Hls.Test/TS_Package_Test.cs | 4 +- src/JT1078.Hls/M3U8FileManage.cs | 53 +++++++++++++++++- src/JT1078.Hls/TSEncoder.cs | 76 +------------------------- 4 files changed, 70 insertions(+), 91 deletions(-) diff --git a/src/JT1078.Hls.Test/M3U8_Test.cs b/src/JT1078.Hls.Test/M3U8_Test.cs index fc1ae4e..de5ed30 100644 --- a/src/JT1078.Hls.Test/M3U8_Test.cs +++ b/src/JT1078.Hls.Test/M3U8_Test.cs @@ -22,20 +22,20 @@ namespace JT1078.Hls.Test if (!File.Exists(hls_file_directory)) Directory.CreateDirectory(hls_file_directory); var m3u8_filepath = Path.Combine(hls_file_directory, "live.m3u8"); - TSEncoder tSEncoder = new TSEncoder(new M3U8FileManage (new Options.M3U8Option { HlsFileDirectory = hls_file_directory, M3U8Filepath = m3u8_filepath }) ); - var lines = File.ReadAllLines(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "H264", "JT1078_3.txt")); - foreach (var line in lines) - { - var data = line.Split(','); - var bytes = data[6].ToHexBytes(); - JT1078Package package = JT1078Serializer.Deserialize(bytes); - JT1078Package fullpackage = JT1078Serializer.Merge(package); - if (fullpackage != null) - { - tSEncoder.CreateM3U8File(fullpackage); - } - } - tSEncoder.AppendM3U8End(); + //TSEncoder tSEncoder = new TSEncoder(new M3U8FileManage (new Options.M3U8Option { HlsFileDirectory = hls_file_directory, M3U8Filepath = m3u8_filepath }) ); + //var lines = File.ReadAllLines(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "H264", "JT1078_3.txt")); + //foreach (var line in lines) + //{ + // var data = line.Split(','); + // var bytes = data[6].ToHexBytes(); + // JT1078Package package = JT1078Serializer.Deserialize(bytes); + // JT1078Package fullpackage = JT1078Serializer.Merge(package); + // if (fullpackage != null) + // { + // tSEncoder.CreateM3U8File(fullpackage); + // } + //} + //tSEncoder.AppendM3U8End(); } catch (Exception ex) { diff --git a/src/JT1078.Hls.Test/TS_Package_Test.cs b/src/JT1078.Hls.Test/TS_Package_Test.cs index 1618cad..9196cec 100644 --- a/src/JT1078.Hls.Test/TS_Package_Test.cs +++ b/src/JT1078.Hls.Test/TS_Package_Test.cs @@ -81,7 +81,7 @@ namespace JT1078.Hls.Test File.Delete(filepath); var lines = File.ReadAllLines(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "H264", "JT1078_1.txt")); fileStream = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.Write); - TSEncoder tSEncoder = new TSEncoder(new M3U8FileManage(new Options.M3U8Option { })); + TSEncoder tSEncoder = new TSEncoder(); foreach (var line in lines) { var data = line.Split(','); @@ -128,7 +128,7 @@ namespace JT1078.Hls.Test var lines = File.ReadAllLines(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "H264", "JT1078_3.txt")); fileStream = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.Write); bool isNeedFirstHeadler = true; - TSEncoder tSEncoder = new TSEncoder(new M3U8FileManage(new Options.M3U8Option { })); + TSEncoder tSEncoder = new TSEncoder(); foreach (var line in lines) { var data = line.Split(','); diff --git a/src/JT1078.Hls/M3U8FileManage.cs b/src/JT1078.Hls/M3U8FileManage.cs index 5c1307a..1282db2 100644 --- a/src/JT1078.Hls/M3U8FileManage.cs +++ b/src/JT1078.Hls/M3U8FileManage.cs @@ -1,8 +1,10 @@ using System; using System.Buffers; +using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Text; +using JT1078.Hls.MessagePack; using JT1078.Hls.Options; using JT1078.Protocol; using JT1078.Protocol.Extensions; @@ -14,13 +16,62 @@ namespace JT1078.Hls /// public class M3U8FileManage { + private TSEncoder tSEncoder; public readonly M3U8Option m3U8Option; + ArrayPool arrayPool = ArrayPool.Create(); + byte[] fileData; + int fileIndex = 0; - public M3U8FileManage(M3U8Option m3U8Option) + ConcurrentDictionary TsFirst1078PackageDic = new ConcurrentDictionary(); + + public M3U8FileManage(M3U8Option m3U8Option, TSEncoder tSEncoder) { + this.tSEncoder = tSEncoder; this.m3U8Option = m3U8Option; + fileData = arrayPool.Rent(2500000); //AppendM3U8Start(m3U8Option.TsFileMaxSecond, m3U8Option.TsFileCount); } + /// + /// 创建m3u8文件 和 ts文件 + /// + /// + public void CreateM3U8File(JT1078Package jt1078Package) + { + //CombinedTSData(jt1078Package); + //if (m3U8FileManage.m3U8Option.AccumulateSeconds >= m3U8FileManage.m3U8Option.TsFileMaxSecond) + //{ + // m3U8FileManage.CreateM3U8File(jt1078Package, fileData.AsSpan().Slice(0, fileIndex).ToArray()); + // arrayPool.Return(fileData); + // fileData = arrayPool.Rent(2500000); + // fileIndex = 0; + //} + } + + + private byte[] CreateTsData(JT1078Package jt1078Package, bool isNeedHeader,Span span) { + var buff = TSArrayPool.Rent(jt1078Package.Bodies.Length + 2048); + TSMessagePackWriter tSMessagePackWriter = new TSMessagePackWriter(buff); + if (TsFirst1078PackageDic.TryGetValue(jt1078Package.SIM, out var firstTimespan)) + { + if ((jt1078Package.Timestamp - firstTimespan) > 10 * 1000) + { + //按设定的时间(默认为10秒)切分ts文件 + } + var pes = tSEncoder.CreatePES(jt1078Package, 188); + tSMessagePackWriter.WriteArray(pes); + } + else { + var sdt = tSEncoder.CreateSDT(jt1078Package); + tSMessagePackWriter.WriteArray(sdt); + var pat = tSEncoder.CreatePAT(jt1078Package); + tSMessagePackWriter.WriteArray(pat); + var pmt = tSEncoder.CreatePMT(jt1078Package); + tSMessagePackWriter.WriteArray(pmt); + var pes = tSEncoder.CreatePES(jt1078Package, 188); + tSMessagePackWriter.WriteArray(pes); + } + return buff; + } public void CreateM3U8File(JT1078Package fullpackage,byte[] data) { diff --git a/src/JT1078.Hls/TSEncoder.cs b/src/JT1078.Hls/TSEncoder.cs index b843888..184dcf4 100644 --- a/src/JT1078.Hls/TSEncoder.cs +++ b/src/JT1078.Hls/TSEncoder.cs @@ -35,84 +35,12 @@ namespace JT1078.Hls private Dictionary VideoCounter; //todo:音频同步 //private Dictionary AudioCounter = new Dictionary(); - ArrayPool arrayPool = ArrayPool.Create(); - byte[] fileData; - int fileIndex = 0; - private M3U8FileManage m3U8FileManage; - public TSEncoder(M3U8FileManage m3U8FileManage) - { - VideoCounter = new Dictionary(StringComparer.OrdinalIgnoreCase); - this.m3U8FileManage = m3U8FileManage; - fileData = arrayPool.Rent(2500000); - } - /// - /// 创建m3u8文件 和 ts文件 - /// - /// - public void CreateM3U8File(JT1078Package jt1078Package) + public TSEncoder() { - CombinedTSData(jt1078Package); - if (m3U8FileManage.m3U8Option.AccumulateSeconds >= m3U8FileManage.m3U8Option.TsFileMaxSecond) - { - m3U8FileManage.CreateM3U8File(jt1078Package, fileData.AsSpan().Slice(0,fileIndex).ToArray()); - arrayPool.Return(fileData); - fileData = arrayPool.Rent(2500000); - fileIndex = 0; - } - } - - /// - /// m3u8文件 追加结束标识 - /// - public void AppendM3U8End() - { - m3U8FileManage.AppendM3U8End(); + VideoCounter = new Dictionary(StringComparer.OrdinalIgnoreCase); } - /// - /// 按设定的时间(默认为10秒)切分ts文件 - /// - /// - private void CombinedTSData(JT1078Package jt1078Package) - { - if (m3U8FileManage.m3U8Option.TimestampMilliSecond == 0) - { - m3U8FileManage.m3U8Option.TimestampMilliSecond = jt1078Package.Timestamp; - } - else - { - int duration = (int)(jt1078Package.Timestamp - m3U8FileManage.m3U8Option.TimestampMilliSecond); - m3U8FileManage.m3U8Option.TimestampMilliSecond = jt1078Package.Timestamp; - m3U8FileManage.m3U8Option.AccumulateSeconds = m3U8FileManage.m3U8Option.AccumulateSeconds + duration / 1000.0; - } - if (m3U8FileManage.m3U8Option.IsNeedFirstHeadler) - { - var sdt = CreateSDT(jt1078Package); - sdt.CopyTo(fileData, fileIndex); - fileIndex = sdt.Length; - - var pat = CreatePAT(jt1078Package); - pat.CopyTo(fileData, fileIndex); - fileIndex = fileIndex + pat.Length; - - var pmt = CreatePMT(jt1078Package); - pmt.CopyTo(fileData, fileIndex); - fileIndex = fileIndex + pmt.Length; - - var pes = CreatePES(jt1078Package, 18888); - pes.CopyTo(fileData, fileIndex); - fileIndex = fileIndex + pes.Length; - - m3U8FileManage.m3U8Option.IsNeedFirstHeadler = false; - } - else - { - var pes = CreatePES(jt1078Package, 18888); - pes.CopyTo(fileData, fileIndex); - fileIndex = fileIndex + pes.Length; - } - } public byte[] CreateSDT(JT1078Package jt1078Package, int minBufferSize = 188) { byte[] buffer = TSArrayPool.Rent(minBufferSize);