RTSP客户端用于H264音频/视频流
本文关键字:视频 音频 H264 客户端 用于 RTSP | 更新日期: 2023-09-27 18:16:47
我正在寻找一种简单的方法来获取IP摄像机RTSP流的数据(使用H264音频/视频)并获得另一边
- 一帧一帧字节[]
- 音频流
经过多次研究
- EmguCV Capture似乎永远挂着(论坛没有回答)
- 有很多(太大)RTSP服务器很少解码H264
- 有"慢"的ffmpeg包装
- 有一些托管的DirectShow包装
所以我不知道该去哪里?怎么做呢?
似乎iSpyCamera正在做这项工作,但这是一个大项目,而不是一个小库来查询ip摄像机。
Emgu CV 3.0.0似乎工作得很好(参见Emgu样本)
我仍然坚持使用VLC的IP摄像机,只有当我添加":network-caching=1000"时,我不知道如何使用Emgu CV设置
如果rtsp挂起,请设置一个rtsp服务器来保持连接,因为在收到服务器和客户端的响应后,连接将自动关闭。
以前我用这个指南来实现RTSP流。这个控制台应用程序是在这个相机库的帮助下用c#编写的。下面是相应的代码(连接到相机并传输其图像):
public class MyServer : IPCameraServer
{
private MediaConnector _connector;
private IIPCamera _camera;
private IIPCameraClient _client;
public string IpAddress { get; set; }
public int Port { get; set; }
public event EventHandler ClientCountChange;
public MyServer()
{
_connector = new MediaConnector();
_camera = IPCameraFactory.GetCamera("192.168.115.98:8080", "admin", "admin");
if (_camera != null)
_camera.Start();
}
protected override void OnClientConnected(IIPCameraClient client)
{
_client = client;
_connector.Connect(_camera.AudioChannel, _client.AudioChannel);
_connector.Connect(_camera.VideoChannel, _client.VideoChannel);
var handler = ClientCountChange;
if (handler != null)
handler(null, new EventArgs());
base.OnClientConnected(_client);
}
protected override void OnClientDisconnected(IIPCameraClient client)
{
_connector.Disconnect(_camera.AudioChannel, _client.AudioChannel);
_connector.Disconnect(_camera.VideoChannel, _client.VideoChannel);
_connector.Dispose();
var handler = ClientCountChange;
if (handler != null)
handler(null, new EventArgs());
base.OnClientDisconnected(client);
}
}
class Program
{
static MyServer _server = new MyServer();
static void Main(string[] args)
{
_server.Start();
_server.SetListenAddress("192.168.115.10", 554);
_server.ClientCountChange += new EventHandler(server_ClientCountChange);
Console.WriteLine("Started");
Console.Read();
}
static void server_ClientCountChange(object sender, EventArgs e)
{
_server.ConnectedClients.ForEach(x => Console.WriteLine(x.TransportInfo.RemoteEndPoint.ToString()));
}
}