diff --git a/src/JT1078.FMp4.Test/JT1078ToFMp4Box_Test.cs b/src/JT1078.FMp4.Test/JT1078ToFMp4Box_Test.cs index 58d9958..489fb93 100644 --- a/src/JT1078.FMp4.Test/JT1078ToFMp4Box_Test.cs +++ b/src/JT1078.FMp4.Test/JT1078ToFMp4Box_Test.cs @@ -473,7 +473,7 @@ namespace JT1078.FMp4.Test var otherMdatBuffer = fMp4Encoder.EncoderMdatBox(otherNalus, package.Bodies.Length); //var otherMoofBuffer = fMp4Encoder.EncoderMoofBox(filterOtherNalus, length, package.Timestamp, package.LastFrameInterval, package.LastIFrameInterval, flag); //var otherMdatBuffer = fMp4Encoder.EncoderMdatBox(filterOtherNalus, length); - var otherSidxBuffer = fMp4Encoder.EncoderSidxBox(otherMoofBuffer.Length + otherMdatBuffer.Length, package.Timestamp, package.LastIFrameInterval, package.LastFrameInterval); + var otherSidxBuffer = fMp4Encoder.EncoderSidxBox(otherMoofBuffer.Length + otherMdatBuffer.Length, package.Timestamp, package.LastFrameInterval, package.LastIFrameInterval); fileStream.Write(otherSidxBuffer); fileStream.Write(otherMoofBuffer); fileStream.Write(otherMdatBuffer); @@ -525,6 +525,7 @@ namespace JT1078.FMp4.Test var iStypBuffer = fMp4Encoder.EncoderStypBox(); fileStream.Write(iStypBuffer); var firstNalu = nalus[0]; + var lastNalu = nalus[nalus.Count-1]; var flag = firstNalu.DataType == Protocol.Enums.JT1078DataType.视频I帧 ? 1u : 0u; int iSize = nalus.Where(w => w.DataType == Protocol.Enums.JT1078DataType.视频I帧) .Sum(s => s.RawData.Length + s.StartCodePrefix.Length); @@ -533,9 +534,10 @@ namespace JT1078.FMp4.Test sizes = sizes.Concat(nalus.Where(w => w.DataType != Protocol.Enums.JT1078DataType.视频I帧) .Select(s => s.RawData.Length + s.StartCodePrefix.Length).ToList()) .ToList(); - var iMoofBuffer = fMp4Encoder.EncoderMoofBox(sizes, firstNalu.Timestamp, firstNalu.LastFrameInterval, firstNalu.LastIFrameInterval, flag); + var iMoofBuffer = fMp4Encoder.EncoderMoofBox(sizes, (uint)(nalus.Count * 48000), (uint)(lastNalu.LastIFrameInterval), firstNalu.LastIFrameInterval, flag); var iMdatBuffer = fMp4Encoder.EncoderMdatBox(nalus.Select(s => s.RawData).ToList()); - var iSidxBuffer = fMp4Encoder.EncoderSidxBox(iMoofBuffer.Length + iMdatBuffer.Length, firstNalu.Timestamp, firstNalu.LastIFrameInterval, firstNalu.LastFrameInterval); + var iSidxBuffer = fMp4Encoder.EncoderSidxBox(iMoofBuffer.Length + iMdatBuffer.Length, (uint)(nalus.Count*48000), (uint)(lastNalu.LastIFrameInterval), firstNalu.LastIFrameInterval); + fMp4Encoder.timestampCache += (uint)(sizes.Count * 48000+ lastNalu.LastFrameInterval); fileStream.Write(iSidxBuffer); fileStream.Write(iMoofBuffer); fileStream.Write(iMdatBuffer); @@ -546,7 +548,7 @@ namespace JT1078.FMp4.Test } } fileStream.Close(); - } + } [Fact] public void tkhd_width_height_test() diff --git a/src/JT1078.FMp4/Boxs/TrackRunBox.cs b/src/JT1078.FMp4/Boxs/TrackRunBox.cs index 8ce43a2..4351a28 100644 --- a/src/JT1078.FMp4/Boxs/TrackRunBox.cs +++ b/src/JT1078.FMp4/Boxs/TrackRunBox.cs @@ -123,6 +123,7 @@ namespace JT1078.FMp4 /// version == 0 /// 0:uint /// >0:int + /// cts /// public long SampleCompositionTimeOffset { get; set; } } diff --git a/src/JT1078.FMp4/FMp4Encoder.cs b/src/JT1078.FMp4/FMp4Encoder.cs index fe573f4..838887a 100644 --- a/src/JT1078.FMp4/FMp4Encoder.cs +++ b/src/JT1078.FMp4/FMp4Encoder.cs @@ -108,15 +108,11 @@ namespace JT1078.FMp4 } } - ulong IframeIntervalCache = 259960; - - ulong cts = 0; - /// /// 编码sidx盒子 /// /// - public byte[] EncoderSidxBox(int moofAndMdatLength, ulong timestamp, uint IframeInterval, uint frameInterval) + public byte[] EncoderSidxBox(int moofAndMdatLength, ulong timestamp,uint frameInterval, uint IframeInterval) { byte[] buffer = FMp4ArrayPool.Rent(4096); FMp4MessagePackWriter writer = new FMp4MessagePackWriter(buffer); @@ -124,9 +120,8 @@ namespace JT1078.FMp4 { SegmentIndexBox segmentIndexBox = new SegmentIndexBox(1); segmentIndexBox.ReferenceID = 1; - cts = cts == 0 ? 2160000 : (cts + cts); - segmentIndexBox.EarliestPresentationTime = cts; - IframeIntervalCache += frameInterval; + segmentIndexBox.EarliestPresentationTime = timestampCache; + //segmentIndexBox.EarliestPresentationTime = IframeInterval * 1000*90; segmentIndexBox.SegmentIndexs = new List() { new SegmentIndexBox.SegmentIndex @@ -337,7 +332,8 @@ namespace JT1078.FMp4 movieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox.DefaultSampleSize = (uint)naluLength; movieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox.DefaultSampleFlags = 0x1010000; movieFragmentBox.TrackFragmentBox.TrackFragmentBaseMediaDecodeTimeBox = new TrackFragmentBaseMediaDecodeTimeBox(); - movieFragmentBox.TrackFragmentBox.TrackFragmentBaseMediaDecodeTimeBox.BaseMediaDecodeTime = timestamp*1000; + movieFragmentBox.TrackFragmentBox.TrackFragmentBaseMediaDecodeTimeBox.BaseMediaDecodeTime = timestamp; + //movieFragmentBox.TrackFragmentBox.TrackFragmentBaseMediaDecodeTimeBox.BaseMediaDecodeTime = timestamp*1000; //trun //0x39 写文件 //0x02 分段 @@ -369,6 +365,8 @@ namespace JT1078.FMp4 } } + public ulong timestampCache = 0; + /// /// 编码Moof盒子 /// @@ -389,12 +387,12 @@ namespace JT1078.FMp4 movieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox = new TrackFragmentHeaderBox(0x2003a); movieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox.TrackID = 1; movieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox.SampleDescriptionIndex = 1; - movieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox.DefaultSampleDuration = frameInterval; - //movieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox.DefaultSampleDuration = 48000; + //movieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox.DefaultSampleDuration = frameInterval; + movieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox.DefaultSampleDuration = 48000; movieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox.DefaultSampleSize = (uint)naluSzies[0]; movieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox.DefaultSampleFlags = 0x1010000; movieFragmentBox.TrackFragmentBox.TrackFragmentBaseMediaDecodeTimeBox = new TrackFragmentBaseMediaDecodeTimeBox(); - movieFragmentBox.TrackFragmentBox.TrackFragmentBaseMediaDecodeTimeBox.BaseMediaDecodeTime = cts; + movieFragmentBox.TrackFragmentBox.TrackFragmentBaseMediaDecodeTimeBox.BaseMediaDecodeTime = timestampCache; //trun //0x39 写文件 //0x02 分段 diff --git a/src/JT1078.FMp4/JT1078.FMp4.xml b/src/JT1078.FMp4/JT1078.FMp4.xml index 9513cbf..8c30c0c 100644 --- a/src/JT1078.FMp4/JT1078.FMp4.xml +++ b/src/JT1078.FMp4/JT1078.FMp4.xml @@ -1098,6 +1098,7 @@ version == 0 0:uint >0:int + cts diff --git a/src/JT1078.SignalR.Test/Services/ToWebSocketService.cs b/src/JT1078.SignalR.Test/Services/ToWebSocketService.cs index 0f0b0c3..0754b04 100644 --- a/src/JT1078.SignalR.Test/Services/ToWebSocketService.cs +++ b/src/JT1078.SignalR.Test/Services/ToWebSocketService.cs @@ -89,7 +89,7 @@ namespace JT1078.SignalR.Test.Services var flag = package.Label3.DataType == Protocol.Enums.JT1078DataType.视频I帧 ? 1u : 0u; var otherMoofBuffer = fMp4Encoder.EncoderMoofBox(otherNalus, package.Bodies.Length, package.Timestamp, package.LastFrameInterval, package.LastIFrameInterval, flag); var otherMdatBuffer = fMp4Encoder.EncoderMdatBox(otherNalus, package.Bodies.Length); - var otherSidxBuffer = fMp4Encoder.EncoderSidxBox(otherMoofBuffer.Length + otherMdatBuffer.Length, package.Timestamp, package.LastIFrameInterval, package.LastFrameInterval); + var otherSidxBuffer = fMp4Encoder.EncoderSidxBox(otherMoofBuffer.Length + otherMdatBuffer.Length, package.Timestamp,package.LastFrameInterval, package.LastIFrameInterval); other.Add(otherSidxBuffer); other.Add(otherMoofBuffer); other.Add(otherMdatBuffer);