@@ -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() | |||
@@ -123,6 +123,7 @@ namespace JT1078.FMp4 | |||
/// version == 0 | |||
/// 0:uint | |||
/// >0:int | |||
/// cts | |||
/// </summary> | |||
public long SampleCompositionTimeOffset { get; set; } | |||
} | |||
@@ -108,15 +108,11 @@ namespace JT1078.FMp4 | |||
} | |||
} | |||
ulong IframeIntervalCache = 259960; | |||
ulong cts = 0; | |||
/// <summary> | |||
/// 编码sidx盒子 | |||
/// </summary> | |||
/// <returns></returns> | |||
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<SegmentIndexBox.SegmentIndex>() | |||
{ | |||
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; | |||
/// <summary> | |||
/// 编码Moof盒子 | |||
/// </summary> | |||
@@ -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 分段 | |||
@@ -1098,6 +1098,7 @@ | |||
version == 0 | |||
0:uint | |||
>0:int | |||
cts | |||
</summary> | |||
</member> | |||
<member name="T:JT1078.FMp4.URIBox"> | |||
@@ -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); | |||