浏览代码

将1078转fmp4_14

master
SmallChi(Koike) 4 年前
父节点
当前提交
9f1d6fae8e
共有 5 个文件被更改,包括 19 次插入17 次删除
  1. +6
    -4
      src/JT1078.FMp4.Test/JT1078ToFMp4Box_Test.cs
  2. +1
    -0
      src/JT1078.FMp4/Boxs/TrackRunBox.cs
  3. +10
    -12
      src/JT1078.FMp4/FMp4Encoder.cs
  4. +1
    -0
      src/JT1078.FMp4/JT1078.FMp4.xml
  5. +1
    -1
      src/JT1078.SignalR.Test/Services/ToWebSocketService.cs

+ 6
- 4
src/JT1078.FMp4.Test/JT1078ToFMp4Box_Test.cs 查看文件

@@ -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()


+ 1
- 0
src/JT1078.FMp4/Boxs/TrackRunBox.cs 查看文件

@@ -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; }
} }


+ 10
- 12
src/JT1078.FMp4/FMp4Encoder.cs 查看文件

@@ -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 分段


+ 1
- 0
src/JT1078.FMp4/JT1078.FMp4.xml 查看文件

@@ -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">


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


正在加载...
取消
保存