瀏覽代碼

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


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

@@ -123,6 +123,7 @@ namespace JT1078.FMp4
/// version == 0
/// 0:uint
/// >0:int
/// cts
/// </summary>
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>
/// 编码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 分段


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

@@ -1098,6 +1098,7 @@
version == 0
0:uint
>0:int
cts
</summary>
</member>
<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 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);


Loading…
取消
儲存