Commit f1410da2 by liulongfei

NDIStream优化

parent 7cfedc1e
No preview for this file type
...@@ -57,7 +57,8 @@ ...@@ -57,7 +57,8 @@
<Reference Include="log4net, Version=2.0.14.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL"> <Reference Include="log4net, Version=2.0.14.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
<HintPath>..\packages\log4net.2.0.14\lib\net45\log4net.dll</HintPath> <HintPath>..\packages\log4net.2.0.14\lib\net45\log4net.dll</HintPath>
</Reference> </Reference>
<Reference Include="NDILibDotNet2"> <Reference Include="NDILibDotNet2, Version=1.0.0.0, Culture=neutral, processorArchitecture=AMD64">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\05-Lib\NDILibDotNet2.dll</HintPath> <HintPath>..\05-Lib\NDILibDotNet2.dll</HintPath>
</Reference> </Reference>
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> <Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
......
...@@ -83,11 +83,6 @@ namespace VIZ.Framework.Common ...@@ -83,11 +83,6 @@ namespace VIZ.Framework.Common
/// </summary> /// </summary>
internal IntPtr RecvInstancePtr; internal IntPtr RecvInstancePtr;
/// <summary>
/// 接收NDI流同步信息实例句柄
/// </summary>
internal IntPtr RecvSyncInstancePtr;
/* ========================================================================================================= */ /* ========================================================================================================= */
/* === Field === */ /* === Field === */
/* ========================================================================================================= */ /* ========================================================================================================= */
...@@ -154,12 +149,6 @@ namespace VIZ.Framework.Common ...@@ -154,12 +149,6 @@ namespace VIZ.Framework.Common
NDIlib.recv_destroy(this.RecvInstancePtr); NDIlib.recv_destroy(this.RecvInstancePtr);
this.RecvInstancePtr = IntPtr.Zero; this.RecvInstancePtr = IntPtr.Zero;
} }
// 释放NDI流同步接收实例句柄
if (this.RecvSyncInstancePtr != IntPtr.Zero)
{
NDIlib.framesync_destroy(this.RecvSyncInstancePtr);
this.RecvSyncInstancePtr = IntPtr.Zero;
}
} }
/// <summary> /// <summary>
...@@ -196,12 +185,6 @@ namespace VIZ.Framework.Common ...@@ -196,12 +185,6 @@ namespace VIZ.Framework.Common
NDIlib.recv_destroy(this.RecvInstancePtr); NDIlib.recv_destroy(this.RecvInstancePtr);
this.RecvInstancePtr = IntPtr.Zero; this.RecvInstancePtr = IntPtr.Zero;
} }
// 释放NDI流同步接收实例句柄
if (this.RecvSyncInstancePtr != IntPtr.Zero)
{
NDIlib.framesync_destroy(this.RecvSyncInstancePtr);
this.RecvSyncInstancePtr = IntPtr.Zero;
}
// ------------------------------------------------------------------------------- // -------------------------------------------------------------------------------
// 初始化 // 初始化
...@@ -227,7 +210,6 @@ namespace VIZ.Framework.Common ...@@ -227,7 +210,6 @@ namespace VIZ.Framework.Common
recvCreateDesc.p_ndi_recv_name = UTF.StringToUtf8(this.LocalRecevierName); recvCreateDesc.p_ndi_recv_name = UTF.StringToUtf8(this.LocalRecevierName);
this.RecvInstancePtr = NDIlib.recv_create_v3(ref recvCreateDesc); this.RecvInstancePtr = NDIlib.recv_create_v3(ref recvCreateDesc);
this.RecvSyncInstancePtr = NDIlib.framesync_create(this.RecvInstancePtr);
// ------------------------------------------------------------------------------- // -------------------------------------------------------------------------------
// 切换成功 // 切换成功
......
...@@ -32,9 +32,9 @@ namespace VIZ.Framework.Common ...@@ -32,9 +32,9 @@ namespace VIZ.Framework.Common
public override NDIStreamTaskNames Name => NDIStreamTaskNames.RECV_VIDEO; public override NDIStreamTaskNames Name => NDIStreamTaskNames.RECV_VIDEO;
/// <summary> /// <summary>
/// 之前的视频帧时间戳 /// 线程优先级
/// </summary> /// </summary>
private long old_video_timestamp = 0; public override ThreadPriority ThreadPriority => ThreadPriority.Highest;
/// <summary> /// <summary>
/// 执行 /// 执行
...@@ -43,9 +43,9 @@ namespace VIZ.Framework.Common ...@@ -43,9 +43,9 @@ namespace VIZ.Framework.Common
{ {
while (this.IsStarted) while (this.IsStarted)
{ {
if (this.Stream.RecvInstancePtr == IntPtr.Zero || this.Stream.RecvSyncInstancePtr == IntPtr.Zero) if (this.Stream.RecvInstancePtr == IntPtr.Zero)
{ {
Thread.Sleep(1); Thread.Sleep(1000);
continue; continue;
} }
...@@ -62,26 +62,25 @@ namespace VIZ.Framework.Common ...@@ -62,26 +62,25 @@ namespace VIZ.Framework.Common
{ {
// 获取NDI视频帧 // 获取NDI视频帧
NDIlib.video_frame_v2_t frame = new NDIlib.video_frame_v2_t(); NDIlib.video_frame_v2_t frame = new NDIlib.video_frame_v2_t();
NDIlib.framesync_capture_video(this.Stream.RecvSyncInstancePtr, ref frame, NDIlib.frame_format_type_e.frame_format_type_progressive); NDIlib.audio_frame_v2_t audio = new NDIlib.audio_frame_v2_t();
NDIlib.metadata_frame_t metadata = new NDIlib.metadata_frame_t();
NDIlib.frame_type_e type = NDIlib.recv_capture_v2(this.Stream.RecvInstancePtr, ref frame, ref audio, ref metadata, 1000);
// 如果该帧的时间戳与之前的帧时间戳一致 if (type != NDIlib.frame_type_e.frame_type_video)
// 那么认为没有获取到新的一帧画面
if (this.old_video_timestamp == frame.timestamp)
{ {
NDIlib.framesync_free_video(this.Stream.RecvSyncInstancePtr, ref frame); NDIlib.recv_free_video_v2(this.Stream.RecvInstancePtr, ref frame);
Thread.Sleep(10); NDIlib.recv_free_audio_v2(this.Stream.RecvInstancePtr, ref audio);
NDIlib.recv_free_metadata(this.Stream.RecvInstancePtr, ref metadata);
return; return;
} }
// 否则
// 获取到新的一帧画面
this.old_video_timestamp = frame.timestamp;
// 如果新的一帧画面的时间戳为0 || 帧没有数据 // 如果新的一帧画面的时间戳为0 || 帧没有数据
if (frame.timestamp == 0 || frame.p_data == IntPtr.Zero || frame.p_data == null) if (frame.timestamp == 0 || frame.p_data == IntPtr.Zero || frame.p_data == null)
{ {
NDIlib.framesync_free_video(this.Stream.RecvSyncInstancePtr, ref frame); NDIlib.recv_free_video_v2(this.Stream.RecvInstancePtr, ref frame);
Thread.Sleep(10); NDIlib.recv_free_audio_v2(this.Stream.RecvInstancePtr, ref audio);
NDIlib.recv_free_metadata(this.Stream.RecvInstancePtr, ref metadata);
return; return;
} }
...@@ -108,9 +107,9 @@ namespace VIZ.Framework.Common ...@@ -108,9 +107,9 @@ namespace VIZ.Framework.Common
this.Stream.VideoFrameQueue.Enqueue(videoFrame); this.Stream.VideoFrameQueue.Enqueue(videoFrame);
// 尝试释放帧数据 // 尝试释放帧数据
NDIlib.framesync_free_video(this.Stream.RecvSyncInstancePtr, ref frame); NDIlib.recv_free_video_v2(this.Stream.RecvInstancePtr, ref frame);
NDIlib.recv_free_audio_v2(this.Stream.RecvInstancePtr, ref audio);
Thread.Sleep(10); NDIlib.recv_free_metadata(this.Stream.RecvInstancePtr, ref metadata);
} }
} }
} }
...@@ -18,6 +18,11 @@ namespace VIZ.Framework.Common ...@@ -18,6 +18,11 @@ namespace VIZ.Framework.Common
public bool IsStarted { get; set; } public bool IsStarted { get; set; }
/// <summary> /// <summary>
/// 线程优先级
/// </summary>
public virtual ThreadPriority ThreadPriority { get; } = ThreadPriority.Normal;
/// <summary>
/// 任务线程 /// 任务线程
/// </summary> /// </summary>
private Thread Thread; private Thread Thread;
...@@ -34,6 +39,7 @@ namespace VIZ.Framework.Common ...@@ -34,6 +39,7 @@ namespace VIZ.Framework.Common
this.Thread = new Thread(this.Execute); this.Thread = new Thread(this.Execute);
this.Thread.IsBackground = true; this.Thread.IsBackground = true;
this.Thread.Priority = this.ThreadPriority;
this.Thread.Start(); this.Thread.Start();
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment