我正在使用OpenCV的VideoCapture(使用ffmpeg支持编译)从IP摄像机传输H264内容.
到目前为止,工作正常,但每隔一段时间我就会出现解码错误(来自我假设的ffmpeg):
[h264 @ 0x103006400] mb_type 137 in I slice too large at 26 10
[h264 @ 0x103006400] error while decoding MB 26 10
[h264 @ 0x103006400] negative number of zero coeffs at 25 5
[h264 @ 0x103006400] error while decoding MB 25 5
[h264 @ 0x103006400] cbp too large (421) at 35 13
[h264 @ 0x103006400] error while decoding MB 35 13
[h264 @ 0x103006400] mb_type 121 in P slice too large at 20 3
[h264 @ 0x103006400] error …Run Code Online (Sandbox Code Playgroud) 我正在开发一个应用程序,它将探测连接在网络上的ONVIF设备以进行自动发现.根据ONVIF Core规范,Probe消息的SOAP格式为:
<?xml version="1.0" encoding="UTF-8"?>
<e:Envelope xmlns:e="http://www.w3.org/2003/05/soap-envelope"
xmlns:w="http://schemas.xmlsoap.org/ws/2004/08/addressing"
xmlns:d="http://schemas.xmlsoap.org/ws/2005/04/discovery"
xmlns:dn="http://www.onvif.org/ver10/network/wsdl">
<e:Header>
<w:MessageID>uuid:84ede3de-7dec-11d0-c360-f01234567890</w:MessageID>
<w:To e:mustUnderstand="true">urn:schemas-xmlsoap-org:ws:2005:04:discovery</w:To>
<w:Action
a:mustUnderstand="true">http://schemas.xmlsoap.org/ws/2005/04/discovery/Pr
obe</w:Action>
</e:Header>
<e:Body>
<d:Probe>
<d:Types>dn:NetworkVideoTransmitter</d:Types>
</d:Probe>
</e:Body>
</e:Envelope>
Run Code Online (Sandbox Code Playgroud)
如何在WCF中发送此消息以发现onvif deivce?
我有一台IP摄像机(Axis M1054),我想录制视频流.我可能会从连续录制开始,但后来我想切换到由运动检测触发的剪辑(在触发发生前几秒预录制),录制以MPEG4(H.264)编码,而不是MJPEG.
有免费的开源Linux软件可以做到吗?我没有通过搜索互联网找到任何东西.你能推荐一些有效且成功使用的东西吗?还是我坚持使用商业软件?
如果使用不同的型号可以更好地使用Linux,我可以更换相机.
我已经在Python中集成了一台带OpenCV的IP摄像头,以便从实时流中逐帧完成视频处理.我已经将相机FPS配置为1秒,这样我就可以在缓冲区中每秒获得1帧处理,但是我的算法需要4秒来处理每个帧,导致缓冲区中未处理帧的停滞,并且会随着时间的推移而不断增长导致指数延迟.为了解决这个问题,我创建了一个Thread,我在调用cv2.grab()API来清理缓冲区,它将指针移动到每个调用中的最新帧.在主线程中,我正在调用retrieve()方法,它给出了第一个Thread抓取的最后一帧.通过这种设计,帧停滞问题是固定的,并且指数延迟被消除,但仍然不能消除12-13秒的恒定延迟.我怀疑当cv2.retrieve()被调用时它没有获得最新的帧,而是来自最新帧的第4或第5帧.OpenCV中是否有任何API或任何其他设计模式来解决此问题,以便我可以获得最新的帧进行处理.
在此先感谢您的帮助.我真的很感激快速反应.
我是android网络的新手.现在我正在做一个与android网络相关的项目.在这个项目中,我想将6个IP摄像机集成到我的项目中,所有摄像机同时进行流动.这款IP摄像机是支持Wi-Fi的摄像机.问题在这里,我们如何将多个wifi设备连接到Android设备?只有我们可以一次连接单个Wi-Fi.但有一种方法是Wi-Fi直接或Hotspot.但IP摄像机如何识别和连接移动热点? 我在互联网上搜索了很多,但我找不到合适的解决方案.所以,如果你们中的任何一个人知道如何解决这个问题,请帮助我.
这是客户端提供的获取Wi-Fi扫描结果的cgi命令
get_wifi_scan_result.cgi
Description: Gets the camera results of search for wireless networks
Certification: administrator
Syntax: /get_wifi_scan_result.cgi
Returns:
ap_number : Refers to the search for how many SSID , The following variable groups, with the first group, for example:
ap_ssid[0]?ssid
ap_mode[0]?0->infra 1->adhoc
ap_security[0]?
0->WEP-NONE
1->WEP
2->WPA-PSK TKIP
3->WPA-PSK AES
4->WPA2-PSK TKIP
5->WPA2-PSK AES
ap_dbm0[0]:
ap_channel:
Run Code Online (Sandbox Code Playgroud) 我有一台IP摄像机,它是MJPEG格式的流媒体视频.现在我的目标是接收它并在我自己的自定义Android应用程序中显示它.为此我在android平台上有三个编程选择:
那么请建议更好的解决方案?
我没有使用FFMPEG或GStreamer的经验.那么这样做的可行性是什么?
在这里,我必须使用RTSP协议从无线IP摄像头获取实时视频流到Android移动设备.摄像头连接到无线路由器,移动设备也有相同的wifi网络.现在我需要实现从摄像头实时视频流.
为此,我该怎么办?这对我来说是新概念.如何以编程方式连接Android手机和相机并获得直播.任何帮助将不胜感激.
我在cpp中有一个opencv应用程序.
它使用opencv中的简单结构捕获视频流并将其保存到视频文件中.
它与我的网络摄像头完美配合.
但是,它可能在大约十秒后崩溃,而我运行它来捕获来自IP Camara的流.
我的编译命令是:
g++ -O3 IP_Camera_linux.cpp -o IP_Camera `pkg-config --cflags --libs opencv`
Run Code Online (Sandbox Code Playgroud)
来自IP cam的我的流被访问如下:
const string Stream = "rtsp://admin:xxxx@192.168.0.101/";
Run Code Online (Sandbox Code Playgroud)
它运行完美,显示视频并保存,直到显示的视频冻结并且应用程序崩溃.虽然终端上的错误消息是:
[h264 @ 0x15e6f60] error while decoding MB 59 31, bytestream (-20)
[h264 @ 0x15e8200] error while decoding MB 61 27, bytestream (-3)
[h264 @ 0x109c880] missing picture in access unit
[h264 @ 0x109c000] no frame!
Run Code Online (Sandbox Code Playgroud)
根据我的理解,上述错误消息中的第二行可能有一些事情要做,但实际上并没有使应用程序崩溃.最后两行可能是原因还是原因?
有帮助吗?
我知道之前已经问过这个问题,但是我试图将一些C++结构/联合转换为Delphi以使用Hikvision SDK却没有成功.
我试图转换的C++结构/联合如下:
struct{
BYTE byEnable;
BYTE byRes1[3];
DWORD dwTriggerType;
NET_ITC_TRIGGER_PARAM_UNION uTriggerParam;
BYTE byRes[64];
}NET_ITC_SINGLE_TRIGGERCFG,*LPNET_ITC_SINGLE_TRIGGERCFG;
union{
DWORD uLen[1070];
NET_ITC_POST_IOSPEED_PARAM struIOSpeed;
NET_ITC_POST_SINGLEIO_PARAM struSingleIO;
NET_ITC_POST_RS485_PARAM struPostRs485;
NET_ITC_POST_RS485_RADAR_PARAM struPostRadar;
NET_ITC_POST_VTCOIL_PARAM struVtCoil;
NET_ITC_EPOLICE_IOTL_PARAM struIOTL;
NET_ITC_EPOLICE_RS485_PARAM struEpoliceRs485;
NET_ITC_EPOLICE_RS485_PARAM struPERs485;
}NET_ITC_TRIGGER_PARAM_UNION,*LPNET_ITC_TRIGGER_PARAM_UNION;
Run Code Online (Sandbox Code Playgroud)
我尝试过以下方法:
PNetItcSingleTriggerCfg = ^TNetItcSingleTriggerCfg;
TNetItcSingleTriggerCfg = record
byEnable: Byte;
byRes1: array [0..2] of Byte;
dwTriggerType: DWord;
uTriggerParam: TNetItcTriggerParamUnion;
byRes: array [0..63] of Byte;
end;
PNetItcTriggerParamUnion = ^TNetItcTriggerParamUnion;
TNetItcTriggerParamUnion = record
case integer of
0: (uLen: array [0..1069] of DWord);
1: (struIOSpeed: TNetItcPostIOSpeedParam);
2: (struSingleIO: TNetItcPostSingleIOParam); …Run Code Online (Sandbox Code Playgroud) 下面给出的代码用于使用OpenCV访问Axis IP摄像机.在运行程序时,它首先显示"打开cap_ffmpeg_impl ...时出错",然后显示找不到相机.
#include <opencv\cv.h>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <iostream>
#include <stdio.h>
using namespace std;
using namespace cv;
int main()
{
Mat frame;
namedWindow("video", 1);
VideoCapture cap("http://IPADDRESS/video.mjpg");
if(!cap.isOpened())
{
cout<<"Camera not found"<<endl;
getchar();
return -1;
}
while ( cap.isOpened() )
{
cap >> frame;
if(frame.empty()) break;
imshow("video", frame);
if(waitKey(30) >= 0) break;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我哪里错了?