From 42119c8700ed6a60171526b96d6cf1741a83b27f Mon Sep 17 00:00:00 2001
From: "SmallChi(Koike)" <564952747@qq.com>
Date: Thu, 3 Dec 2020 21:54:35 +0800
Subject: [PATCH] =?UTF-8?q?=E7=BB=84=E8=A3=85=E6=B5=8B=E8=AF=95fmp4?=
=?UTF-8?q?=E7=9B=92=E5=AD=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Boxs/MovieExtendsBox_Test.cs | 42 +++++++
src/JT1078.FMp4.Test/FMp4Box_Test.cs | 112 +++++++++++++++++-
.../TrackFragmentBaseMediaDecodeTimeBox.cs | 2 +-
src/JT1078.FMp4/Boxs/TrackFragmentBox.cs | 8 +-
.../Boxs/TrackFragmentHeaderBox.cs | 12 +-
.../Boxs/TrackFragmentRandomAccessBox.cs | 1 +
src/JT1078.FMp4/JT1078.FMp4.xml | 22 ++++
7 files changed, 185 insertions(+), 14 deletions(-)
create mode 100644 src/JT1078.FMp4.Test/Boxs/MovieExtendsBox_Test.cs
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