我的公司正在开发一个与多个网络摄像头连接的系统.我们从摄像机流式传输视频的方式是通过HTTP(主要是因为摄像机的限制以及我们希望它能够提供即插即用的行为).我注意到当我使用rtp over http选项的流时,rtp流的方式是
| X | | RTP |
| -4 | | ------- |
其中X是一个4字节的标题,以hexa中的"24 00"开头,另外2个字节是RTP数据包的长度(之后是RTP数据包).
现在我不能为我的生活弄清楚X协议是什么.我已经在两个相机品牌中看到了同样的行为 - 松下和Edimax,这表明它不是某种专有协议.
有谁知道这是什么样的协议?也许是某种HTTP隧道协议?
谢谢,
Tomer
我从相机收到MJPEG Stream.当我用十六进制编辑器查看视频数据时,似乎它不包含任何流信息.我只看到一个接一个的原始JPEG,但没有关于帧速率的信息等.
MJPEG是否缺少任何元信息,或者它与我正在使用的相机有关?如果没有关于流的信息,玩家怎么知道播放视频的速度有多快?
我正在通过HTTP从相机中读取图像.这是代码:
Mat src;
VideoCapture cap();
cap.open("http://192.168.1.10:8008"); // IP camera
while(1) {
cap.read(src);
// Other code
}
Run Code Online (Sandbox Code Playgroud)
它工作得很好,但是如果我在物理上断开相机的运行一段时间后,代码就会永远挂起cap.read(src);.
我需要一些方法来返回,read如果,比方说,5秒后没有新的图像.
还有另一个问题.如果在程序等待时重新连接摄像机,read则无论如何都会一直挂着.如果VideoCapture能够在重新连接相机后再次抓取帧,那将是一件好事.
大多数IP摄像机是否支持RTSP?
此外,除了使用uPnP和Bonjour之外还有其他方法可以在本地网络上检测IP摄像机吗?
首先,感谢所有阅读此书的人。我可以使用给定的命令将IP CAM中的流保存到文件中(尽管我没有将音频记录到文件中,如果有人可以帮助的话,那也很棒)
cvlc“ http://***.***.*.***:**** / videostream.asf?user = admin&pwd = * *&rate = 12&resolution = 32”-运行时间= 10- sout =“#std {access = file,mux = asf,dst = path \ test.asf}” vlc:// quit --qt-start-minimized --no-qt-notification
这给了我7到8秒钟的录制时间,但是我要制作的视频的时长将由外部因素(相机的运动检测警报)决定。如果删除“-运行时”,它将开始清晰记录,那么如何告诉VLC该停止保存流了?ps:我想让它自动执行,所以我只使用命令行。ps2:我正在使用Ubuntu OS。
非常感谢大家!
我试图使用来自IP摄像机的RTSP流作为Windows上各种应用程序的视频输入源(例如,skype).
到目前为止,我发现的唯一解决方案是使用" webcam 7 ",这是一个获取RTSP流的应用程序,并创建一个虚拟驱动程序,在系统中注册为网络摄像头,然后任何应用程序都可以使用.不幸的是,这个应用程序经常变得不稳定并可能随机崩
有没有替代/更好的方法来实现这一目标?
我正在尝试从IP摄像机的RTSP MJPEG流构造JPEG图像。我正在使用CURL来获取RTSP数据,然后遵循JPEG压缩视频RFC的RTP有效负载格式
我已经成功地形成了其中没有量化表的JPEG图像。但是,使用Q类型128时,我的算法无法正确组装JPEG图像。
我知道有像ffmpeg和gstreamer这样的库可以执行此解码,但是由于其他一些问题,我无法使用它们。我也看过其他帖子,我认为我正在正确解码流。但是在JPEG解压缩后,图像看起来像这样。背景图像看似正确,但是在图像上散布了不正确的水平带。

