From 89cabade081fcc07c87bc593e320a6a621dad2dc Mon Sep 17 00:00:00 2001 From: "SmallChi(Koike)" <564952747@qq.com> Date: Fri, 9 Apr 2021 18:15:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=861078=E8=BD=ACfmp4=5F16=20ff=E6=92=AD?= =?UTF-8?q?=E6=94=BE=E4=B8=8D=E4=BA=86=EF=BC=8Cvlc=E5=8F=AF=E6=92=AD?= =?UTF-8?q?=E6=94=BE=EF=BC=8CMSE=E5=8F=AF=E6=92=AD=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/JT1078.FMp4.Test/JT1078ToFMp4Box_Test.cs | 1 + src/JT1078.FMp4/FMp4Encoder.cs | 141 +------------------ src/JT1078.FMp4/JT1078.FMp4.xml | 18 --- 3 files changed, 4 insertions(+), 156 deletions(-) diff --git a/src/JT1078.FMp4.Test/JT1078ToFMp4Box_Test.cs b/src/JT1078.FMp4.Test/JT1078ToFMp4Box_Test.cs index 1cf97aa..7c56a3d 100644 --- a/src/JT1078.FMp4.Test/JT1078ToFMp4Box_Test.cs +++ b/src/JT1078.FMp4.Test/JT1078ToFMp4Box_Test.cs @@ -466,6 +466,7 @@ namespace JT1078.FMp4.Test { if (nalu.Slice) { + //H264 NALU slice first_mb_in_slice nalus.Add(nalu); } else diff --git a/src/JT1078.FMp4/FMp4Encoder.cs b/src/JT1078.FMp4/FMp4Encoder.cs index b47d792..28cc9dd 100644 --- a/src/JT1078.FMp4/FMp4Encoder.cs +++ b/src/JT1078.FMp4/FMp4Encoder.cs @@ -30,46 +30,6 @@ namespace JT1078.FMp4 /// public class FMp4Encoder { - readonly H264Decoder h264Decoder; - - /// - /// - /// - public FMp4Encoder() - { - h264Decoder = new H264Decoder(); - } - - /// - /// styp - /// - /// - public byte[] EncoderStypBox() - { - byte[] buffer = FMp4ArrayPool.Rent(1024); - FMp4MessagePackWriter writer = new FMp4MessagePackWriter(buffer); - try - { - //styp - SegmentTypeBox stypTypeBox = new SegmentTypeBox(); - stypTypeBox.MajorBrand = "msdh"; - stypTypeBox.MinorVersion = "\0\0\0\0"; - stypTypeBox.CompatibleBrands.Add("isom"); - stypTypeBox.CompatibleBrands.Add("mp42"); - stypTypeBox.CompatibleBrands.Add("msdh"); - stypTypeBox.CompatibleBrands.Add("msix"); - stypTypeBox.CompatibleBrands.Add("iso5"); - stypTypeBox.CompatibleBrands.Add("iso6"); - stypTypeBox.ToBuffer(ref writer); - var data = writer.FlushAndGetArray(); - return data; - } - finally - { - FMp4ArrayPool.Return(buffer); - } - } - /// /// 编码ftyp盒子 /// @@ -190,105 +150,8 @@ namespace JT1078.FMp4 } } - /// - /// 编码首个视频盒子 - /// - /// jt1078完整包 - /// - public byte[] EncoderFirstVideoBox(JT1078Package package) - { - byte[] buffer = FMp4ArrayPool.Rent(package.Bodies.Length + 1024); - FMp4MessagePackWriter writer = new FMp4MessagePackWriter(buffer); - try - { - var nalus = h264Decoder.ParseNALU(package); - var spsNALU = nalus.FirstOrDefault(n => n.NALUHeader.NalUnitType == NalUnitType.SPS); - //SPS - spsNALU.RawData = h264Decoder.DiscardEmulationPreventionBytes(spsNALU.RawData); - var ppsNALU = nalus.FirstOrDefault(n => n.NALUHeader.NalUnitType == NalUnitType.PPS); - ppsNALU.RawData = h264Decoder.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(); - 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.MediaInformationBox.SampleTableBox.SampleDescriptionBox.SampleEntries = new List(); - 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() { ppsNALU.RawData }; - avc1.AVCConfigurationBox.SPSs = new List() { 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 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); - var data = writer.FlushAndGetArray(); - return data; - } - finally - { - FMp4ArrayPool.Return(buffer); - } - } - uint sn = 1; + public ulong timestampCache = 0; /// @@ -317,6 +180,7 @@ namespace JT1078.FMp4 uint interval = (uint)(lastNalu.Timestamp - firstNalu.Timestamp); int iSize = nalus.Where(w => w.DataType == Protocol.Enums.JT1078DataType.视频I帧) .Sum(s => s.RawData.Length + s.StartCodePrefix.Length); + List sizes = new List(); sizes.Add(iSize); sizes = sizes.Concat(nalus.Where(w => w.DataType != Protocol.Enums.JT1078DataType.视频I帧) @@ -361,6 +225,7 @@ namespace JT1078.FMp4 SampleSize = (uint)size, }); } + movieFragmentBox.ToBuffer(ref writer); timestampCache += (uint)(sizes.Count * 48000); diff --git a/src/JT1078.FMp4/JT1078.FMp4.xml b/src/JT1078.FMp4/JT1078.FMp4.xml index 2e6e784..0189c5c 100644 --- a/src/JT1078.FMp4/JT1078.FMp4.xml +++ b/src/JT1078.FMp4/JT1078.FMp4.xml @@ -1320,17 +1320,6 @@ ref: https://www.w3.org/TR/mse-byte-stream-format-isobmff/#movie-fragment-relative-addressing - - - - - - - - styp - - - 编码ftyp盒子 @@ -1343,13 +1332,6 @@ - - - 编码首个视频盒子 - - jt1078完整包 - - 编码其他视频数据盒子