void ReleaseDesignerOutlets() { if (FileMimeTypeLabel != null) { FileMimeTypeLabel.Dispose(); FileMimeTypeLabel = null; } if (FileSizeField != null) { FileSizeField.Dispose(); FileSizeField = null; } if (FileSizeUnitSegment != null) { FileSizeUnitSegment.Dispose(); FileSizeUnitSegment = null; } if (FileTypeBox != null) { FileTypeBox.Dispose(); FileTypeBox = null; } if (ProgressBar != null) { ProgressBar.Dispose(); ProgressBar = null; } }
public void InitializeForWriting(List <IsochronousTrackInfo> mediaTracks) { string[] brands = new string[3]; brands[0] = "isml"; brands[1] = "piff"; brands[2] = "iso2"; this.ftb = new FileTypeBox(brands); // overwrite base class's ftb this.ftb.MinorVersion = 1; uint[] matrix = new uint[9]; matrix[0] = 0x10000; // 1.0 matrix[4] = 0x10000; // 1.0 matrix[8] = 0x40000000; // 1.0 (see description of RenderMatrix class) this.mmb = new MovieMetadataBox(mediaTracks, 1.0f, 1.0f, matrix); //CreateTracksForWriting<ISMVTrackFormat>(mediaTracks); // create tracks with ISMVTrackFormat // we can finalize the ftyp and moov boxes here, because they shouldn't change when moofs (fragments) are added //this.ftb.Write(m_writer); this.mmb.FinalizeBox(); //this.mmb.Write(m_writer); //this.CurrMDatOffset = this.ftb.Size + this.mmb.Size; // for fragmented files, CurrMDatOffset is really the file offset InitializeForWriting(mediaTracks); // create our tracks (partial moov boxes, which should still exist, even for fragmented tracks) }
public AvifWriter(IReadOnlyList <CompressedAV1Image> colorImages, IReadOnlyList <CompressedAV1Image> alphaImages, AvifMetadata metadata, ImageGridMetadata imageGridMetadata, YUVChromaSubsampling chromaSubsampling, ColorInformationBox colorInformationBox, ProgressEventHandler progressEventHandler, uint progressDone, uint progressTotal, IByteArrayPool arrayPool) { this.state = new AvifWriterState(colorImages, alphaImages, imageGridMetadata, metadata, arrayPool); this.arrayPool = arrayPool; this.colorImageIsGrayscale = chromaSubsampling == YUVChromaSubsampling.Subsampling400; this.colorInformationBox = colorInformationBox; this.progressCallback = progressEventHandler; this.progressDone = progressDone; this.progressTotal = progressTotal; this.fileTypeBox = new FileTypeBox(chromaSubsampling); this.metaBox = new MetaBox(this.state.PrimaryItemId, this.state.Items.Count, this.state.MediaDataBoxContentSize > uint.MaxValue, this.state.ItemDataBox); PopulateMetaBox(); }
public override void ViewDidLoad() { base.ViewDidLoad(); // Do any additional setup after loading the view. FileTypeBox.AddItem("Select File Type"); foreach (Format format in formats) { FileTypeBox.AddItem(format.GetFormatName()); } ProgressBar.MinValue = 0; ProgressBar.MaxValue = 100; }
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); }
/// <summary> /// Creates from scratch a JPEG2000 conforming file /// with a JPEG2000 codestream skeleton. /// /// </summary> /// <param name="siz"></param> /// <param name="cod"></param> /// <param name="qcd"></param> /// <param name="reservedTileparts"></param> /// <param name="stream"></param> /// <returns></returns> public static Jp2File Create( IEnumerable <MarkerSegment> markers, int reservedTileparts, bool hasPropertyRights, Stream stream) { var sizs = markers.Where(mrk => mrk.Type == MarkerType.SIZ); var cods = markers.Where(mrk => mrk.Type == MarkerType.SIZ); var qcds = markers.Where(mrk => mrk.Type == MarkerType.QCD); if (!sizs.Any() || !cods.Any() || !qcds.Any()) { throw new ArgumentException( "Must supply SIZ, COD and QCD markers"); } SizMarker siz = sizs.First() as SizMarker; CodMarker cod = cods.First() as CodMarker; QcdMarker qcd = qcds.First() as QcdMarker; ColorSpace colorspace = GetColorspace(siz); Jp2Box signBox = new Jp2SignatureBox(); Jp2Box ftypBox = new FileTypeBox(); Jp2Box jp2hBox = new Jp2Box((uint)BoxTypes.JP2HeaderBox); ImageHeaderBox ihdrBox = new ImageHeaderBox(siz, hasPropertyRights); Jp2Box colrBox = new ColorspaceSpecificationBox(colorspace); var codestream = new JP2Codestream(markers, reservedTileparts); var csBox = new ContiguousCodestreamBox(codestream); if (ihdrBox.BitsPerComponent == ImageHeaderBox.USE_BPC_BOX) { throw new NotSupportedException( "Create image with bit per component specification box"); } jp2hBox.Add(new List <Jp2Box> { ihdrBox, colrBox }); Jp2File jp2File = new Jp2File(stream, new List <Jp2Box> { signBox, ftypBox, jp2hBox, csBox }); return(jp2File); }
public void ftyp_test() { var MinorVersion = Encoding.ASCII.GetString(new byte[4] { 0, 0, 2, 0 }); FileTypeBox fileTypeBox = new FileTypeBox(); fileTypeBox.MajorBrand = "isom"; fileTypeBox.MinorVersion = "\0\0\u0002\0"; fileTypeBox.CompatibleBrands.Add("isom"); fileTypeBox.CompatibleBrands.Add("iso2"); fileTypeBox.CompatibleBrands.Add("avc1"); fileTypeBox.CompatibleBrands.Add("iso6"); fileTypeBox.CompatibleBrands.Add("mp41"); FMp4MessagePackWriter writer = new MessagePack.FMp4MessagePackWriter(new byte[0x25]); fileTypeBox.ToBuffer(ref writer); var hex = writer.FlushAndGetArray().ToHexString(); Assert.Equal("000000246674797069736f6d0000020069736f6d69736f326176633169736f366d703431".ToUpper(), hex); }
private void Parse() { while (this.reader.Position < this.reader.Length) { Box header = new Box(this.reader); if (header.Type == BoxTypes.FileType) { if (this.fileTypeBox != null) { ExceptionUtil.ThrowFormatException("The file contains multiple FileType boxes."); } EndianBinaryReaderSegment segment = this.reader.CreateSegment(header.DataStartOffset, header.DataLength); this.fileTypeBox = new FileTypeBox(segment, header); this.fileTypeBox.CheckForAvifCompatibility(); } else if (header.Type == BoxTypes.Meta) { if (this.metaBox != null) { ExceptionUtil.ThrowFormatException("The file contains multiple Meta boxes."); } EndianBinaryReaderSegment segment = this.reader.CreateSegment(header.DataStartOffset, header.DataLength); this.metaBox = new MetaBox(segment, header); } else { // Skip any other boxes this.reader.Position = header.End; } } CheckForRequiredBoxes(); }
public static string ToString(FileTypeBox box) { return(string.Format("type: {0}, size: 0x{1:x2} ({1:#,#})", GetStringFromUInt32((uint)box.Box.Type), box.Box.Size)); }
public void Test3() { H264Decoder decoder = new H264Decoder(); var packages = ParseNALUTests(); //10M FMp4MessagePackWriter writer = new FMp4MessagePackWriter(new byte[10 * 1024 * 1024]); var filepath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "H264", "JT1078_3.mp4"); if (File.Exists(filepath)) { File.Delete(filepath); } using var fileStream = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.Write); var jT1078Package = packages.FirstOrDefault(); var nalus = decoder.ParseNALU(jT1078Package); var spsNALU = nalus.FirstOrDefault(n => n.NALUHeader.NalUnitType == 7); //SPS spsNALU.RawData = decoder.DiscardEmulationPreventionBytes(spsNALU.RawData); var ppsNALU = nalus.FirstOrDefault(n => n.NALUHeader.NalUnitType == 8); ppsNALU.RawData = decoder.DiscardEmulationPreventionBytes(ppsNALU.RawData); ExpGolombReader h264GolombReader = new ExpGolombReader(spsNALU.RawData); var spsInfo = h264GolombReader.ReadSPS(); //ftyp FileTypeBox fileTypeBox = new FileTypeBox(); fileTypeBox.MajorBrand = "isom"; fileTypeBox.MinorVersion = "\0\0\u0002\0"; fileTypeBox.CompatibleBrands.Add("isom"); fileTypeBox.CompatibleBrands.Add("iso6"); fileTypeBox.CompatibleBrands.Add("iso2"); fileTypeBox.CompatibleBrands.Add("avc1"); fileTypeBox.CompatibleBrands.Add("mp41"); //moov MovieBox movieBox = new MovieBox(); movieBox.MovieHeaderBox = new MovieHeaderBox(0, 0); movieBox.MovieHeaderBox.CreationTime = 0; movieBox.MovieHeaderBox.ModificationTime = 0; movieBox.MovieHeaderBox.Duration = 0; movieBox.MovieHeaderBox.Timescale = 1000; movieBox.MovieHeaderBox.NextTrackID = 2; movieBox.TrackBox = new TrackBox(); movieBox.TrackBox.TrackHeaderBox = new TrackHeaderBox(0, 3); movieBox.TrackBox.TrackHeaderBox.CreationTime = 0; movieBox.TrackBox.TrackHeaderBox.ModificationTime = 0; movieBox.TrackBox.TrackHeaderBox.TrackID = 1; movieBox.TrackBox.TrackHeaderBox.Duration = 0; movieBox.TrackBox.TrackHeaderBox.TrackIsAudio = false; movieBox.TrackBox.TrackHeaderBox.Width = (uint)spsInfo.width; movieBox.TrackBox.TrackHeaderBox.Height = (uint)spsInfo.height; movieBox.TrackBox.MediaBox = new MediaBox(); movieBox.TrackBox.MediaBox.MediaHeaderBox = new MediaHeaderBox(); movieBox.TrackBox.MediaBox.MediaHeaderBox.CreationTime = 0; movieBox.TrackBox.MediaBox.MediaHeaderBox.ModificationTime = 0; movieBox.TrackBox.MediaBox.MediaHeaderBox.Timescale = 1200000; movieBox.TrackBox.MediaBox.MediaHeaderBox.Duration = 0; movieBox.TrackBox.MediaBox.HandlerBox = new HandlerBox(); movieBox.TrackBox.MediaBox.HandlerBox.HandlerType = HandlerType.vide; movieBox.TrackBox.MediaBox.HandlerBox.Name = "VideoHandler"; movieBox.TrackBox.MediaBox.MediaInformationBox = new MediaInformationBox(); movieBox.TrackBox.MediaBox.MediaInformationBox.VideoMediaHeaderBox = new VideoMediaHeaderBox(); movieBox.TrackBox.MediaBox.MediaInformationBox.DataInformationBox = new DataInformationBox(); movieBox.TrackBox.MediaBox.MediaInformationBox.DataInformationBox.DataReferenceBox = new DataReferenceBox(); movieBox.TrackBox.MediaBox.MediaInformationBox.DataInformationBox.DataReferenceBox.DataEntryBoxes = new List <DataEntryBox>(); movieBox.TrackBox.MediaBox.MediaInformationBox.DataInformationBox.DataReferenceBox.DataEntryBoxes.Add(new DataEntryUrlBox(1)); movieBox.TrackBox.MediaBox.MediaInformationBox.SampleTableBox = new SampleTableBox(); movieBox.TrackBox.MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox = new SampleDescriptionBox(movieBox.TrackBox.MediaBox.HandlerBox.HandlerType); movieBox.TrackBox.MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.SampleEntries = new List <SampleEntry>(); AVC1SampleEntry avc1 = new AVC1SampleEntry(); avc1.AVCConfigurationBox = new AVCConfigurationBox(); //h264 avc1.Width = (ushort)movieBox.TrackBox.TrackHeaderBox.Width; avc1.Height = (ushort)movieBox.TrackBox.TrackHeaderBox.Height; avc1.AVCConfigurationBox.AVCLevelIndication = spsInfo.levelIdc; avc1.AVCConfigurationBox.AVCProfileIndication = spsInfo.profileIdc; avc1.AVCConfigurationBox.ProfileCompatibility = (byte)spsInfo.profileCompat; avc1.AVCConfigurationBox.PPSs = new List <byte[]>() { ppsNALU.RawData }; avc1.AVCConfigurationBox.SPSs = new List <byte[]>() { spsNALU.RawData }; movieBox.TrackBox.MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.SampleEntries.Add(avc1); movieBox.TrackBox.MediaBox.MediaInformationBox.SampleTableBox.TimeToSampleBox = new TimeToSampleBox(); movieBox.TrackBox.MediaBox.MediaInformationBox.SampleTableBox.SampleToChunkBox = new SampleToChunkBox(); movieBox.TrackBox.MediaBox.MediaInformationBox.SampleTableBox.SampleSizeBox = new SampleSizeBox(); movieBox.TrackBox.MediaBox.MediaInformationBox.SampleTableBox.ChunkOffsetBox = new ChunkOffsetBox(); movieBox.MovieExtendsBox = new MovieExtendsBox(); movieBox.MovieExtendsBox.TrackExtendsBoxs = new List <TrackExtendsBox>(); TrackExtendsBox trex = new TrackExtendsBox(); trex.TrackID = 1; trex.DefaultSampleDescriptionIndex = 1; trex.DefaultSampleDuration = 0; trex.DefaultSampleSize = 0; trex.DefaultSampleFlags = 0; movieBox.MovieExtendsBox.TrackExtendsBoxs.Add(trex); fileTypeBox.ToBuffer(ref writer); movieBox.ToBuffer(ref writer); //fragment moof n foreach (var package in packages) { ulong moofOffset = (ulong)writer.GetCurrentPosition(); var package_nalus = decoder.ParseNALU(package); FragmentBox fragmentBox = new FragmentBox(); fragmentBox.MovieFragmentBox = new MovieFragmentBox(); fragmentBox.MovieFragmentBox.MovieFragmentHeaderBox = new MovieFragmentHeaderBox(); fragmentBox.MovieFragmentBox.MovieFragmentHeaderBox.SequenceNumber = package.SN; fragmentBox.MovieFragmentBox.TrackFragmentBox = new TrackFragmentBox(); fragmentBox.MovieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox = new TrackFragmentHeaderBox(0x39); fragmentBox.MovieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox.TrackID = 1; fragmentBox.MovieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox.BaseDataOffset = moofOffset; fragmentBox.MovieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox.DefaultSampleDuration = 48000; fragmentBox.MovieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox.DefaultSampleSize = (uint)package.Bodies.Length; fragmentBox.MovieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox.DefaultSampleFlags = 0x1010000; fragmentBox.MovieFragmentBox.TrackFragmentBox.TrackFragmentBaseMediaDecodeTimeBox = new TrackFragmentBaseMediaDecodeTimeBox(); fragmentBox.MovieFragmentBox.TrackFragmentBox.TrackFragmentBaseMediaDecodeTimeBox.BaseMediaDecodeTime = package.Timestamp * 1000; //trun fragmentBox.MovieFragmentBox.TrackFragmentBox.TrackRunBox = new TrackRunBox(flags: 0x5); fragmentBox.MovieFragmentBox.TrackFragmentBox.TrackRunBox.FirstSampleFlags = 0; fragmentBox.MovieFragmentBox.TrackFragmentBox.TrackRunBox.TrackRunInfos = new List <TrackRunBox.TrackRunInfo>(); fragmentBox.MovieFragmentBox.TrackFragmentBox.TrackRunBox.TrackRunInfos.Add(new TrackRunBox.TrackRunInfo()); fragmentBox.MediaDataBox = new MediaDataBox(); fragmentBox.MediaDataBox.Data = package_nalus.Select(s => s.RawData).ToList(); fragmentBox.ToBuffer(ref writer); } var buffer = writer.FlushAndGetArray(); fileStream.Write(buffer); fileStream.Close(); }
public void Test1() { var jT1078Package = ParseNALUTest(); H264Decoder decoder = new H264Decoder(); var nalus = decoder.ParseNALU(jT1078Package); var spsNALU = nalus.FirstOrDefault(n => n.NALUHeader.NalUnitType == 7); //SPS spsNALU.RawData = decoder.DiscardEmulationPreventionBytes(spsNALU.RawData); var ppsNALU = nalus.FirstOrDefault(n => n.NALUHeader.NalUnitType == 8); ppsNALU.RawData = decoder.DiscardEmulationPreventionBytes(ppsNALU.RawData); //ftyp FileTypeBox fileTypeBox = new FileTypeBox(); fileTypeBox.MajorBrand = "isom"; fileTypeBox.MinorVersion = "\0\0\u0002\0"; fileTypeBox.CompatibleBrands.Add("isom"); fileTypeBox.CompatibleBrands.Add("iso6"); fileTypeBox.CompatibleBrands.Add("iso2"); fileTypeBox.CompatibleBrands.Add("avc1"); fileTypeBox.CompatibleBrands.Add("mp41"); //moov MovieBox movieBox = new MovieBox(); movieBox.MovieHeaderBox = new MovieHeaderBox(0, 0); movieBox.MovieHeaderBox.CreationTime = 0; movieBox.MovieHeaderBox.ModificationTime = 0; movieBox.MovieHeaderBox.Duration = 0; movieBox.MovieHeaderBox.Timescale = 1000; movieBox.MovieHeaderBox.NextTrackID = 2; movieBox.TrackBox = new TrackBox(); movieBox.TrackBox.TrackHeaderBox = new TrackHeaderBox(0, 3); movieBox.TrackBox.TrackHeaderBox.CreationTime = 0; movieBox.TrackBox.TrackHeaderBox.ModificationTime = 0; movieBox.TrackBox.TrackHeaderBox.TrackID = 1; movieBox.TrackBox.TrackHeaderBox.Duration = 0; movieBox.TrackBox.TrackHeaderBox.TrackIsAudio = false; movieBox.TrackBox.TrackHeaderBox.Width = 352; movieBox.TrackBox.TrackHeaderBox.Height = 288; movieBox.TrackBox.MediaBox = new MediaBox(); movieBox.TrackBox.MediaBox.MediaHeaderBox = new MediaHeaderBox(); movieBox.TrackBox.MediaBox.MediaHeaderBox.CreationTime = 0; movieBox.TrackBox.MediaBox.MediaHeaderBox.ModificationTime = 0; movieBox.TrackBox.MediaBox.MediaHeaderBox.Timescale = 1200000; movieBox.TrackBox.MediaBox.MediaHeaderBox.Duration = 0; movieBox.TrackBox.MediaBox.HandlerBox = new HandlerBox(); movieBox.TrackBox.MediaBox.HandlerBox.HandlerType = HandlerType.vide; movieBox.TrackBox.MediaBox.HandlerBox.Name = "VideoHandler"; movieBox.TrackBox.MediaBox.MediaInformationBox = new MediaInformationBox(); movieBox.TrackBox.MediaBox.MediaInformationBox.VideoMediaHeaderBox = new VideoMediaHeaderBox(); movieBox.TrackBox.MediaBox.MediaInformationBox.DataInformationBox = new DataInformationBox(); movieBox.TrackBox.MediaBox.MediaInformationBox.DataInformationBox.DataReferenceBox = new DataReferenceBox(); movieBox.TrackBox.MediaBox.MediaInformationBox.DataInformationBox.DataReferenceBox.DataEntryBoxes = new List <DataEntryBox>(); movieBox.TrackBox.MediaBox.MediaInformationBox.DataInformationBox.DataReferenceBox.DataEntryBoxes.Add(new DataEntryUrlBox(1)); movieBox.TrackBox.MediaBox.MediaInformationBox.SampleTableBox = new SampleTableBox(); movieBox.TrackBox.MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox = new SampleDescriptionBox(movieBox.TrackBox.MediaBox.HandlerBox.HandlerType); movieBox.TrackBox.MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.SampleEntries = new List <SampleEntry>(); AVC1SampleEntry avc1 = new AVC1SampleEntry(); avc1.AVCConfigurationBox = new AVCConfigurationBox(); //h264 avc1.Width = (ushort)movieBox.TrackBox.TrackHeaderBox.Width; avc1.Height = (ushort)movieBox.TrackBox.TrackHeaderBox.Height; //MSE codecs avc1.4D0014 //4D 00 14 //AVCProfileIndication profile_compability AVCLevelIndication avc1.AVCConfigurationBox.AVCLevelIndication = 20; avc1.AVCConfigurationBox.AVCProfileIndication = 77; avc1.AVCConfigurationBox.PPSs = new List <byte[]>() { ppsNALU.RawData }; avc1.AVCConfigurationBox.SPSs = new List <byte[]>() { spsNALU.RawData }; avc1.AVCConfigurationBox.ProfileCompatibility = 0; movieBox.TrackBox.MediaBox.MediaInformationBox.SampleTableBox.SampleDescriptionBox.SampleEntries.Add(avc1); movieBox.TrackBox.MediaBox.MediaInformationBox.SampleTableBox.TimeToSampleBox = new TimeToSampleBox(); movieBox.TrackBox.MediaBox.MediaInformationBox.SampleTableBox.SampleToChunkBox = new SampleToChunkBox(); movieBox.TrackBox.MediaBox.MediaInformationBox.SampleTableBox.SampleSizeBox = new SampleSizeBox(); movieBox.TrackBox.MediaBox.MediaInformationBox.SampleTableBox.ChunkOffsetBox = new ChunkOffsetBox(); movieBox.MovieExtendsBox = new MovieExtendsBox(); movieBox.MovieExtendsBox.TrackExtendsBoxs = new List <TrackExtendsBox>(); TrackExtendsBox trex = new TrackExtendsBox(); trex.TrackID = 1; trex.DefaultSampleDescriptionIndex = 1; trex.DefaultSampleDuration = 0; trex.DefaultSampleSize = 0; trex.DefaultSampleFlags = 0; movieBox.MovieExtendsBox.TrackExtendsBoxs.Add(trex); //用户自定义可以不用 //movieBox.UserDataBox = new UserDataBox(); //movieBox.UserDataBox.Data = "0000005a6d657461000000000000002168646c7200000000000000006d6469726170706c0000000000000000000000002d696c737400000025a9746f6f0000001d6461746100000001000000004c61766635382e34352e313030".ToHexBytes(); //fragment moof n List <FragmentBox> moofs = new List <FragmentBox>(); FragmentBox fragmentBox = new FragmentBox(); fragmentBox.MovieFragmentBox = new MovieFragmentBox(); fragmentBox.MovieFragmentBox.MovieFragmentHeaderBox = new MovieFragmentHeaderBox(); fragmentBox.MovieFragmentBox.MovieFragmentHeaderBox.SequenceNumber = 1; fragmentBox.MovieFragmentBox.TrackFragmentBox = new TrackFragmentBox(); fragmentBox.MovieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox = new TrackFragmentHeaderBox(0x39); fragmentBox.MovieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox.TrackID = 1; //todo:BaseDataOffset fragmentBox.MovieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox.BaseDataOffset = 0x000000000000028b; fragmentBox.MovieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox.DefaultSampleDuration = 48000; fragmentBox.MovieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox.DefaultSampleSize = (uint)jT1078Package.Bodies.Length; fragmentBox.MovieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox.DefaultSampleFlags = 0x1010000; //fragmentBox.MovieFragmentBox.TrackFragmentBox.SampleDependencyTypeBox = new SampleDependencyTypeBox(); //fragmentBox.MovieFragmentBox.TrackFragmentBox.SampleDependencyTypeBox.SampleDependencyTypes = new List<SampleDependencyTypeBox.SampleDependencyType>(); //todo:fragmentBox.MovieFragmentBox.TrackFragmentBox.SampleDependencyTypeBox.SampleDependencyTypes fragmentBox.MovieFragmentBox.TrackFragmentBox.TrackFragmentBaseMediaDecodeTimeBox = new TrackFragmentBaseMediaDecodeTimeBox(); //todo:BaseMediaDecodeTime fragmentBox.MovieFragmentBox.TrackFragmentBox.TrackFragmentBaseMediaDecodeTimeBox.BaseMediaDecodeTime = 0; //trun fragmentBox.MovieFragmentBox.TrackFragmentBox.TrackRunBox = new TrackRunBox(flags: 0x5); fragmentBox.MovieFragmentBox.TrackFragmentBox.TrackRunBox.DataOffset = 120; fragmentBox.MovieFragmentBox.TrackFragmentBox.TrackRunBox.FirstSampleFlags = 0; fragmentBox.MovieFragmentBox.TrackFragmentBox.TrackRunBox.TrackRunInfos = new List <TrackRunBox.TrackRunInfo>(); fragmentBox.MovieFragmentBox.TrackFragmentBox.TrackRunBox.TrackRunInfos.Add(new TrackRunBox.TrackRunInfo()); fragmentBox.MediaDataBox = new MediaDataBox(); fragmentBox.MediaDataBox.Data = nalus .Select(s => s.RawData) .ToList(); moofs.Add(fragmentBox); //mfra MovieFragmentRandomAccessBox movieFragmentRandomAccessBox = new MovieFragmentRandomAccessBox(); //mfra->tfra movieFragmentRandomAccessBox.TrackFragmentRandomAccessBox = new TrackFragmentRandomAccessBox(1); movieFragmentRandomAccessBox.TrackFragmentRandomAccessBox.TrackID = 0x01; movieFragmentRandomAccessBox.TrackFragmentRandomAccessBox.TrackFragmentRandomAccessInfos = new List <TrackFragmentRandomAccessBox.TrackFragmentRandomAccessInfo>(); TrackFragmentRandomAccessBox.TrackFragmentRandomAccessInfo trackFragmentRandomAccessInfo1 = new TrackFragmentRandomAccessBox.TrackFragmentRandomAccessInfo(); trackFragmentRandomAccessInfo1.Time = 0; //todo:MoofOffset trackFragmentRandomAccessInfo1.MoofOffset = 0x000000000000028b; trackFragmentRandomAccessInfo1.TrafNumber = 0x01; trackFragmentRandomAccessInfo1.TrunNumber = 0x01; trackFragmentRandomAccessInfo1.SampleNumber = 0x01; movieFragmentRandomAccessBox.TrackFragmentRandomAccessBox.TrackFragmentRandomAccessInfos.Add(trackFragmentRandomAccessInfo1); //mfra->mfro movieFragmentRandomAccessBox.MovieFragmentRandomAccessOffsetBox = new MovieFragmentRandomAccessOffsetBox(0); //todo:MfraSize movieFragmentRandomAccessBox.MovieFragmentRandomAccessOffsetBox.MfraSize = 0x00000043; FMp4Box fMp4Box = new FMp4Box(); fMp4Box.FileTypeBox = fileTypeBox; fMp4Box.MovieBox = movieBox; fMp4Box.FragmentBoxs = moofs; fMp4Box.MovieFragmentRandomAccessBox = movieFragmentRandomAccessBox; FMp4MessagePackWriter writer = new FMp4MessagePackWriter(new byte[65535]); fMp4Box.ToBuffer(ref writer); var buffer = writer.FlushAndGetArray(); var filepath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "H264", "JT1078_1.mp4"); if (File.Exists(filepath)) { File.Delete(filepath); } using var fileStream = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.Write); fileStream.Write(buffer); fileStream.Close(); }