@@ -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) | |||||
{ | |||||
} | |||||
} | |||||
} | } | ||||
} | } |
@@ -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> |
@@ -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); | ||||
@@ -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> | ||||
@@ -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] | ||||
@@ -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(); | |||||
} | |||||
} | } | ||||
} | } |