您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

221 行
11 KiB

  1. using JT1078.FMp4.MessagePack;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Text;
  5. using Xunit;
  6. using JT1078.Protocol.Extensions;
  7. using JT1078.FMp4.Enums;
  8. using JT1078.FMp4.Samples;
  9. namespace JT1078.FMp4.Test
  10. {
  11. public class FMp4Box_Test
  12. {
  13. /// <summary>
  14. /// 使用doc/video/fragmented_demo.mp4
  15. /// </summary>
  16. [Fact(DisplayName = "ftyp")]
  17. public void ftyp_test()
  18. {
  19. var MinorVersion = Encoding.ASCII.GetString(new byte[4] { 0,0,2,0});
  20. FileTypeBox fileTypeBox = new FileTypeBox();
  21. fileTypeBox.MajorBrand = "isom";
  22. fileTypeBox.MinorVersion = "\0\0\u0002\0";
  23. fileTypeBox.CompatibleBrands.Add("isom");
  24. fileTypeBox.CompatibleBrands.Add("iso2");
  25. fileTypeBox.CompatibleBrands.Add("avc1");
  26. fileTypeBox.CompatibleBrands.Add("iso6");
  27. fileTypeBox.CompatibleBrands.Add("mp41");
  28. FMp4MessagePackWriter writer = new MessagePack.FMp4MessagePackWriter(new byte[0x25]);
  29. fileTypeBox.ToBuffer(ref writer);
  30. var hex = writer.FlushAndGetArray().ToHexString();
  31. Assert.Equal("000000246674797069736f6d0000020069736f6d69736f326176633169736f366d703431".ToUpper(), hex);
  32. }
  33. /// <summary>
  34. /// 使用doc/video/fragmented_demo.mp4
  35. /// </summary>
  36. [Fact(DisplayName = "moov_mvhd")]
  37. public void moov_mvhd_test()
  38. {
  39. MovieHeaderBox movieHeaderBox = new MovieHeaderBox(0);
  40. movieHeaderBox.CreationTime = 0;
  41. movieHeaderBox.ModificationTime = 0;
  42. movieHeaderBox.Timescale = 1000;
  43. movieHeaderBox.Duration = 0;
  44. movieHeaderBox.NextTrackID = 2;
  45. FMp4MessagePackWriter writer = new MessagePack.FMp4MessagePackWriter(new byte[10240]);
  46. movieHeaderBox.ToBuffer(ref writer);
  47. var hex = writer.FlushAndGetArray().ToHexString();
  48. Assert.Equal("0000006c6d766864000000000000000000000000000003e8000000000001000001000000000000000000000000010000000000000000000000000000000100000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002".ToUpper(), hex);
  49. }
  50. /// <summary>
  51. /// 使用doc/video/fragmented_demo.mp4
  52. /// </summary>
  53. [Fact(DisplayName = "moov_trak_tkhd")]
  54. public void moov_trak_tkhd_test()
  55. {
  56. TrackHeaderBox trackHeaderBox = new TrackHeaderBox(0,3);
  57. trackHeaderBox.CreationTime = 0;
  58. trackHeaderBox.ModificationTime = 0;
  59. trackHeaderBox.TrackID = 1;
  60. trackHeaderBox.Duration = 0;
  61. trackHeaderBox.Width = 544u;
  62. trackHeaderBox.Height = 960u;
  63. FMp4MessagePackWriter writer = new MessagePack.FMp4MessagePackWriter(new byte[10240]);
  64. trackHeaderBox.ToBuffer(ref writer);
  65. var hex = writer.FlushAndGetArray().ToHexString();
  66. Assert.Equal("0000005C746B68640000000300000000000000000000000100000000000000000000000000000000000000000000000000010000000000000000000000000000000100000000000000000000000000004000000000000220000003C0".ToUpper(), hex);
  67. }
  68. /// <summary>
  69. /// 使用doc/video/fragmented_demo.mp4
  70. /// </summary>
  71. [Fact(DisplayName = "moov_trak_mdia")]
  72. public void moov_trak_mdia_test()
  73. {
  74. }
  75. /// <summary>
  76. /// 使用doc/video/fragmented_demo.mp4
  77. /// </summary>
  78. [Fact(DisplayName = "moov_trak_mdia_mdhd")]
  79. public void moov_trak_mdia_mdhd_test()
  80. {
  81. MediaHeaderBox mediaHeaderBox = new MediaHeaderBox(0, 0);
  82. mediaHeaderBox.CreationTime = 0;
  83. mediaHeaderBox.ModificationTime = 0;
  84. mediaHeaderBox.Timescale = 0x00124f80;
  85. mediaHeaderBox.Duration = 0;
  86. mediaHeaderBox.Language = "und";
  87. FMp4MessagePackWriter writer = new MessagePack.FMp4MessagePackWriter(new byte[10240]);
  88. mediaHeaderBox.ToBuffer(ref writer);
  89. var hex = writer.FlushAndGetArray().ToHexString();
  90. //000000206d64686400000000000000000000000000124f800000000055c40000
  91. //00000020
  92. //6d646864
  93. //00000000
  94. //00000000
  95. //00000000
  96. //00124f80
  97. //00000000
  98. //55c4
  99. //0000
  100. Assert.Equal("000000206d64686400000000000000000000000000124f800000000055c40000".ToUpper(), hex);
  101. }
  102. /// <summary>
  103. /// 使用doc/video/fragmented_demo.mp4
  104. /// </summary>
  105. [Fact(DisplayName = "moov_trak_mdia_hdlr")]
  106. public void moov_trak_mdia_hdlr_test()
  107. {
  108. HandlerBox handlerBox = new HandlerBox(0, 0);
  109. handlerBox.HandlerType = Enums.HandlerType.vide;
  110. handlerBox.Name = "VideoHandler";
  111. FMp4MessagePackWriter writer = new MessagePack.FMp4MessagePackWriter(new byte[10240]);
  112. handlerBox.ToBuffer(ref writer);
  113. var hex = writer.FlushAndGetArray().ToHexString();
  114. Assert.Equal("0000002C68646C72000000000000000076696465000000000000000000000000566964656F48616E646C6572".ToUpper(), hex);
  115. }
  116. /// <summary>
  117. /// 使用doc/video/fragmented_demo.mp4
  118. /// </summary>
  119. [Fact(DisplayName = "moov_trak_mdia_hdlr_minf")]
  120. public void moov_trak_mdia_hdlr_minf_test()
  121. {
  122. HandlerBox handlerBox = new HandlerBox(0, 0);
  123. handlerBox.HandlerType = Enums.HandlerType.vide;
  124. handlerBox.Name = "VideoHandler\0";
  125. FMp4MessagePackWriter writer = new MessagePack.FMp4MessagePackWriter(new byte[10240]);
  126. handlerBox.ToBuffer(ref writer);
  127. var hex = writer.FlushAndGetArray().ToHexString();
  128. Assert.Equal("0000002D68646C72000000000000000076696465000000000000000000000000566964656F48616E646C657200".ToUpper(), hex);
  129. }
  130. /// <summary>
  131. /// 使用doc/video/fragmented_demo.mp4
  132. /// </summary>
  133. [Fact(DisplayName = "moov_trak_mdia_hdlr_minf_vmhd")]
  134. public void moov_trak_mdia_hdlr_minf_vmhd_test()
  135. {
  136. VideoMediaHeaderBox videoMediaHeaderBox = new VideoMediaHeaderBox();
  137. FMp4MessagePackWriter writer = new MessagePack.FMp4MessagePackWriter(new byte[10240]);
  138. videoMediaHeaderBox.ToBuffer(ref writer);
  139. var hex = writer.FlushAndGetArray().ToHexString();
  140. Assert.Equal("00000014766d6864000000010000000000000000".ToUpper(), hex);
  141. }
  142. /// <summary>
  143. /// 使用doc/video/fragmented_demo.mp4
  144. /// </summary>
  145. [Fact(DisplayName = "moov_trak_mdia_hdlr_minf_dinf")]
  146. public void moov_trak_mdia_hdlr_minf_dinf_test()
  147. {
  148. DataInformationBox dataInformationBox = new DataInformationBox();
  149. DataReferenceBox dataReferenceBox = new DataReferenceBox();
  150. dataReferenceBox.DataEntryBoxes = new List<DataEntryBox>();
  151. dataReferenceBox.DataEntryBoxes.Add(new DataEntryUrlBox(version: 0, flags: 1));
  152. dataInformationBox.DataReferenceBox = dataReferenceBox;
  153. FMp4MessagePackWriter writer = new MessagePack.FMp4MessagePackWriter(new byte[10240]);
  154. dataInformationBox.ToBuffer(ref writer);
  155. var hex = writer.FlushAndGetArray().ToHexString();
  156. //0000002464696e660000001c6472656600000000000000010000000c75726c2000000001
  157. Assert.Equal("0000002464696e660000001c6472656600000000000000010000000c75726c2000000001".ToUpper(), hex);
  158. }
  159. /// <summary>
  160. /// 使用doc/video/fragmented_demo.mp4
  161. /// </summary>
  162. [Fact(DisplayName = "moov_trak_mdia_hdlr_minf_stbl")]
  163. public void moov_trak_mdia_hdlr_minf_stbl_test()
  164. {
  165. //000000e17374626c000000957374736400000000000000010000008561766331000000000000000100000000000000000000000000000000022003c0004800000048000000000000000100000000000000000000000000000000000000000000000000000000000000000018ffff0000002f617663430164001fffe100176764001facd940881e684000f4240037b40883c60c658001000568efbcb0000000001073747473000000000000000000000010737473630000000000000000000000147374737a000000000000000000000000000000107374636f0000000000000000
  166. //stbl
  167. SampleTableBox sampleTableBox = new SampleTableBox();
  168. //stbl->stsd
  169. SampleDescriptionBox sampleDescriptionBox = new SampleDescriptionBox(HandlerType.none);
  170. //stbl->stsd->avc1
  171. AVC1SampleEntry aVC1SampleEntry = new AVC1SampleEntry();
  172. aVC1SampleEntry.Width = 0x0220;
  173. aVC1SampleEntry.Height = 0x03c0;
  174. //stbl->stsd->avc1->avcc
  175. AVCConfigurationBox aVCConfigurationBox = new AVCConfigurationBox();
  176. aVCConfigurationBox.AVCProfileIndication = 0x64;
  177. aVCConfigurationBox.ProfileCompatibility = 0;
  178. aVCConfigurationBox.AVCLevelIndication = 0x1f;
  179. aVCConfigurationBox.LengthSizeMinusOne = 0xff;
  180. aVCConfigurationBox.SPSs = new List<byte[]>()
  181. {
  182. "6764001facd940881e684000f4240037b40883c60c6580".ToHexBytes()
  183. };
  184. aVCConfigurationBox.PPSs = new List<byte[]>()
  185. {
  186. "68efbcb000".ToHexBytes()
  187. };
  188. aVC1SampleEntry.AVCConfigurationBox = aVCConfigurationBox;
  189. sampleDescriptionBox.SampleEntries = new List<SampleEntry>()
  190. {
  191. aVC1SampleEntry
  192. };
  193. sampleTableBox.SampleDescriptionBox = sampleDescriptionBox;
  194. //stbl->stts
  195. sampleTableBox.TimeToSampleBox = new TimeToSampleBox();
  196. //stbl->stsc
  197. sampleTableBox.SampleToChunkBox = new SampleToChunkBox();
  198. //stbl->stsz
  199. sampleTableBox.SampleSizeBox = new SampleSizeBox();
  200. //stbl->stco
  201. sampleTableBox.ChunkOffsetBox = new ChunkOffsetBox();
  202. FMp4MessagePackWriter writer = new MessagePack.FMp4MessagePackWriter(new byte[0x000000e1]);
  203. sampleTableBox.ToBuffer(ref writer);
  204. var hex = writer.FlushAndGetArray().ToHexString();
  205. Assert.Equal("000000e17374626c000000957374736400000000000000010000008561766331000000000000000100000000000000000000000000000000022003c0004800000048000000000000000100000000000000000000000000000000000000000000000000000000000000000018ffff0000002f617663430164001fffe100176764001facd940881e684000f4240037b40883c60c658001000568efbcb0000000001073747473000000000000000000000010737473630000000000000000000000147374737a000000000000000000000000000000107374636f0000000000000000".ToUpper(), hex);
  206. }
  207. /// <summary>
  208. /// 使用doc/video/fragmented_demo.mp4
  209. /// </summary>
  210. [Fact(DisplayName = "moov_mvex")]
  211. public void trak_mvex_test()
  212. {
  213. //todo:moov_mvex
  214. }
  215. }
  216. }