C# 实现海康摄像头在任意浏览器中预览
兩周以來一直研究海康視頻在谷歌、火狐等瀏覽器中的顯示問題。在今天終于有了一點小心得。發表出來,希望有問題或者其他建議的老師積極給我建議。
在海康瀏覽器的平臺中,因為他本身只支持在IE或者IE內核中顯示,這種問題不能根本性的解決在多瀏覽器里面的問題,我在網上查找了IE-Tab在谷歌瀏覽器中顯示,但是由于需要用戶手動切換瀏覽模式,所以說用起來不是特別方便。后面研究了一下,可以通過海康PlantFormSdk+TCP協議+Websocket的方式進行推流,在瀏覽器中通過img顯示base64的方式顯示視頻,通過以上方式基本上可以實現視頻同步預覽,具體思路如下。
1.服務器端通過使用winform監聽方式監聽瀏覽器端連接預覽的攝像頭,如果為同一個攝像頭時,則通過字典的方式對改連接和IP及Socket進行保存,當不同的連接同一個攝像頭的時候,通過字典保存多個TCP連接。
2.推流:推流方式采用TCP協議的方式,當前我才用的是每隔500ms,對顯示的picturebox進行截屏,在截屏之后,通過代碼將截屏的bitmap轉換成base64字符串流,通過TCP協議推送當前攝像頭連接的網絡地址。
3.接受:在web端通過websocket進行接受傳輸的base64字符串,因為當前比較長,所以我才用的手動分包的方式進行傳輸。
?
圖中分別表示三個單例類,一個是網絡連接、一個是當前連接及當前運行的線程。
public static void SendMessage(string obj, string data)
{
var max = data.Length % 100 == 0 ? data.Length / 100 : data.Length / 100 + 1;
try
{
int i;
for (i = 0; i < max; i++)
{
string send;
if (i == 0)
{
send = $"0,{data.Length}," + data.Substring(0, 100);
}
else if (i == max - 1 && data.Length % 100 != 0)
{
send = $"{i},0," + data.Substring(i * 100, data.Length % 100);
}
else
{
send = $"{i},0," + data.Substring(i * 100, 100);
}
byte[] msgBuffer = PackageServerData(send);
foreach (Session se in SingleConnect.GetInstance()[obj].Select(t => t.Session))
{
if (se.SockeClient.Connected)
{
try
{
se.SockeClient.Send(msgBuffer, msgBuffer.Length, SocketFlags.None);
}
catch (Exception ex)
{
LogHelper.WriteError("發送數據異常", ex);
}
}
}
}
}
catch (Exception ex)
{
LogHelper.WriteError("相應數據異常", ex);
}
}
這段代碼為相應的發送代碼。
?
調用發送代碼的截圖方法。
?
以上為實時監控圖,第一張圖為監聽的連接,第二張圖是在谷歌瀏覽器中顯示的圖,第三張圖是在winform中顯示的圖。
文章水平不是很高,希望對大家有所幫助。如果有問題可以直接私聊我
總結
以上是生活随笔為你收集整理的C# 实现海康摄像头在任意浏览器中预览的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面试题集锦(非常适合初中级测试工程师)
- 下一篇: Flink自定义SQL连接器