Kaynağa Gözat

修改flv编码的缓冲区大小

tags/v1.1.0
SmallChi(Koike) 4 yıl önce
ebeveyn
işleme
084ec0d79a
7 değiştirilmiş dosya ile 1600 ekleme ve 5 silme
  1. +1478
    -0
      doc/video/jt1078_4.txt
  2. +76
    -1
      src/JT1078.Flv.Test/FlvEncoderTest.cs
  3. +6
    -0
      src/JT1078.Flv.Test/JT1078.Flv.Test.csproj
  4. +3
    -3
      src/JT1078.Flv/FlvEncoder.cs
  5. +1
    -1
      src/JT1078.Flv/JT1078.Flv.csproj
  6. +15
    -0
      src/JT1078.Protocol.Test/JT1078SerializerTest.cs
  7. +21
    -0
      src/JT808.Protocol.Extensions.JT1078.Test/JT808_0x9101Test.cs

+ 1478
- 0
doc/video/jt1078_4.txt
Dosya farkı çok büyük olduğundan ihmal edildi
Dosyayı Görüntüle


+ 76
- 1
src/JT1078.Flv.Test/FlvEncoderTest.cs Dosyayı Görüntüle

@@ -100,7 +100,6 @@ namespace JT1078.Flv.Test
var filepath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "H264", "JT1078_3.flv"); var filepath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "H264", "JT1078_3.flv");
var lines = File.ReadAllLines(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "H264", "JT1078_3.txt")); var lines = File.ReadAllLines(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "H264", "JT1078_3.txt"));
fileStream = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.Write); fileStream = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.Write);

bool isNeedFirstHeadler = true; bool isNeedFirstHeadler = true;
FlvEncoder encoder = new FlvEncoder(); FlvEncoder encoder = new FlvEncoder();
foreach (var line in lines) foreach (var line in lines)
@@ -128,6 +127,43 @@ namespace JT1078.Flv.Test
} }
} }


[Fact]
public void 测试可以播放的Flv4()
{
FileStream fileStream = null;
int i = 0;
try
{
var filepath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "H264", "JT1078_4.flv");
var lines = File.ReadAllLines(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "H264", "JT1078_4.txt"));
fileStream = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.Write);
bool isNeedFirstHeadler = true;
FlvEncoder encoder = new FlvEncoder();
foreach (var line in lines)
{
i++;
var bytes = line.ToHexBytes();
JT1078Package package = JT1078Serializer.Deserialize(bytes);
JT1078Package fullpackage = JT1078Serializer.Merge(package);
if (fullpackage != null)
{
var videoTag = encoder.EncoderVideoTag(fullpackage, isNeedFirstHeadler);
fileStream.Write(videoTag);
isNeedFirstHeadler = false;
}
}
}
catch (Exception ex)
{

}
finally
{
fileStream?.Close();
fileStream?.Dispose();
}
}

[Fact] [Fact]
public void EncoderScriptTag() public void EncoderScriptTag()
{ {
@@ -148,5 +184,44 @@ namespace JT1078.Flv.Test
); );
Assert.Equal(44, hexData.Length); Assert.Equal(44, hexData.Length);
} }

[Fact]
public void EncoderVideoTagTest1()
{
try
{
var bytes = "3031636481E206AD0019013050370210000001749162905508480050000E0000000161E4025F0000030037A03031636481E206AE001901305037021000000174916290A508980050000E0000000161E4225F0000030037A0".ToHexBytes();
FlvEncoder encoder = new FlvEncoder();
JT1078Package package = JT1078Serializer.Deserialize(bytes);
JT1078Package fullpackage = JT1078Serializer.Merge(package);
if (fullpackage != null)
{
var videoTag = encoder.EncoderVideoTag(fullpackage, false);
}
}
catch (Exception ex)
{

}
}
[Fact]
public void EncoderVideoTagTest2()
{
try
{
var bytes = "3031636481E2022D0019013050370210000001749179C79D05C80050000E0000000161E1E2FF000003006840".ToHexBytes();
FlvEncoder encoder = new FlvEncoder();
JT1078Package package = JT1078Serializer.Deserialize(bytes);
JT1078Package fullpackage = JT1078Serializer.Merge(package);
if (fullpackage != null)
{
var videoTag = encoder.EncoderVideoTag(fullpackage, false);
}
}
catch (Exception ex)
{

}
}
} }
} }

+ 6
- 0
src/JT1078.Flv.Test/JT1078.Flv.Test.csproj Dosyayı Görüntüle

@@ -21,6 +21,9 @@
<None Include="..\..\doc\video\jt1078_3.txt" Link="H264\jt1078_3.txt"> <None Include="..\..\doc\video\jt1078_3.txt" Link="H264\jt1078_3.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None> </None>
<None Include="..\..\doc\video\jt1078_4.txt" Link="H264\jt1078_4.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="..\..\doc\video\jt1078_1.txt" Link="H264\jt1078_1.txt"> <None Include="..\..\doc\video\jt1078_1.txt" Link="H264\jt1078_1.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None> </None>
@@ -50,6 +53,9 @@
<None Update="H264\JT1078_3.txt"> <None Update="H264\JT1078_3.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None> </None>
<None Update="H264\JT1078_4.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup> </ItemGroup>


</Project> </Project>

+ 3
- 3
src/JT1078.Flv/FlvEncoder.cs Dosyayı Görüntüle

@@ -121,7 +121,7 @@ namespace JT1078.Flv
/// <returns></returns> /// <returns></returns>
public byte[] EncoderFirstVideoTag(SPSInfo spsInfo, H264NALU sps, H264NALU pps, H264NALU sei) public byte[] EncoderFirstVideoTag(SPSInfo spsInfo, H264NALU sps, H264NALU pps, H264NALU sei)
{ {
byte[] buffer = FlvArrayPool.Rent(2048);
byte[] buffer = FlvArrayPool.Rent(4096);
try try
{ {
FlvMessagePackWriter flvMessagePackWriter = new FlvMessagePackWriter(buffer); FlvMessagePackWriter flvMessagePackWriter = new FlvMessagePackWriter(buffer);
@@ -202,7 +202,7 @@ namespace JT1078.Flv
public byte[] EncoderVideoTag(JT1078Package package, bool needVideoHeader = false) public byte[] EncoderVideoTag(JT1078Package package, bool needVideoHeader = false)
{ {
if (package.Label3.DataType == JT1078DataType.音频帧) return default; if (package.Label3.DataType == JT1078DataType.音频帧) return default;
byte[] buffer = FlvArrayPool.Rent(package.Bodies.Length*2);
byte[] buffer = FlvArrayPool.Rent(package.Bodies.Length*2+4096);
FlvMessagePackWriter flvMessagePackWriter = new FlvMessagePackWriter(buffer); FlvMessagePackWriter flvMessagePackWriter = new FlvMessagePackWriter(buffer);
var nalus = h264Decoder.ParseNALU(package); var nalus = h264Decoder.ParseNALU(package);
if (nalus != null && nalus.Count > 0) if (nalus != null && nalus.Count > 0)
@@ -274,7 +274,7 @@ namespace JT1078.Flv
/// <returns></returns> /// <returns></returns>
public byte[] EncoderOtherVideoTag(H264NALU nALU) public byte[] EncoderOtherVideoTag(H264NALU nALU)
{ {
byte[] buffer = FlvArrayPool.Rent(nALU.RawData.Length*2);
byte[] buffer = FlvArrayPool.Rent(nALU.RawData.Length*2+4096);
try try
{ {
FlvMessagePackWriter flvMessagePackWriter = new FlvMessagePackWriter(buffer); FlvMessagePackWriter flvMessagePackWriter = new FlvMessagePackWriter(buffer);


+ 1
- 1
src/JT1078.Flv/JT1078.Flv.csproj Dosyayı Görüntüle

@@ -14,7 +14,7 @@
<licenseUrl>https://github.com/SmallChi/JT1078/blob/master/LICENSE</licenseUrl> <licenseUrl>https://github.com/SmallChi/JT1078/blob/master/LICENSE</licenseUrl>
<license>https://github.com/SmallChi/JT1078/blob/master/LICENSE</license> <license>https://github.com/SmallChi/JT1078/blob/master/LICENSE</license>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild> <GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<Version>1.0.0-preview9</Version>
<Version>1.0.0-preview11</Version>
<SignAssembly>false</SignAssembly> <SignAssembly>false</SignAssembly>
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance> <PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
<PackageLicenseFile>LICENSE</PackageLicenseFile> <PackageLicenseFile>LICENSE</PackageLicenseFile>


+ 15
- 0
src/JT1078.Protocol.Test/JT1078SerializerTest.cs Dosyayı Görüntüle

@@ -238,6 +238,21 @@ namespace JT1078.Protocol.Test
Assert.Equal((ulong)1562085874181, package.Timestamp); Assert.Equal((ulong)1562085874181, package.Timestamp);
Assert.Equal(0x0078, package.DataBodyLength); Assert.Equal(0x0078, package.DataBodyLength);
Assert.Equal("B7 6D FF EF 7D FB A9 9D FE A9 1F 37 77 F3 37 BE EF FB F7 FB FB BE 7D DF B7 FD FB 76 AF DE 77 65 C7 EF E3 FB BE FF DB 4E FF DB B7 63 FF EE EF D8 BE 1D 37 B7 7D E7 7D F3 C6 F7 FD F4 BE 1F F7 B7 55 FF 76 FC FE CE 7B FF B7 7D 3F F5 FF FE 76 6C DF FE 53 DB CF 6D FB BF FD DE B1 EF 3E 77 D3 3F 6E 9A BF BF FF DB F7 FD DB 7F 63 FF 6E EC F8 EE 1F FB FD 7F FB 7D 7C DB".ToHexBytes(), package.Bodies.ToArray()); Assert.Equal("B7 6D FF EF 7D FB A9 9D FE A9 1F 37 77 F3 37 BE EF FB F7 FB FB BE 7D DF B7 FD FB 76 AF DE 77 65 C7 EF E3 FB BE FF DB 4E FF DB B7 63 FF EE EF D8 BE 1D 37 B7 7D E7 7D F3 C6 F7 FD F4 BE 1F F7 B7 55 FF 76 FC FE CE 7B FF B7 7D 3F F5 FF FE 76 6C DF FE 53 DB CF 6D FB BF FD DE B1 EF 3E 77 D3 3F 6E 9A BF BF FF DB F7 FD DB 7F 63 FF 6E EC F8 EE 1F FB FD 7F FB 7D 7C DB".ToHexBytes(), package.Bodies.ToArray());
}

[Fact]
public void DeserializeTest6()
{
var bytes = "3031636481E20492001901305037031000000174922CB80F00A00050033D0000000161E042BF50E2C3B950968B6CB9B80E2CB3F68DBFA51A9C9DC3C0B85C5215C0A4DE5C1D48B72D760400BF88D5EA46D276C8682573C459CD33E8D98C4C77A96F366D636454DC62AFCD4491A670744247B727859C14ECE91C03013D37CFDDBE93CA8C5651863E47DE5231BE914029A04A9E1318D983DB115800C01FC961DBA05DA3D2CEF66761CA5BF7CFA1815429DDE0AF2CF527C251C2E190407D313A651895FAFA7A1AC2E4ABEFDD7E26F1B37D9C643A1AF302ACD77A8A74A34747BC333C89A2E02AD902137708251313D77A649A751EA81E48A341C44D895694F37D2BEC8B9B50A46B9C2CB9AE62DCE10BF7692D1151A3B55CA3310AC494CF095D6258A71F875ED8D9C54694B29C217F48E0C511ECB52951F6DF1B9CF9FB6CFCAEFF515645D66278A964D4CCF64D9999F82D639A77F3B79E91C1B9A1F0A156B712D52E9F810FA6B6885A788EB7C1EA6272660F108C5A3D0C5893BA0021B1A080EC158D77BE40DC92A2EBEF96469FC8B258F3EDF843859DD83861D1B27E72019DC5FBF97D2489554092C2DEEAECD15FE6C2455D8A8CDEB590707914C2D01DA003C84C9F04D45569655A05648C465EBE1E04B6B330F6DFE7DE4F0975ED884275D8D8931405E88DC9D54084F25DED012E175F61E5EDB56F308D36F046C127CC96B0CCACA3B96018A6354D15A6520901A4EBC699AA9DC5E45FF17C35FED9A14B4BA84457534FB636EE998990C7B9E6A44638FB51615A09CCB922B6DA47C5E3A45EA794E76514DFA76CBA2DEB5F947CB71557AFA34F6D9DD37F747FB4D37AD14EFBF5070831DDC59C78713DF1CA8A394636158E761A12D6B763645D220D356B8B48462AD7A0112C4A59BEF52AD70BB69907CDDB350ED2D389DB0B003ECEF40FACBB4A3F29409C51AAEAB4A21AA3C70DFEDD116B7534E5A938974B431BC46956D376D73C6A7A0B0E9FF6A4A006097D680C93E5BFA75B3D4D533EA83F93A2503A2F813D3DA037498B4F31270845B3807A61AF0E722EA9ABBF2C0A5DCEA564DE3F58CC1273A8E52CB675B26700AD24F2115823F2BF918279321628FDBAD3B8C0FA0C50536DF88022F6C3956EE0ACCBF31B602AEB0D1933A677EB40125C89FE2A61A05BA7DE296DAE20EEF74790B1405B9766FBF1A0FFFD03BA07D943B504FA0C568DA0".ToHexBytes();
JT1078Package package = JT1078Serializer.Deserialize(bytes);
Assert.Equal(0b10000001, package.Label1.ToByte());
Assert.Equal(0b11100010, package.Label2.ToByte());
Assert.Equal(1170u, package.SN);
Assert.Equal("001901305037", package.SIM);
Assert.Equal(0x03, package.LogicChannelNumber);
Assert.Equal(0b00010000, package.Label3.ToByte());
Assert.Equal((ulong)1600180238351, package.Timestamp);
Assert.Equal(829u, package.DataBodyLength);
} }


[Fact] [Fact]


+ 21
- 0
src/JT808.Protocol.Extensions.JT1078.Test/JT808_0x9101Test.cs Dosyayı Görüntüle

@@ -71,10 +71,31 @@ namespace JT808.Protocol.Extensions.JT1078.Test
Assert.Equal("7E910100110123456798100001093132372E302E302E31076000000101014C7E", hex); Assert.Equal("7E910100110123456798100001093132372E302E302E31076000000101014C7E", hex);
//7E910100110123456798100001093132372E302E302E31076000000101014C7E //7E910100110123456798100001093132372E302E302E31076000000101014C7E
} }

[Fact] [Fact]
public void Test4() public void Test4()
{ {
var jT808_0X9101 = JT808Serializer.Analyze<JT808_0x9101>("093132372E302E302E3107600000010101".ToHexBytes()); var jT808_0X9101 = JT808Serializer.Analyze<JT808_0x9101>("093132372E302E302E3107600000010101".ToHexBytes());
} }

[Fact]
public void Test5()
{
JT808Package jT808Package = new JT808Package();
JT808Header header = new JT808Header();
header.MsgId = 0x9101;
header.MsgNum = 1;
header.TerminalPhoneNo = "";
jT808Package.Header = header;
JT808_0x9101 jT808_0X9101 = new JT808_0x9101();
jT808_0X9101.ServerIPAddress = "";
jT808_0X9101.ServerVideoChannelTcpPort = 1078;
jT808_0X9101.ServerVideoChannelUdpPort = 0;
jT808_0X9101.LogicalChannelNo = 3;
jT808_0X9101.DataType = 1;
jT808_0X9101.StreamType = 1;
jT808Package.Bodies = jT808_0X9101;
var hex = JT808Serializer.Serialize(jT808Package).ToHexString();
}
} }
} }

Yükleniyor…
İptal
Kaydet