From 1ae68f70eeb82de2d98ae53322d8d8ecfed83954 Mon Sep 17 00:00:00 2001 From: "SmallChi(Koike)" <564952747@qq.com> Date: Mon, 21 Sep 2020 13:30:36 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=A2=9E=E5=8A=A0ftyp=E7=9B=92=E5=AD=90?= =?UTF-8?q?=E7=9A=84=E7=BB=84=E5=8C=85=E6=B5=8B=E8=AF=95=202.=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0Mp4=E7=9A=84=E8=A7=A3=E6=9E=90=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + doc/tools/mp4parse.zip | Bin 0 -> 54941 bytes src/JT1078.FMp4.Test/Boxs/FileTypeBox_Test.cs | 28 ++++++++ src/JT1078.FMp4.Test/UnitTest1.cs | 14 ---- src/JT1078.FMp4/Boxs/FileTypeBox.cs | 25 ++++++-- src/JT1078.FMp4/FullBox.cs | 6 ++ src/JT1078.FMp4/JT1078.FMp4.xml | 27 ++++++++ .../MessagePack/FMp4MessagePackWriter.cs | 26 ++++++++ src/JT1078.FMp4/Mp4Box.cs | 60 ++++++++++++++---- 9 files changed, 157 insertions(+), 30 deletions(-) create mode 100644 doc/tools/mp4parse.zip create mode 100644 src/JT1078.FMp4.Test/Boxs/FileTypeBox_Test.cs delete mode 100644 src/JT1078.FMp4.Test/UnitTest1.cs diff --git a/.gitignore b/.gitignore index 92bb157..47e7f0c 100644 --- a/.gitignore +++ b/.gitignore @@ -333,3 +333,4 @@ ASALocalRun/ /src/JT1078.Flv.Test/H264/JT1078_5.txt /doc/tools/FlvAnalyzer.exe /doc/tools/EasyICE_2.7.0.2 +/doc/tools/mp4parse diff --git a/doc/tools/mp4parse.zip b/doc/tools/mp4parse.zip new file mode 100644 index 0000000000000000000000000000000000000000..95c33d23de65b32d6dfd9478e6665287f8fad69a GIT binary patch literal 54941 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 THY#=ixTu2x6;_ttuCM+N=E01a literal 0 HcmV?d00001 diff --git a/src/JT1078.FMp4.Test/Boxs/FileTypeBox_Test.cs b/src/JT1078.FMp4.Test/Boxs/FileTypeBox_Test.cs new file mode 100644 index 0000000..af1876d --- /dev/null +++ b/src/JT1078.FMp4.Test/Boxs/FileTypeBox_Test.cs @@ -0,0 +1,28 @@ +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 FileTypeBox_Test + { + /// + /// 使用doc/video/demo.mp4 + /// + [Fact] + public void Test1() + { + FileTypeBox fileTypeBox = new FileTypeBox(); + fileTypeBox.MajorBrand = "mp42"; + fileTypeBox.CompatibleBrands.Add("mp42"); + fileTypeBox.CompatibleBrands.Add("isom"); + FMp4MessagePackWriter writer = new MessagePack.FMp4MessagePackWriter(new byte[0x18]); + fileTypeBox.ToBuffer(ref writer); + var hex=writer.FlushAndGetArray().ToHexString(); + Assert.Equal("00000018667479706d703432000000006d70343269736f6d".ToUpper(), hex); + } + } +} diff --git a/src/JT1078.FMp4.Test/UnitTest1.cs b/src/JT1078.FMp4.Test/UnitTest1.cs deleted file mode 100644 index cea9638..0000000 --- a/src/JT1078.FMp4.Test/UnitTest1.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using Xunit; - -namespace JT1078.FMp4.Test -{ - public class UnitTest1 - { - [Fact] - public void Test1() - { - - } - } -} diff --git a/src/JT1078.FMp4/Boxs/FileTypeBox.cs b/src/JT1078.FMp4/Boxs/FileTypeBox.cs index 84b5d52..a0cedd9 100644 --- a/src/JT1078.FMp4/Boxs/FileTypeBox.cs +++ b/src/JT1078.FMp4/Boxs/FileTypeBox.cs @@ -1,4 +1,6 @@ -using System; +using JT1078.FMp4.Interfaces; +using JT1078.FMp4.MessagePack; +using System; using System.Collections.Generic; using System.Runtime.Serialization; using System.Text; @@ -8,7 +10,7 @@ namespace JT1078.FMp4 /// /// ftyp 盒子相当于就是该 mp4 的纲领性说明。即,告诉解码器它的基本解码版本,兼容格式。简而言之,就是用来告诉客户端,该 MP4 的使用的解码标准。通常,ftyp 都是放在 MP4 的开头。 /// - public class FileTypeBox : Mp4Box + public class FileTypeBox : Mp4Box, IFMp4MessagePackFormatter { public FileTypeBox() : base("ftyp") { @@ -22,11 +24,26 @@ namespace JT1078.FMp4 /// 最低兼容版本 /// 4位 /// - public uint MinorVersion { get; set; } + public string MinorVersion { get; set; } = "\0\0\0\0"; /// /// 和MajorBrand类似,通常是针对 MP4 中包含的额外格式,比如,AVC,AAC 等相当于的音视频解码格式。 /// 4位*n /// - public List CompatibleBrands { get; set; } + public List CompatibleBrands { get; set; } = new List(); + + public void ToBuffer(ref FMp4MessagePackWriter writer) + { + ToBuffer(ref writer,out int sizePosition); + writer.WriteASCII(MajorBrand); + writer.WriteASCII(MinorVersion); + if(CompatibleBrands!=null && CompatibleBrands.Count > 0) + { + foreach(var item in CompatibleBrands) + { + writer.WriteASCII(item); + } + } + writer.WriteUInt32Return((uint)(writer.GetCurrentPosition()- sizePosition), sizePosition); + } } } diff --git a/src/JT1078.FMp4/FullBox.cs b/src/JT1078.FMp4/FullBox.cs index 83abdb7..3c9cbc5 100644 --- a/src/JT1078.FMp4/FullBox.cs +++ b/src/JT1078.FMp4/FullBox.cs @@ -11,7 +11,13 @@ namespace JT1078.FMp4 Version = version; Flags = flags; } + /// + /// unsigned int(8) + /// public byte Version { get; set; } + /// + /// bit(24) + /// public uint Flags { get; set; } } } diff --git a/src/JT1078.FMp4/JT1078.FMp4.xml b/src/JT1078.FMp4/JT1078.FMp4.xml index 119cc17..4f8615f 100644 --- a/src/JT1078.FMp4/JT1078.FMp4.xml +++ b/src/JT1078.FMp4/JT1078.FMp4.xml @@ -348,6 +348,16 @@ 日期限制于2000年 + + + unsigned int(8) + + + + + bit(24) + + @@ -362,6 +372,23 @@ + + + 盒子大小 + + + + + 盒子类型 + + + + + + + + + diff --git a/src/JT1078.FMp4/MessagePack/FMp4MessagePackWriter.cs b/src/JT1078.FMp4/MessagePack/FMp4MessagePackWriter.cs index 7d80f21..9dc34df 100644 --- a/src/JT1078.FMp4/MessagePack/FMp4MessagePackWriter.cs +++ b/src/JT1078.FMp4/MessagePack/FMp4MessagePackWriter.cs @@ -43,6 +43,14 @@ namespace JT1078.FMp4.MessagePack BinaryPrimitives.WriteUInt32BigEndian(writer.Free, value); writer.Advance(4); } + + public void WriteASCII(string value) + { + var data = Encoding.ASCII.GetBytes(value); + data.CopyTo(writer.Free); + writer.Advance(data.Length); + } + public void WriteArray(ReadOnlySpan src) { src.CopyTo(writer.Free); @@ -55,6 +63,24 @@ namespace JT1078.FMp4.MessagePack tmp.CopyTo(writer.Free); writer.Advance(count); } + + public void WriteUInt16Return(ushort value, int position) + { + BinaryPrimitives.WriteUInt16BigEndian(writer.Written.Slice(position, 2), value); + } + public void WriteInt32Return(int value, int position) + { + BinaryPrimitives.WriteInt32BigEndian(writer.Written.Slice(position, 4), value); + } + public void WriteUInt32Return(uint value, int position) + { + BinaryPrimitives.WriteUInt32BigEndian(writer.Written.Slice(position, 4), value); + } + public void WriteByteReturn(byte value, int position) + { + writer.Written[position] = value; + } + public int GetCurrentPosition() { return writer.WrittenCount; diff --git a/src/JT1078.FMp4/Mp4Box.cs b/src/JT1078.FMp4/Mp4Box.cs index 3d39821..326f907 100644 --- a/src/JT1078.FMp4/Mp4Box.cs +++ b/src/JT1078.FMp4/Mp4Box.cs @@ -1,4 +1,5 @@ -using System; +using JT1078.FMp4.MessagePack; +using System; using System.Collections.Generic; using System.Text; @@ -6,22 +7,57 @@ namespace JT1078.FMp4 { public abstract class Mp4Box { - public const string UUID = "uuid"; + //public const string UUID = "uuid"; + + public const int FixedSizeLength = 4; + public Mp4Box(string boxType) { BoxType = boxType; } - public Mp4Box(string boxType,string extendedType) + ///// + ///// 不考虑自定义 + ///// + //public Mp4Box(string boxType, string extendedType) + //{ + // BoxType = boxType; + // if (boxType == UUID) + // { + // UserType = extendedType; + // } + //} + /// + /// 盒子大小 + /// + public uint Size { get; set; } + + ///// + ///// 不考虑size==1 + ///// size==1 + ///// + //public ulong SizeLarge { get; set; } + + /// + /// 盒子类型 + /// + public string BoxType { get; set; } + + ///// + ///// 不考虑boxtype==‘uuid' + ///// boxtype==‘uuid’ + ///// int(8)[16] + ///// + //public string UserType { get; set; } + + /// + /// + /// + /// + /// + public void ToBuffer(ref FMp4MessagePackWriter writer, out int sizePosition) { - BoxType = boxType; - if(boxType == UUID) - { - UserType = extendedType; - } + writer.Skip(FixedSizeLength, out sizePosition); + writer.WriteASCII(BoxType); } - public string BoxType { get; set; } - public string UserType { get; set; } - public uint Size { get; set; } - public ulong SizeLarge{get;set;} } }