From 560ffeaef0ef042231a770acfa35ec1a79959790 Mon Sep 17 00:00:00 2001 From: "SmallChi(Koike)" <564952747@qq.com> Date: Sun, 27 Sep 2020 18:16:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0fmp4=E6=89=80=E9=9C=80?= =?UTF-8?q?=E8=A6=81=E7=9A=84=E7=9B=92=E5=AD=90=E7=BC=96=E7=A0=81=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Boxs/SampleDependencyTypeBox.cs | 1 - .../Boxs/TrackFragmentHeaderBox.cs | 1 - .../Boxs/TrackFragmentRandomAccessBox.cs | 65 ++++++++++++++++--- src/JT1078.FMp4/Boxs/TrackRunBox.cs | 6 +- src/JT1078.FMp4/JT1078.FMp4.xml | 14 ++-- 5 files changed, 70 insertions(+), 17 deletions(-) diff --git a/src/JT1078.FMp4/Boxs/SampleDependencyTypeBox.cs b/src/JT1078.FMp4/Boxs/SampleDependencyTypeBox.cs index 5b67d2b..8b02c52 100644 --- a/src/JT1078.FMp4/Boxs/SampleDependencyTypeBox.cs +++ b/src/JT1078.FMp4/Boxs/SampleDependencyTypeBox.cs @@ -30,7 +30,6 @@ namespace JT1078.FMp4 WriterFullBoxToBuffer(ref writer); if(SampleDependencyTypes!=null && SampleDependencyTypes.Count > 0) { - //todo: wait ref doc foreach(var item in SampleDependencyTypes) { writer.WriteByte(item.IsLeading); diff --git a/src/JT1078.FMp4/Boxs/TrackFragmentHeaderBox.cs b/src/JT1078.FMp4/Boxs/TrackFragmentHeaderBox.cs index 091906e..83d5573 100644 --- a/src/JT1078.FMp4/Boxs/TrackFragmentHeaderBox.cs +++ b/src/JT1078.FMp4/Boxs/TrackFragmentHeaderBox.cs @@ -41,7 +41,6 @@ namespace JT1078.FMp4 Start(ref writer); WriterFullBoxToBuffer(ref writer); writer.WriteUInt32(TrackID); - //todo:all the following are optional fields End(ref writer); } } diff --git a/src/JT1078.FMp4/Boxs/TrackFragmentRandomAccessBox.cs b/src/JT1078.FMp4/Boxs/TrackFragmentRandomAccessBox.cs index 8a3ba3c..2ef2dbc 100644 --- a/src/JT1078.FMp4/Boxs/TrackFragmentRandomAccessBox.cs +++ b/src/JT1078.FMp4/Boxs/TrackFragmentRandomAccessBox.cs @@ -21,21 +21,21 @@ namespace JT1078.FMp4 } public uint TrackID { get; set; } /// - /// 4byte 32-26 + /// 26bit /// - public uint Reserved { get; set; } = 26; + private uint Reserved { get; set; } = 0; /// - /// 4byte 32-28 + /// 2bit /// - public uint LengthSizeOfTrafNum { get; set; } + public byte LengthSizeOfTrafNum { get; set; } /// - /// 4byte 32-30 + /// 2bit /// - public uint LengthSizeOfTrunNum { get; set; } + public byte LengthSizeOfTrunNum { get; set; } /// - /// 4byte 32-32 + /// 2bit /// - public uint LengthSizeOfSampleNum { get; set; } + public byte LengthSizeOfSampleNum { get; set; } public uint NumberOfEntry { get; set; } public List TrackFragmentRandomAccessInfos { get; set; } @@ -43,11 +43,56 @@ namespace JT1078.FMp4 { Start(ref writer); WriterFullBoxToBuffer(ref writer); - - //todo:tfra + writer.WriteUInt32(TrackID); + writer.WriteUInt32((uint)(LengthSizeOfSampleNum | (LengthSizeOfTrunNum << 2) | (LengthSizeOfTrafNum << 4))); + if(TrackFragmentRandomAccessInfos!=null && TrackFragmentRandomAccessInfos.Count > 0) + { + foreach (var item in TrackFragmentRandomAccessInfos) + { + if (Version == 1) + { + writer.WriteUInt64(item.Time); + writer.WriteUInt64(item.MoofOffset); + } + else + { + writer.WriteUInt32((uint)item.Time); + writer.WriteUInt32((uint)item.MoofOffset); + } + var length_size_of_traf_num = LengthSizeOfTrafNum + 1; + ControlSizeOf(ref writer, item.TrafNumber, length_size_of_traf_num); + var length_size_of_trun_num = LengthSizeOfTrunNum + 1; + ControlSizeOf(ref writer, item.TrunNumber, length_size_of_trun_num); + var length_size_of_sample_num = LengthSizeOfSampleNum + 1; + ControlSizeOf(ref writer, item.SampleNumber, length_size_of_sample_num); + } + } + else + { + writer.WriteUInt32(0); + } End(ref writer); } + private void ControlSizeOf(ref FMp4MessagePackWriter writer,uint value,int length) + { + switch (length) + { + case 1: + writer.WriteByte((byte)value); + break; + case 2: + writer.WriteUInt16((ushort)value); + break; + case 3: + writer.WriteUInt24(value); + break; + case 4: + writer.WriteUInt32(value); + break; + } + } + public class TrackFragmentRandomAccessInfo { public ulong Time { get; set; } diff --git a/src/JT1078.FMp4/Boxs/TrackRunBox.cs b/src/JT1078.FMp4/Boxs/TrackRunBox.cs index 0947a76..5ec6575 100644 --- a/src/JT1078.FMp4/Boxs/TrackRunBox.cs +++ b/src/JT1078.FMp4/Boxs/TrackRunBox.cs @@ -25,8 +25,12 @@ namespace JT1078.FMp4 /// 可选的 /// public int DataOffset { get; set; } + /// + /// 可选的 + /// public uint FirstSampleFlags { get; set; } /// + /// 可选的 /// length:SampleCount /// public List TrackRunInfos { get; set; } @@ -35,7 +39,7 @@ namespace JT1078.FMp4 { Start(ref writer); WriterFullBoxToBuffer(ref writer); - //todo: TrackRunBox + writer.WriteUInt32(SampleCount); End(ref writer); } diff --git a/src/JT1078.FMp4/JT1078.FMp4.xml b/src/JT1078.FMp4/JT1078.FMp4.xml index ce55626..fad6173 100644 --- a/src/JT1078.FMp4/JT1078.FMp4.xml +++ b/src/JT1078.FMp4/JT1078.FMp4.xml @@ -824,22 +824,22 @@ - 4byte 32-26 + 26bit - 4byte 32-28 + 2bit - 4byte 32-30 + 2bit - 4byte 32-32 + 2bit @@ -871,8 +871,14 @@ 可选的 + + + 可选的 + + + 可选的 length:SampleCount