这是我正在使用的代码片段:
while(!firstPacketFound) {
std::cout << "-----------RTP Packet: " << index++ << " starting at " << startOfRTPPacketIterator << "---------"<< endl;
isFirstPacket = false; isLastPacket = false;
// 0 - LibCurl header
// 1 - channel identifier
// 2, 3 - packet length
uint16_T packet_length_msb = f[ startOfRTPPacketIterator+2];
uint16_T packet_length_lsb = f[ startOfRTPPacketIterator+3];
packet_length = packet_length_msb << 8 | packet_length_lsb;
std::cout << "Packet Size: " << packet_length << endl;
// 4 - …Run Code Online (Sandbox Code Playgroud) 我正在用 Python 开发一个应用程序来控制兼容 ONVIF 的相机。
软件:Debian Wheezy、Python 2.7、Quatanium python-onvif 客户端
硬件:Raspberry Pi 2 B、本地路由器上的 IP 摄像头、用于开发的 wifi/VNC
所需的 PTZ 功能包括绝对移动、相对移动、连续移动、停止和使用预设位置。通过下面提取的测试代码,除了绝对和相对移动之外,所有这些都可以工作。所有这些代码执行时没有任何错误,但相机不会因绝对或相对移动而移动。我希望有人能提出这两个函数的问题。该示例有点长,但我尝试包含足够的代码来显示工作部分和非工作部分(带有大写注释)之间的对比,以供参考和测试。
测试草图:
#!/usr/bin/python
#-------------------------------------------------------------------------------
#Test of Python and Quatanium Python-ONVIF with NETCAT camera PT-PTZ2087
#ONVIF Client implementation is in Python
#For IP control of PTZ, the camera should be compliant with ONVIF Profile S
#The PTZ2087 reports it is ONVIF 2.04 but is actually 2.4 (Netcat said text not changed after upgrade)
#------------------------------------------------------------------------------
import onvifconfig
if __name__ == '__main__':
#Do all …Run Code Online (Sandbox Code Playgroud) 我一直在使用这种嵌入式凭据方法从IP摄像头中检索照片.现在谷歌Chrome更新阻止了这种方法,我收到了这个错误:
[弃用]其URL包含嵌入凭据(例如
https://user:pass@host/)的子资源请求被阻止.有关详细信息,请参阅https://www.chromestatus.com/feature/5669008342777856.
我尝试了另一种方法,使用基本身份验证的JQuery Ajax.但我得到了另一个错误.
XMLHttpRequest无法加载example.com.对预检请求的响应未通过访问控制检查:请求的资源上不存在"Access-Control-Allow-Origin"标头.因此,不允许来源" http://example.com "访问.响应具有HTTP状态代码401.
我不能对Ip相机中的Web服务进行任何更改以允许跨域请求.
看起来我只剩1个选项,即从服务器端检索图像,并将其提供给浏览器?但这会浪费我的服务器带宽.
还有更多的建议/想法吗?
谢谢.
我有一个 Blazor 托管应用程序,我需要根据客户请求从 AXIS 摄像机获取 h264 录制内容(通过 RTSP PLAY 命令)并以浏览器可以重现视频的方式返回它。如果向 AXIS 摄像机查询录音列表,答案包括这个,即我尝试在浏览器上播放的那个
<recording diskid="SD_DISK" recordingid="20211109_122753_1AB3_B8A44F2D0300" starttime="2021-11-09T11:27:53.060281Z" starttimelocal="2021-11-09T12:27:53.060281+01:00" stoptime="2021-11-09T11:43:01.125987Z" stoptimelocal="2021-11-09T12:43:01.125987+01:00" recordingtype="continuous" eventid="continuous" eventtrigger="continuous" recordingstatus="completed" source="1" locked="No">
<video mimetype="video/x-h264" width="800" height="600" framerate="15:1" resolution="800x600"/>
</recording>
Run Code Online (Sandbox Code Playgroud)
我可以通过“开放网络流...”并输入来成功地使用 VLC 重现录音
rtsp://192.168.0.125/axis-media/media.amp?recordingid=20211109_140710_E1A3_B8A44F2D0300
Run Code Online (Sandbox Code Playgroud)
然后提供用户名和密码,所以我确信命令是正确的。通过在 url 中嵌入用户名和密码,也可以在该项目中播放录音,其中使用了我下面使用的更简单的语法,因此我的示例可能有点过于复杂。
服务器端由于RtspClientSharp ,我可以成功检索流,但我无法以正确的方式返回它。到目前为止我有这个:
[HttpGet("RecordingsDemo")]
public async Task<IActionResult> RecordingsDemo() {
string deviceIp = "rtsp://192.168.0.125";
string recordingUri = "rtsp://192.168.0.125/axis-media/media.amp?recordingid=20211109_140710_E1A3_B8A44F2D0300";
Uri playRequestUri = new Uri(recordingUri);
CancellationTokenSource cts = new CancellationTokenSource();
NetworkCredential networkCredential = new NetworkCredential("user", "password");
ConnectionParameters connectionParameters = new ConnectionParameters(new Uri(deviceIp), …Run Code Online (Sandbox Code Playgroud)