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);