@@ -473,7 +473,7 @@ namespace JT1078.FMp4.Test | |||||
var otherMdatBuffer = fMp4Encoder.EncoderMdatBox(otherNalus, package.Bodies.Length); | var otherMdatBuffer = fMp4Encoder.EncoderMdatBox(otherNalus, package.Bodies.Length); | ||||
//var otherMoofBuffer = fMp4Encoder.EncoderMoofBox(filterOtherNalus, length, package.Timestamp, package.LastFrameInterval, package.LastIFrameInterval, flag); | //var otherMoofBuffer = fMp4Encoder.EncoderMoofBox(filterOtherNalus, length, package.Timestamp, package.LastFrameInterval, package.LastIFrameInterval, flag); | ||||
//var otherMdatBuffer = fMp4Encoder.EncoderMdatBox(filterOtherNalus, length); | //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(otherSidxBuffer); | ||||
fileStream.Write(otherMoofBuffer); | fileStream.Write(otherMoofBuffer); | ||||
fileStream.Write(otherMdatBuffer); | fileStream.Write(otherMdatBuffer); | ||||
@@ -525,6 +525,7 @@ namespace JT1078.FMp4.Test | |||||
var iStypBuffer = fMp4Encoder.EncoderStypBox(); | var iStypBuffer = fMp4Encoder.EncoderStypBox(); | ||||
fileStream.Write(iStypBuffer); | fileStream.Write(iStypBuffer); | ||||
var firstNalu = nalus[0]; | var firstNalu = nalus[0]; | ||||
var lastNalu = nalus[nalus.Count-1]; | |||||
var flag = firstNalu.DataType == Protocol.Enums.JT1078DataType.视频I帧 ? 1u : 0u; | var flag = firstNalu.DataType == Protocol.Enums.JT1078DataType.视频I帧 ? 1u : 0u; | ||||
int iSize = nalus.Where(w => w.DataType == Protocol.Enums.JT1078DataType.视频I帧) | int iSize = nalus.Where(w => w.DataType == Protocol.Enums.JT1078DataType.视频I帧) | ||||
.Sum(s => s.RawData.Length + s.StartCodePrefix.Length); | .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帧) | sizes = sizes.Concat(nalus.Where(w => w.DataType != Protocol.Enums.JT1078DataType.视频I帧) | ||||
.Select(s => s.RawData.Length + s.StartCodePrefix.Length).ToList()) | .Select(s => s.RawData.Length + s.StartCodePrefix.Length).ToList()) | ||||
.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 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(iSidxBuffer); | ||||
fileStream.Write(iMoofBuffer); | fileStream.Write(iMoofBuffer); | ||||
fileStream.Write(iMdatBuffer); | fileStream.Write(iMdatBuffer); | ||||
@@ -546,7 +548,7 @@ namespace JT1078.FMp4.Test | |||||
} | } | ||||
} | } | ||||
fileStream.Close(); | fileStream.Close(); | ||||
} | |||||
} | |||||
[Fact] | [Fact] | ||||
public void tkhd_width_height_test() | public void tkhd_width_height_test() | ||||
@@ -123,6 +123,7 @@ namespace JT1078.FMp4 | |||||
/// version == 0 | /// version == 0 | ||||
/// 0:uint | /// 0:uint | ||||
/// >0:int | /// >0:int | ||||
/// cts | |||||
/// </summary> | /// </summary> | ||||
public long SampleCompositionTimeOffset { get; set; } | public long SampleCompositionTimeOffset { get; set; } | ||||
} | } | ||||
@@ -108,15 +108,11 @@ namespace JT1078.FMp4 | |||||
} | } | ||||
} | } | ||||
ulong IframeIntervalCache = 259960; | |||||
ulong cts = 0; | |||||
/// <summary> | /// <summary> | ||||
/// 编码sidx盒子 | /// 编码sidx盒子 | ||||
/// </summary> | /// </summary> | ||||
/// <returns></returns> | /// <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); | byte[] buffer = FMp4ArrayPool.Rent(4096); | ||||
FMp4MessagePackWriter writer = new FMp4MessagePackWriter(buffer); | FMp4MessagePackWriter writer = new FMp4MessagePackWriter(buffer); | ||||
@@ -124,9 +120,8 @@ namespace JT1078.FMp4 | |||||
{ | { | ||||
SegmentIndexBox segmentIndexBox = new SegmentIndexBox(1); | SegmentIndexBox segmentIndexBox = new SegmentIndexBox(1); | ||||
segmentIndexBox.ReferenceID = 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>() | segmentIndexBox.SegmentIndexs = new List<SegmentIndexBox.SegmentIndex>() | ||||
{ | { | ||||
new SegmentIndexBox.SegmentIndex | new SegmentIndexBox.SegmentIndex | ||||
@@ -337,7 +332,8 @@ namespace JT1078.FMp4 | |||||
movieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox.DefaultSampleSize = (uint)naluLength; | movieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox.DefaultSampleSize = (uint)naluLength; | ||||
movieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox.DefaultSampleFlags = 0x1010000; | movieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox.DefaultSampleFlags = 0x1010000; | ||||
movieFragmentBox.TrackFragmentBox.TrackFragmentBaseMediaDecodeTimeBox = new TrackFragmentBaseMediaDecodeTimeBox(); | movieFragmentBox.TrackFragmentBox.TrackFragmentBaseMediaDecodeTimeBox = new TrackFragmentBaseMediaDecodeTimeBox(); | ||||
movieFragmentBox.TrackFragmentBox.TrackFragmentBaseMediaDecodeTimeBox.BaseMediaDecodeTime = timestamp*1000; | |||||
movieFragmentBox.TrackFragmentBox.TrackFragmentBaseMediaDecodeTimeBox.BaseMediaDecodeTime = timestamp; | |||||
//movieFragmentBox.TrackFragmentBox.TrackFragmentBaseMediaDecodeTimeBox.BaseMediaDecodeTime = timestamp*1000; | |||||
//trun | //trun | ||||
//0x39 写文件 | //0x39 写文件 | ||||
//0x02 分段 | //0x02 分段 | ||||
@@ -369,6 +365,8 @@ namespace JT1078.FMp4 | |||||
} | } | ||||
} | } | ||||
public ulong timestampCache = 0; | |||||
/// <summary> | /// <summary> | ||||
/// 编码Moof盒子 | /// 编码Moof盒子 | ||||
/// </summary> | /// </summary> | ||||
@@ -389,12 +387,12 @@ namespace JT1078.FMp4 | |||||
movieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox = new TrackFragmentHeaderBox(0x2003a); | movieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox = new TrackFragmentHeaderBox(0x2003a); | ||||
movieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox.TrackID = 1; | movieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox.TrackID = 1; | ||||
movieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox.SampleDescriptionIndex = 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.DefaultSampleSize = (uint)naluSzies[0]; | ||||
movieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox.DefaultSampleFlags = 0x1010000; | movieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox.DefaultSampleFlags = 0x1010000; | ||||
movieFragmentBox.TrackFragmentBox.TrackFragmentBaseMediaDecodeTimeBox = new TrackFragmentBaseMediaDecodeTimeBox(); | movieFragmentBox.TrackFragmentBox.TrackFragmentBaseMediaDecodeTimeBox = new TrackFragmentBaseMediaDecodeTimeBox(); | ||||
movieFragmentBox.TrackFragmentBox.TrackFragmentBaseMediaDecodeTimeBox.BaseMediaDecodeTime = cts; | |||||
movieFragmentBox.TrackFragmentBox.TrackFragmentBaseMediaDecodeTimeBox.BaseMediaDecodeTime = timestampCache; | |||||
//trun | //trun | ||||
//0x39 写文件 | //0x39 写文件 | ||||
//0x02 分段 | //0x02 分段 | ||||
@@ -1098,6 +1098,7 @@ | |||||
version == 0 | version == 0 | ||||
0:uint | 0:uint | ||||
>0:int | >0:int | ||||
cts | |||||
</summary> | </summary> | ||||
</member> | </member> | ||||
<member name="T:JT1078.FMp4.URIBox"> | <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 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 otherMoofBuffer = fMp4Encoder.EncoderMoofBox(otherNalus, package.Bodies.Length, package.Timestamp, package.LastFrameInterval, package.LastIFrameInterval, flag); | ||||
var otherMdatBuffer = fMp4Encoder.EncoderMdatBox(otherNalus, package.Bodies.Length); | 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(otherSidxBuffer); | ||||
other.Add(otherMoofBuffer); | other.Add(otherMoofBuffer); | ||||
other.Add(otherMdatBuffer); | other.Add(otherMdatBuffer); | ||||