diff --git a/src/JT1078.FMp4.Test/Boxs/MovieExtendsBox_Test.cs b/src/JT1078.FMp4.Test/Boxs/MovieExtendsBox_Test.cs new file mode 100644 index 0000000..0846924 --- /dev/null +++ b/src/JT1078.FMp4.Test/Boxs/MovieExtendsBox_Test.cs @@ -0,0 +1,42 @@ +using JT1078.FMp4.MessagePack; +using System; +using System.Collections.Generic; +using System.Text; +using Xunit; +using JT1078.Protocol.Extensions; + +namespace JT1078.FMp4.Test.Boxs +{ + public class MovieExtendsBox_Test + { + /// + /// 使用doc/video/fragmented_demo.mp4 + /// + [Fact] + public void Test1() + { + //000000286d7665780000002074726578000000000000000100000001000000000000000000000000 + //00 00 00 28 + //6d 76 65 78 + //00 00 00 20 + //74 72 65 78 + //00 + //00 00 00 + //00 00 00 01 + //00 00 00 01 + //00 00 00 00 + //00 00 00 00 + //00 00 00 00 + MovieExtendsBox movieExtendsBox = new MovieExtendsBox(); + movieExtendsBox.TrackExtendsBoxs = new List(); + TrackExtendsBox trackExtendsBox1 = new TrackExtendsBox(); + trackExtendsBox1.TrackID = 0x01; + trackExtendsBox1.DefaultSampleDescriptionIndex = 0x01; + movieExtendsBox.TrackExtendsBoxs.Add(trackExtendsBox1); + FMp4MessagePackWriter writer = new MessagePack.FMp4MessagePackWriter(new byte[0x00000028]); + movieExtendsBox.ToBuffer(ref writer); + var hex = writer.FlushAndGetArray().ToHexString(); + Assert.Equal("000000286d7665780000002074726578000000000000000100000001000000000000000000000000".ToUpper(), hex); + } + } +} diff --git a/src/JT1078.FMp4.Test/FMp4Box_Test.cs b/src/JT1078.FMp4.Test/FMp4Box_Test.cs index 3544b6b..b41e2f4 100644 --- a/src/JT1078.FMp4.Test/FMp4Box_Test.cs +++ b/src/JT1078.FMp4.Test/FMp4Box_Test.cs @@ -80,8 +80,7 @@ namespace JT1078.FMp4.Test /// [Fact(DisplayName = "moov_trak_mdia_mdhd")] public void moov_trak_mdia_mdhd_test() - { - + { MediaHeaderBox mediaHeaderBox = new MediaHeaderBox(0, 0); mediaHeaderBox.CreationTime = 0; mediaHeaderBox.ModificationTime = 0; @@ -214,7 +213,114 @@ namespace JT1078.FMp4.Test [Fact(DisplayName = "moov_mvex")] public void trak_mvex_test() { - //todo:moov_mvex + //moov->mvex + MovieExtendsBox movieExtendsBox = new MovieExtendsBox(); + //moov->mvex->trex + movieExtendsBox.TrackExtendsBoxs = new List(); + TrackExtendsBox trackExtendsBox1 = new TrackExtendsBox(); + trackExtendsBox1.TrackID = 0x01; + trackExtendsBox1.DefaultSampleDescriptionIndex = 0x01; + movieExtendsBox.TrackExtendsBoxs.Add(trackExtendsBox1); + FMp4MessagePackWriter writer = new MessagePack.FMp4MessagePackWriter(new byte[0x00000028]); + movieExtendsBox.ToBuffer(ref writer); + var hex = writer.FlushAndGetArray().ToHexString(); + Assert.Equal("000000286d7665780000002074726578000000000000000100000001000000000000000000000000".ToUpper(), hex); + } + /// + /// 使用doc/video/fragmented_demo.mp4 + /// + [Fact(DisplayName = "moov_udta")] + public void moov_udta_test() + { + //todo:moov->udta + } + /// + /// 使用doc/video/fragmented_demo.mp4 + /// + [Fact(DisplayName = "moof")] + public void moof_test() + { + //000006d8747261660000002474666864000000390000000100000000000002fc0000bb80000066ee01010000 + //00 00 06 d8 + //74 72 61 66 + //00 00 00 24 + //74 66 68 64 + //00 + //00 00 39 + //00 00 00 01 + //忽略以下可选数据 + //00 00 00 00 00 00 02 fc + //00 00 bb 80 + //00 00 66 ee + //01 01 00 00 + //moof + MovieFragmentBox movieFragmentBox = new MovieFragmentBox(); + //moof->mfhd + movieFragmentBox.MovieFragmentHeaderBox = new MovieFragmentHeaderBox(); + movieFragmentBox.MovieFragmentHeaderBox.SequenceNumber = 0x01; + //moof->traf + movieFragmentBox.TrackFragmentBox = new TrackFragmentBox(); + movieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox = new TrackFragmentHeaderBox(); + movieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox.TrackID = 0x01; + //moof->tfdt + movieFragmentBox.TrackFragmentBox.TrackFragmentBaseMediaDecodeTimeBox = new TrackFragmentBaseMediaDecodeTimeBox(); + //todo:moof->trun + movieFragmentBox.TrackFragmentBox.TrackRunBox = new TrackRunBox(0, 0x00000305); + } + /// + /// 使用doc/video/fragmented_demo.mp4 + /// + [Fact(DisplayName = "mdat")] + public void mdat_test() + { + //todo:mdat + MediaDataBox mediaDataBox = new MediaDataBox(); + + } + /// + /// 使用doc/video/fragmented_demo.mp4 + /// + [Fact(DisplayName = "mfra")] + public void mfra_test() + { + //000000436d6672610000002b7466726101000000000000010000000000000001000000000000000000000000000002fc010101000000106d66726f0000000000000043 + //00 00 00 43 + //6d 66 72 61 + //00 00 00 2b + //74 66 72 61 + //01 + //00 00 00 + //00 00 00 01 + //00 00 00 00 + //00 00 00 01 + //00 00 00 00 00 00 00 00 + //00 00 00 00 00 00 02 fc + //01 01 01 + //00 00 00 10 + //6d 66 72 6f + //00 + //00 00 00 + //00 00 00 43 + //mfra + MovieFragmentRandomAccessBox movieFragmentRandomAccessBox = new MovieFragmentRandomAccessBox(); + //mfra->tfra + movieFragmentRandomAccessBox.TrackFragmentRandomAccessBox = new TrackFragmentRandomAccessBox(1); + movieFragmentRandomAccessBox.TrackFragmentRandomAccessBox.TrackID = 0x01; + movieFragmentRandomAccessBox.TrackFragmentRandomAccessBox.TrackFragmentRandomAccessInfos = new List(); + TrackFragmentRandomAccessBox.TrackFragmentRandomAccessInfo trackFragmentRandomAccessInfo1 = new TrackFragmentRandomAccessBox.TrackFragmentRandomAccessInfo(); + trackFragmentRandomAccessInfo1.Time = 0; + trackFragmentRandomAccessInfo1.MoofOffset = 0x00000000000002fc; + trackFragmentRandomAccessInfo1.TrafNumber = 0x01; + trackFragmentRandomAccessInfo1.TrunNumber = 0x01; + trackFragmentRandomAccessInfo1.SampleNumber = 0x01; + movieFragmentRandomAccessBox.TrackFragmentRandomAccessBox.TrackFragmentRandomAccessInfos.Add(trackFragmentRandomAccessInfo1); + //mfra->mfro + movieFragmentRandomAccessBox.MovieFragmentRandomAccessOffsetBox = new MovieFragmentRandomAccessOffsetBox(0); + movieFragmentRandomAccessBox.MovieFragmentRandomAccessOffsetBox.MfraSize = 0x00000043; + FMp4MessagePackWriter writer = new MessagePack.FMp4MessagePackWriter(new byte[0x00000043]); + movieFragmentRandomAccessBox.ToBuffer(ref writer); + var hex = writer.FlushAndGetArray().ToHexString(); + Assert.Equal("000000436d6672610000002b7466726101000000000000010000000000000001000000000000000000000000000002fc010101000000106d66726f0000000000000043".ToUpper(), hex); } } } diff --git a/src/JT1078.FMp4/Boxs/TrackFragmentBaseMediaDecodeTimeBox.cs b/src/JT1078.FMp4/Boxs/TrackFragmentBaseMediaDecodeTimeBox.cs index e261a81..b5c14b8 100644 --- a/src/JT1078.FMp4/Boxs/TrackFragmentBaseMediaDecodeTimeBox.cs +++ b/src/JT1078.FMp4/Boxs/TrackFragmentBaseMediaDecodeTimeBox.cs @@ -16,7 +16,7 @@ namespace JT1078.FMp4 /// /// /// - public TrackFragmentBaseMediaDecodeTimeBox(byte version, uint flags=0) : base("tfdt", version, flags) + public TrackFragmentBaseMediaDecodeTimeBox(byte version=1, uint flags=0) : base("tfdt", version, flags) { } public uint BaseMediaDecodeTime { get; set; } diff --git a/src/JT1078.FMp4/Boxs/TrackFragmentBox.cs b/src/JT1078.FMp4/Boxs/TrackFragmentBox.cs index fa1aa2a..c889802 100644 --- a/src/JT1078.FMp4/Boxs/TrackFragmentBox.cs +++ b/src/JT1078.FMp4/Boxs/TrackFragmentBox.cs @@ -52,14 +52,14 @@ namespace JT1078.FMp4 if (SampleDependencyTypeBox != null) { SampleDependencyTypeBox.ToBuffer(ref writer); + } + if (TrackFragmentBaseMediaDecodeTimeBox != null) + { + TrackFragmentBaseMediaDecodeTimeBox.ToBuffer(ref writer); } if (TrackRunBox != null) { TrackRunBox.ToBuffer(ref writer); - } - if (TrackFragmentBaseMediaDecodeTimeBox != null) - { - TrackFragmentBaseMediaDecodeTimeBox.ToBuffer(ref writer); } if (SampleToGroupBox != null) { diff --git a/src/JT1078.FMp4/Boxs/TrackFragmentHeaderBox.cs b/src/JT1078.FMp4/Boxs/TrackFragmentHeaderBox.cs index 83d5573..4e99c22 100644 --- a/src/JT1078.FMp4/Boxs/TrackFragmentHeaderBox.cs +++ b/src/JT1078.FMp4/Boxs/TrackFragmentHeaderBox.cs @@ -23,18 +23,18 @@ namespace JT1078.FMp4 /// tfhd /// /// - public TrackFragmentHeaderBox(uint flags) : this(0, flags) + public TrackFragmentHeaderBox(uint flags=0) : this(0, flags) { } public uint TrackID { get; set; } #region all the following are optional fields - public ulong BaseDataOffset { get; set; } - public uint SampleDescriptionIndex { get; set; } - public uint DefaultSampleDuration { get; set; } - public uint DefaultSampleSize { get; set; } - public uint DefaultSampleFlags { get; set; } + public ulong? BaseDataOffset { get; set; } + public uint? SampleDescriptionIndex { get; set; } + public uint? DefaultSampleDuration { get; set; } + public uint? DefaultSampleSize { get; set; } + public uint? DefaultSampleFlags { get; set; } #endregion public void ToBuffer(ref FMp4MessagePackWriter writer) { diff --git a/src/JT1078.FMp4/Boxs/TrackFragmentRandomAccessBox.cs b/src/JT1078.FMp4/Boxs/TrackFragmentRandomAccessBox.cs index 2ef2dbc..1bf9f1e 100644 --- a/src/JT1078.FMp4/Boxs/TrackFragmentRandomAccessBox.cs +++ b/src/JT1078.FMp4/Boxs/TrackFragmentRandomAccessBox.cs @@ -47,6 +47,7 @@ namespace JT1078.FMp4 writer.WriteUInt32((uint)(LengthSizeOfSampleNum | (LengthSizeOfTrunNum << 2) | (LengthSizeOfTrafNum << 4))); if(TrackFragmentRandomAccessInfos!=null && TrackFragmentRandomAccessInfos.Count > 0) { + writer.WriteUInt32((uint)TrackFragmentRandomAccessInfos.Count); foreach (var item in TrackFragmentRandomAccessInfos) { if (Version == 1) diff --git a/src/JT1078.FMp4/JT1078.FMp4.xml b/src/JT1078.FMp4/JT1078.FMp4.xml index fc38cd5..fed89c4 100644 --- a/src/JT1078.FMp4/JT1078.FMp4.xml +++ b/src/JT1078.FMp4/JT1078.FMp4.xml @@ -377,6 +377,16 @@ mvex + + + mehd + + + + + trex + + mehd @@ -763,6 +773,18 @@ mdia + + + trex + + + + + trex + + + + tfdt