网络摄像头手机后面2个摄像头的t/f是什么

2015新型智能摄像头 省掉智能家居ZigBee网关_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
2015新型智能摄像头 省掉智能家居ZigBee网关
||文档简介
南京物联传感技术有限公司是ZigBee联盟中国...|
总评分0.0|
&&智能家居行业爆款!内置ZigBee网关功能的高清网络摄像机!
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩1页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢博客访问: 722330
博文数量: 165
博客积分: 2853
博客等级: 少校
技术积分: 2242
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: 嵌入式
有兴趣的留言一起研究& & 开始做自己的毕业设计了,希望这个暑假能把毕业设计搞完,下学期就去找工作,希望能早到一份好工作。回到正题,经过几天的摸索对H.264远程监控有了一定的认识,特别是图像采集这一块。jpg、yuv、bmp,M-jpeg等。1、首先分析一下手上的资源:& &手上有两款开发板,一款是4.3寸天嵌的tq2440,和一款友善的tiny6410,一个中星微的zc301摄像头,一个coms的ov9650摄像头。mjpg-streamer源码,经过测试zc301的摄像头输出的是经过硬件压缩的jpg格式的图片。ov9650输出的是RGB565(未经测试,网上多处是这样说的)。老师的要求是用H.264编码并进行RTP封装然后发送,从网上得知H.264是目前的主流,所以有了学习的动力,后面希望能把opencv加入进去。客户端准备用android做。2、目前面临的问题:& &jpg格式的图像解码为原始图像后进行H.264压缩是否可行?& &mjpg-streamer是否可以发送H.264文件?& &H.264和RTP封装了解基本为零。3、接下来的工作:& &阅读mjpg-streamer源码。start......4、ffmpeg的学习用ffmpeg采集zc301摄像头的视频输入如下命令-f强制格式转化-r 5设置每秒采集几帧ffmpeg -f video4linux2 -s 320X240 -r 5 -i /dev/video0 t.avi视频是采集到了,可是用linux下的播放器打开视频,视频一闪而过,就闪了一张采集开始的画面,后面就黑屏了,但是那到windows下有可以了。网上说要用servfox(不知道是个什么东西),现在至少可以确认ffmpeg可以将摄像头视频读取出来,现在要做的就是格式转换,H264需要yuv420的格式,现在有两个方案,一是买一个网眼V2000的摄像头,二是看能不能把jpeg转换为yuv420。现在必须学会如何使用ffmpeg的API获取摄像头的一帧图像。4.1用ffmpeg采集一帧摄像头的图像用的上一大牛的程序,不得不说中国人的创造力是多么的有限,网上一搜全是同一个代码,代码如下,程序中有一个小错误,可能是和我开发板有关吧,反正我这个开发板用源程序会出现Segmentation fault,原因是因为AVPacket *packet指针没初始化。正确代码如下,红色部分为出错部分。&#include &#include &#include &#include &#include &&#include &#include &#include &&&void captureOneFrame()&{& & &AVFormatContext *fmtCtx = NULL;& & &AVFormatParameters inputFmtP& & &AVPacket packet, *pkt=&//原来的代码为&AVPacket *或者AVPacket *& & & & && & &//输入格式(V4L2)& & &AVInputFormat *inputFmt = av_find_input_format ("video4linux2");&& & &if (inputFmt == NULL)&& & &{& & & & &printf("can not find_input_format\n");& & & & && & &}&& & &memset (&inputFmtParameter, 0, sizeof(inputFmtParameter));& & &//采集图像的高度& & &inputFmtParameter.height = 240;& & &//采集图像的宽度& & &inputFmtParameter.width &= 320;&& & &//打开摄像头设备& & &if (av_open_input_file ( &fmtCtx, "/dev/video0", inputFmt,& & & & & & & & sizeof(inputFmtParameter),&inputFmtParameter) < 0)& & &{& & & & &printf("can not open_input_file\n");& & & & && & &}& & &//从摄像头获取一帧图像& & &av_read_frame(fmtCtx, pkt);& & &//输出图像的大小& & &printf("data length = %d\n",pkt->size);& & && & &FILE *& & &//打开(新建)文件& & &fp = fopen("out.yuv", "wb");& & &if (fp < 0)& & &{& & & & &printf("open frame data file failed\n");& & & & && & &}& & &//将数据写入文件& & &fwrite(pkt->data, 1, pkt->size, fp);& & &//关闭文件& & &fclose(fp);&& & &//关闭设备文件& & &av_close_input_file(fmtCtx);&}&&&int main()&{& & &avcodec_init(); & && & &avcodec_register_all();& & &av_register_all ();& & &avdevice_register_all();&& & &captureOneFrame();&& & &return 0;&}4.2&undefined reference to `img_convert解决办法是将原有的img_convert函数改为sws_scale函数,原来的函数调用为:// Convert the image from its native format to RGB
img_convert((AVPicture *)pFrameRGB, PIX_FMT_RGB24,
&&&&&&&&&&&&&&& (AVPicture*)pFrame, pCodecCtx->pix_fmt, pCodecCtx->width,
&&&&&&&&&&&&&&& pCodecCtx->height);修改为#include
// other codes
static struct SwsContext *img_convert_
// other codes
img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height,
&pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height,
&PIX_FMT_RGB24, SWS_BICUBIC, NULL, NULL, NULL);
// other codes
// Convert the image from its native format to RGB
sws_scale(img_convert_ctx, (const uint8_t* const*)pFrame->data, pFrame->linesize,
&0, pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize);编译正常,测试后程序可用,搞定。4.3&undefined reference to `avcodec_decode_video'修改为avcodec_decode_video2(pCodecCtx, &pFrame, &frameFinished, &packet); 可是程序还是有错误,Segmentation fault。4.4&X11/extensions/XShm.h: 没有那个文件或目录在这里找到了解决方法X11/extensions/XShm.h: No such file or directory安装x11proto-xext-dev和libxext-dev &通过命令sudo apt-get install libxext-dev解决4.5/opt/webcam/vshow.cpp:111: undefined reference to `sws_getContext(int, int, PixelFormat, int, int, PixelFormat, int, SwsFilter*, SwsFilter*, double const*)'/opt/webcam/vshow.cpp:111: undefined reference to `Ctx::sws'/opt/webcam/vshow.cpp:128: undefined reference to `avpicture_alloc(AVPicture*, PixelFormat, int, int)'vshow.o: In function `vs_show(void*, unsigned char**, int*)':/opt/webcam/vshow.cpp:154: undefined reference to `avpicture_free(AVPicture*)'/opt/webcam/vshow.cpp:155: undefined reference to `Ctx::sws'/opt/webcam/vshow.cpp:155: undefined reference to `sws_freeContext(SwsContext*)'/opt/webcam/vshow.cpp:159: undefined reference to `sws_getContext(int, int, PixelFormat, int, int, PixelFormat, int, SwsFilter*, SwsFilter*, double const*)'/opt/webcam/vshow.cpp:159: undefined reference to `Ctx::sws'/opt/webcam/vshow.cpp:160: undefined reference to `avpicture_alloc(AVPicture*, PixelFormat, int, int)'/opt/webcam/vshow.cpp:184: undefined reference to `Ctx::sws'/opt/webcam/vshow.cpp:184: undefined reference to `sws_scale(SwsContext*, unsigned char const* const*, int const*, int, int, unsigned char* const*, int const*)'collect2: ld returned 1 exit statusmake: *** [webcam_shower] 错误 1解决办法将#include #include 改为extern "C" {#include #include };4.6./webcam_shower: error while loading shared libraries: libavcodec.so.53: cannot open shared object file: No such file or directory1.#vi /etc/ld.so.conf添加一行:/opt/webcam/ffmpeg/lib4.7现在问题又出来了ERR: bind 3020我觉得已经没有办法了,在找找吧。被吓到了,自己粗心了!4.8摄像头输出格式的设置今天发现了一个有趣的事情,摄像头在windows插过后,那到linux开发板上就不能用了。纠结了老半天,后面经过摸索,发现是和摄像头输出格式设置有关,当摄像头插到window平台后,系统对其进行初始化,可能设置为jpeg格式或者其它格式,或者根本就没有。然后然后那到开发板上用就出错了,也不能说出错,是由于我的程序问题,应为我刚才是没有对摄像头进行格式设置,就进行了后面的工作,结果就报错了,经过摸索,专门写了一个函数,功能是列摄像头支持到格式,并且设置需要的格式,至于列出摄像头支持的格式,这个没有进行测试,可能有误,还望指正。代码如下:void CheckAndSetFmt(int fd,char* Sformat){&&&&int rc;&&&&struct v4l2_fmtdesc fmt_desc; //获取摄像头& & memset(&fmt_desc, 0, sizeof(fmt_desc));& & struct v4l2_format fmt; //设置获取视频的格式& & memset(&fmt, 0, sizeof(fmt));&&&&fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; //视频数据流类型,永远都是V4L2_BUF_TYPE_VIDEO_CAPTURE既然是永远了为什么还要弄出个选项了& & fmt.fmt.pix.width = 320; //设置视频宽度& & fmt.fmt.pix.height = 240; //设置视频高度&&&&uint32_t i = 0;&&&&printf("Check the Camera format and Set the format\n");&&&&for(i=0;;i++)&&&&{&&&&&&&&fmt_desc.index = i;&&&&&&&&fmt_desc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;&&&&&&&&rc = ioctl(fd, VIDIOC_ENUM_FMT, &fmt_desc);&&&&&&&&if (rc < 0)&&&&&&&&
break;&&&&&&&&&printf("support {pixelformat= %c%c%c%c, description= %s}\n",&&&&&&&&fmt_desc.pixelformat & 0xFF, &&&&&&&&(fmt_desc.pixelformat >> 8) & 0xFF, &&&&&&&&(fmt_desc.pixelformat>> 16) & 0xFF, &&&&&&&&(fmt_desc.pixelformat >> 24) & 0xFF, &&&&&&&&fmt_desc.description);&&&&&&&&if (strcmp((const char*) fmt_desc.description, Sformat) == 0)//"YUV 4:2:2 (YUYV)"&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV; //视频源的格式为YUYV&&&&&&&&&&&&if (ioctl(fd, VIDIOC_S_FMT, &fmt) >= 0) //使配置生效&&&&&&&&&&&&&&&&&&&&&&&&printf("Set format %s succeed\n",Sformat);&&&&&&&&&&&&else&&&&&&&&&&&&&&&&printf("Set format %s failed\n",Sformat);&&&&&&&&&&&&}&&&&&&&&} }//函数功能列出摄像头支持到格式,并且设置需要到格式int main(int argc, char** argv){&&&&int fd = open("/dev/video0", O_RDWR);&&&&&&&&&&&&//打开摄像头设备,使用阻塞方式打开&&&&if (fd<0)&&&&{&&&&&&&&printf("open error\n");&&&&&&&&return
-1;&&&&}&&&&CheckAndSetFmt(fd,"YUV 4:2:2 (YUYV)");&&&&return 0;}&4.9摄像头缓冲区映射的问题//&mmap&&&&&&&&&&&&v4l2_buffer buf;&&&&&&&&&&&&for&(int&i&=&0;&i&<&BUFSISE;&i++)&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&memset(&buf,&0,&sizeof(buf));&&&&&&&&&&&&&&&&buf.type&=&Rebufs.type;&&&&&&&&&&&&&&&&buf.memory&=&Rebufs.memory;&&&&&&&&&&&&&&&&buf.index&=&i;//如何不加这个会出现四个映射在同一个摄像头缓冲区上&&&&&&&&&&&&&&&&if&(ioctl(id,&VIDIOC_QUERYBUF,&&buf)&<&0)&{&&&&&&&&&&&&&&&&&&&&fprintf(stderr,&"%s: VIDIOC_QUERYBUF ERR\n",&__func__);&&&&&&&&&&&&&&&&&&&&close(id);&&&&&&&&&&&&&&&&&&&&delete ctx;&&&&&&&&&&&&&&&&&&&&return 0;&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&ctx->bufs[i].length&=&buf.length;&&&&&&&&&&&&&&&&ctx->bufs[i].start=&mmap(NULL,&buf.length,&PROT_READ|PROT_WRITE,MAP_SHARED,&id,&buf.m.offset);&&&&&&&&&&&&&&&&fprintf(stderr,&"buf.length=%d buf.m.offset=%d\t ctx->bufs[i].start=%d\n",buf.length,buf.m.offset,ctx->bufs[i].start);&&&&&&&&&&&&}&5.H264相关5.1 AVPicture解析
typedef struct AVPicture {& & uint8_t *data[AV_NUM_DATA_POINTERS];& & int linesize[AV_NUM_DATA_POINTERS]; & & ///< number of bytes per line} AVP复习一下C语言支持,指针为4个字节,让我纠结了1个多小时,uint8_t* data[AV_NUM_DATA_POINTERS]是指针数组存储的是4个字节的指针!//================================对应AVPicture里面有data[4]和linesize[4]其中data是一个指向指针的指针(二级、二维指针),也就是指向视频数据缓冲区的首地址,而data[0]~data[3]是一级指针,可以用如下的图来表示:data -->xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&&&&&&& ^&&&&&&&&&&&&&&& ^&&&&&&&&&&&&& ^&&&&&&& |&&&&&&&&&&&&&&& |&&&&&&&&&&&&& |&&&&&&&& data[0]&&&&& data[1]&&&&&&&& data[2]比如说,当pix_fmt=PIX_FMT_YUV420P时,data中的数据是按照YUV的格式存储的,也就是:data -->YYYYYYYYYYYYYYUUUUUUUUUUUUUVVVVVVVVVVVV ^ ^ ^ | | | data[0] data[1] data[2]linesize是指对应于每一行的大小,为什么需要这个变量,是因为在YUV格式和RGB格式时,每行的大小不一定等于图像的宽度,对于RGB格式输出时,只有一个通道(bgrbgrbgr......)可用,即linesize[0],和data[0],so RGB24&: data[0] = packet rgb//bgrbgrbgr......linesize[0] = width*3其他的如data[1][2][3]与linesize[1][2][3]无任何意义.而对于YUV格式输出时,有三个通道可用,即data[0][1][2],与linesize[0][1][2],而yuv格式对于运动估计时,需要填充padding(right, bottom),故:linesize=width+padding size(16+16).int rs = sws_scale(ctx->sws, ctx->pic_src.data, ctx->pic_src.linesize,
0, ctx->rows, ctx->pic_target.data, ctx->pic_target.linesize);经过sws_scale函数后ctx->pic_target.data[0],ctx->pic_target.data[1],ctx->pic_target.data[2]分别存储了Y,U,V平面的首地址。这是通过代码进行测试得出的结论,关键代码代码:ctx->pic_src.data[0] = (unsigned char*)ctx->bufs[buf.index].start;&&&&ctx->pic_src.data[1] = ctx->pic_src.data[2] = ctx->pic_src.data[3] = 0;&&&&ctx->pic_src.linesize[0] = ctx->bytesperrow;&&&&ctx->pic_src.linesize[1] = ctx->pic_src.linesize[2] = ctx->pic_src.linesize[3] = 0;&&&&fprintf(stderr, "ctx->pic_src.data[1] =%d\n", ctx->pic_src.data[1]);&&&&// sws_scale&&&&int rs = sws_scale(ctx->sws, ctx->pic_src.data, ctx->pic_src.linesize,&&&&&&&&&&&&0, ctx->rows, ctx->pic_target.data, ctx->pic_target.linesize);&&&&fprintf(stderr, "ctx->pic_target.data[1] =%d\n", ctx->pic_target.data[1]);&&&&// out&&&&for (int i = 0; i < 4; i++) {&&&&&&&&pic->data[i] = ctx->pic_target.data[i];&&&&&&&&pic->stride[i] = ctx->pic_target.linesize[i];&&&&&&&&fprintf(stderr, "pic_target.data[%d] =%d\n",i, ctx->pic_target.data[i]); fprintf(stderr, "ctx->pic_target.linesize[%d] =%d\n",i, ctx->pic_target.linesize[i]);&&&&}串口答应的结果:ctx->pic_src.data[1] =0ctx->pic_target.data[1] =182048pic_target.data[0] & & & & &=105248ctx->pic_target.linesize[0] =320pic_target.data[1] & & & & &=182048ctx->pic_target.linesize[1] =160pic_target.data[2] & & & & &=201248ctx->pic_target.linesize[2] =160pic_target.data[3] & & & & &=0ctx->pic_target.linesize[3] =0<font color="#f0-00=320x240。因为是单个平面,所以一个像素点一个字节。Y、U、V的宽度分别是320,160,160这应该是4:2:0产生的效果,为什么是4:2:0一直没弄懂。5.2 ffmpeg的H264软件编码和ARM11提供的H264硬件编码的比较分别用两种方法进行采集图片并压缩为264格式,得出的结果是硬件编码大约是软件编码的10倍,如图:ARM11硬件编码平均0.25s抓取和压缩一张图片(像素为320x240)ffmpeg软件编码平均2.2s抓取和压缩一张图片看了我还是低估了ARM11的硬件压缩速度,上图的数据为ARM11压缩一帧264图片的时间,单位为秒,captuere是打印的时候没改!5.3&ARM硬件编码的h264视频播放很快那是应为一般播放器每秒播放30fps,而我们的h264格式的视频并没有这些信息,而且我的摄像头每秒只能获取4到5帧的图像,也就是说我用暴风影音播放1秒钟其实是播放了6到7秒的采集图像,所以说视频播放的很快。解决办法:1.在解码一张图片后的时候稍微延时一下。 & 2.用rtp协议(里面有个时间戳,现在正在看)6.live555的学习live555的安装:解压修改config.armlinux 中第一行:CROSS_COMPILE?=&&& &&& arm-linux- 其他的没有变了。然后./genMakefile armlinux。再make,就OK了,它没有make install。
7.vlc流媒体搭建我使用的是vlc-0.9.9,刚开始用的其它版本,要嘛就是telnet连不上,要嘛就是播放不了,1. 打开命令行服务,监听5554媒体端口vlc.exe -I telnet --control telnet --telnet-password videolan --rtsp-host 172.19.72.110:5554 &//密码如果自己设置需要一定的复杂度,不然设置不了2. 登录RTSP点播服务器在这里我是运用SecureCRT软件进行telnet登录。界面如下所示:当点击连接后,要求输入密码:videolan,回车后如果显示:Welcome, Master,则表明登录成功。3. 在vlc命令行接口中新增一个条目new fzhman vod enabled input D:\TDDOWNLOAD\1.avi4. 在客户中的vlc中- 打开网络媒体- 输入下面的东东就可以观看大片啦rtsp://172.19.72.110:5554/fzhman7.2vlc通过网络上的sdp文件打开视频vlc -vvv (视频文件地址) --sout "rtp{dst=172.19.72.255(采用广播方式),port=1234,sdp=rtsp://172.19.72.110:8080/test.sdp}"刚开始这条命令一直不行,结果把下面的流程做了一边又行了,目前不知道原因首先进入到VLC的安装目录下,执行类似如下的命令:vlc –ttl 12 -vvv –color -I telnet –telnet-password videolan –rtsp-host 219.219.218.239:5554对上述参数的解释:–ttl:是对hop的限制;-vvv选项用来输出错误信息,可以省略;219.219.218.239是RSTP点播服务器的主机地址; videolan 是telnet登录RTSP点播服务器时输入的口令,这两个部分用户可以根据自己的情况进行修改。登录RTSP点播服务器在这里我是运用SecureCRT软件进行telnet登录。界面如下所示:当点击连接后,要求输入密码:videolan,回车后如果显示:Welcome, Master,则表明登录成功。在主机名栏输入:219.219.218.239,该内容必须与前面建立的RTSP点播服务器的主机地址一致;在端口栏输入:4212,该端口号在使用VLC默认设置时不能改为其他的数值。接下来就可以设置点播文件了在登录成功的界面上,输入以下的命令:new Test vod enabled&setup Test input myVideo.mpg最后,就可以在客户端观看视频,命令如下:vlc rtsp://219.219.218.239:5554/Test还可以通过VLC播放器的VLM进行可视化配制,并生成.vlm配置文件,然后利用SecureCRT工具登录到RTSP点播服务器,利用load命令将配置文件导入,使用show命令可以查看导入的文件信息。测试结果:CDXA/MPEG-PS&& 未经过编码转换即可播放,但是仅可以用VLC播放器进行播放。原因是其他播放器无法解析&中的Test文件名。7.3知己做的rtsp服务器和网上的rtsp服务器的区别1)先说网上的rtsp服务器,我是通过千里眼()获取的视频了进行抓包分析rtsp://218.204.223.237:554/mobile/1/691F/syiubra2azl52x0g.sdp如下图产生的问题:1、RTP到底是用TCP发生还是用UDP发送,根据抓包的情况应该是通过TCP发发送的,(推测可能是应为远距离传输所以采用的是RTP打包为TCP)。2)下面是对我自己的RTSP服务器抓包分析可以看到我还没点击播放rstp服务器就向客户端发送UDP包了!也就是说rtsp://172.19.72.110:8080/test.sdp只是让vlc知道如何去解析这些udp包点击播放,就可以看到视频了总结:我自己通过vlc做的简单的rstp服务器只是将视频同通过打包为RTP然后通过UDP发送到固定IP或者广播到局域网中,然后客户端通过vlc通过读取指定rtsp://172.19.72.110:8080/test.sdp的sdp文件对udp进行解析并播放,我都不清楚我的到底是不是rtsp流媒体服务器,服务器直接就发送了,好像都没看到过RTSP协议的影子,要是用3G网卡哪的多耗流量呀,还有就是估计远程传输得用TCP模式的RTP。希望我的这些猜测能在后面得到证实7.4&RTSP传输方式由什么决定呢? TCP or UDP请教一个问题:RTSP 中 SETUP 命令中传输方式是有什么指定呢? 是由服务器决定的吗?SETUP rtsp:///sample.3gpTransport: RTP/AVP/TCP 【TCP传输方式】 或Transport: RTP/AVP 【UDP传输方式】-------------------------我用的是openRTSP,如果没有 -t 参数的话,就接受不到数据,加上-t 才能收到数据。-t 参数为 TCP方式传输.&&我用抓包工具观察&&有-t 的话 Transport: RTP/AVP/TCP;无-t 的话 Transport: RTP/AVP;-----------------------对于一个未知的服务器,这么判断服务器是什么方式传输呢? udp 还是 tcp&&------解决方案--------------------------------------------------------openRTSP有-t参数说明使用tcp接收数据;无-t默认是UDP接收数据,而无-t参数接收不到数据,大概是因为你机器狮子内网,而rtsp server是在外网吧?如果rtsp server在外网,外网udp数据自然无法到达你所在的内网的;rtsp协议本身不支持似网穿透、UDP打洞等;&------解决方案--------------------------------------------------------貌似发describ的时候,服务器会返回一些信息的吧,貌似就能知道是tcp还是udp了。------解决方案--------------------------------------------------------openRTSP有-t是TCP方式。用vlc2.0.1做rtsp服务器,vlc-0.9.9没有rtsp这个选项,早知道vlc很强大, 但是流媒体功能一直没有成功过, 今天终于成功了, 分享经验给大家举例, 本地有一视频文件打开vlc, [media]->streaming-> load your media file-> press[streaming]&output类型选mmsh,& 地址选你本机的ip地址, 端口可以不用变 1234[方案 或 档案]选 video- wma wmv& 或 windows(wmv or asf)然后点击[streaming]接下来在ie的地址栏里写入mms://your ip address:1234就可以看到你现在正在播放的视频流媒体了7.5到底是选择live555还是vlc做rtsp服务器了?做如下分析在androd的官方文档中提到官方文档:提到The following network protocols are supported for audio and video playback:RTSP (RTP, SDP)HTTP/HTTPS progressive streamingHTTP/HTTPS live streaming draft protocol:MPEG-2 TS media files onlyProtocol version 3 (Android 4.0 and above)Protocol version 2 (Android 3.x)Not supported before Android 3.0VideoView类支持以上视频流的播放,经测试似乎只有mpeg4编码的视频才能通过rtsp发送到android上显示(1)创建H264 编码结构。调用SsbSipH264EncodeInit (width, height, frame_rate, bitrate, gop_num)函数实现的,其中width 表示图像的宽度,height 表示图像的高度,frame_rate 表示帧频,bitrate 表示比特率或码率,gop_num 表示两个相离关键帧之间最多包含多少个帧(B 或P 帧)。
获取linux系统时间的函数char *timeString(char *str){ struct & tm & & *&& & long & & &&& & int & & &year,mon,day,hour,min,& & ts & &= & time(NULL);&& & ptm & = & localtime(&ts);&& & year &= & ptm-> tm_year+1900; & & //年&& & mon & = & ptm-> tm_mon+1; & & & & //月&& & day & = & ptm-> tm_ & & & & &//日&& & hour &= & ptm-> tm_ & & & &//h为与现在相比的时间差,h为0时表示当前时间& & min & = & ptm-> tm_ & & & & & //分&& & sec & = & ptm-> tm_ & & & & & //秒 sprintf(str, "%d-%d-%d-%d-%d-%d", year, mon, day, hour, min, sec);& &}select如果被信号终端会返回-1,并置errno为EINTR。
阅读(27608) | 评论(1) | 转发(12) |
相关热门文章
给主人留下些什么吧!~~
老师你好&,我也遇到同样的问题,请教一下&中星微的zc301摄像头&能输出YUV420的视频流吗?若不能,怎么用ffmpeg&把JPEG格式转换成YUV420P,您的代码中好像是直接存成YUV的我也想用x264编码,希望能得到老师的指点,谢谢
请登录后评论。下载作业帮安装包
扫二维码下载作业帮
1.75亿学生的选择
网络摄像机怎么装
1. 网络连接; R: u* @% r+ g1.1 通过 IP 共享器连接网络摄像机(或DVS)连接示意图如下:图1-1 网络摄像机(或DVS)通过共享器连接到网络% w5 f+ e7 j! [' s' a/ @1 v
g) d- Q/ q步骤1 :将网线连接到网络摄像机(或DVS)的LAN接口;步骤2 :将所配的电源适配器连接到网络摄像机(或DVS)的电源插孔上,并连接市电;步骤3 :将接入网络摄像机(或DVS)的网线的另一端连接到交换机、路由器或者集线器上;5 R; e0 o& u& m0 H1 M! A+ v步骤4 :连接好后,在IE浏览器中输入网络摄像机(或DVS)的IP地址,就可以实现正常访问.' G7 R2 v7 L2 X! Y# l1.2 通过交叉网线直接连接网络摄像机(或DVS)通过交叉网线直接将网络摄像机(或DVS)与电脑连接起来,如下图:图1-2 通过交叉网线与电脑直连网络正常情况下在5秒内网络的连接灯(橙色)会闪烁,此时网络摄像机(或DVS)的物理连接成功.2. 搜索设备及修改网络参数/ @5 i( D) Q7 R2 p- U网络摄像机(或DVS)在出厂时的IP地址为192.168.55.160,子网掩码为255.255.255.0/ z: X6 W8 l1 `: V出厂时的管理员用户名为admin、密码为admin8 Q- R) N( d7 ^: V5 J当遗忘了设备的IP地址或需要重设设备IP地址时,可以通过“IPC4_Search.exe”软件来进行跨网段搜索IDRS-IPC4系列网络摄像机(或DVS)设备,可以直接在搜索结果中显示在线设备的名称、IP地址等信息,也可以直接修改相关网络参数.“IPC4_Search.exe”软件位于网络摄像机(或DVS)的配套软件包中的“IDRS-6000S-HC(HS&HD) Server(V8.33)_CH\CopyFile”或“IDRS-6000S-HC系列\NVR_Client(V8.33_CH)\CopyFile”文件夹里面,“IPC4_Search.exe”软件无需安装,直接双击运行即可,软件启动后会自动搜索局域网内的IP摄像机,然后以列表形式显示出来,如下图所示:/ \* F1 w/ k* p: R5 p/ S/ @* P6 o7 P. n% F5 B' h! F图2-1* t: s5 u- G1 M+ H0 U6 E/ H/ _在此界面中可以更改当前选中设备的IP地址和端口,修改完毕后点击下方的【Modify】按钮进行修改确认.点击【Modify】按钮以后,远程设备会自动重新启动(重启占用时间15秒左右),重启后新的IP地址即刻生效.〖Server Name〗:显示设备名称,此处不可修改.〖IP Address〗:显示当前IP地址,可以修改成新的IP地址.〖Port〗:显示当前端口号,可以修改成新的端口号.〖User Name〗/〖Password〗:修改完新的IP地址和端口后需要输入原始用户名和密码进行身份确认,如果用户名和密码输入不正确,不能对远程设备IP地址和端口进行修改.【Update IP List】:更新设备列表.5 C' o0 T& t+ @' B0 t9 J4 l【Clear IP List】:清除设备列表.- ?
Y+ }8 u8 [1 [/ l) Z2 ~! K6 l【Modify】:确认修改设置.8 j% W! y2 B# Q. e5 p6 v4 s【Exit】:退出并关闭软件.注意:: p/ C2 f: E/ C. ~
i8 a: |+ }运行”IPC4_Search.exe”软件进行搜索及修改其网络参数时,由于”IPC4_Search.exe”软件使用多播协议进行跨网段搜索设备网络信息,某些防火墙是不允许多播数据包通过.所以,必须先将防火墙关闭,才可获取到设备网络信息.& o0 n9 m, V' E$ V$ _8 U" u如何测试网络摄像机(或DVS)是否启动正常及连接是否正确: 在WINDOWS下按照操作,打开命令行窗口,在命令行窗口内输入:ping 192.168.0.125 (192.168.0.125为网络摄像机的IP地址),然后回车.看是否能ping通网络摄像机(或DVS),能ping通则说明网络摄像机(或DVS)工作已正常且网络连接正确.如果ping不通请检查网络摄像机(或DVS)的IP地址、网关等设置是否正确及检查网线是否连通等,如下图所示:2 {$ b2 _' T/ ^3 V3 w5 @( a: g图2-2/ V. i/ T9 O4 c$ p( x# l8 V# w3. IE控件下载安装' T. B6 P7 B' F- T3 Q当首次用浏览器(Internet Explore)访问网络摄像机(或DVS)时,必须安装插件.插件安装方法:在浏览器(Internet Explore)地址栏输入网络摄像机(或DVS)的IP地址,进入登录页面,如下图所示:! y* p) s, {& J; R6 h: U, n/ [, k3 ~1 q+ R( d, P4 Z图3-1点击【下载地址】,弹出文件下载对话框,选择【运行】或【保存】进行下载,下载完成后双击下载文件xdview.exe,点击Install按钮,进行控件的安装,安装成功后提示“Register OCX success!”,如下图所示:, M; D" l' M& x7 h图3-2$ @4 l8 J* A- a, k- S) f% W* Z若安装前PC有打开的浏览器(Internet Explorer),则会提示如下图所示,点击“确定”按钮,将会关闭所有已打开的浏览器(Internet Explorer).图3-3安装成功后重新打开浏览器(Internet Explorer), 输入网络摄像机(或DVS)的IP地址,进入登录页面,输入用户名(出厂值为admin)和密码(出厂值为admin),点击登陆,进入主界面,如下图:) ]% S0 t& N% E! u3 {图3-44. 网络摄像机(或DVS)占用的网络端口- r# R, K4 G0 f4 s9 ~. A5 m0 k网络摄像机(或DVS)默认占用了以下几个网络端口:TCP
Web端口7 k& E3 i8 @4 j5 t* t& t2 t. V5000
通讯端口、音视频数据传输端口、对讲数据传输端口UDP
音视频数据传输端口多播端口
多播起始端口 + 通道号/ L# h# ?" z' y2 _5. 网络摄像机(或DVS网络环)在不同境下的访问; \; S& j5 R% b- m您可以用您的电脑通过局域网或者广域网访问网络摄像机(或DVS),以下将告诉您如何在不同的网络环境下使用网络摄像机(或DVS).( r, R$ ?, Z; u5.1 局域网在局域网内您的电脑IP必须与网络摄像机(或DVS)的IP设置为同一网段,这样才能实现访问.网络拓扑如下图:0 X" ?0 W1 F6 Q' L3 B6 p网络设置请参照如下图:* |) J, c' _# W5 B9 `# |设置步骤:9 Y* c5 ^! u5 P+ X! [4 W第一步:用IE浏览器登陆网络摄像机(或DVS)(设备出厂默认IP为192.168.55.160).$ @+ |! b/ _: [0 a4 ~
P6 M& L$ G( q地二步:切换到【网络设置】页面,在【基本参数】中填入网络管理员分配好的设备IP地址,例如192.168.55.160;第三步:填入子网掩码,设备默认为:255.255.255.0;! D- V/ I$ z) j" |第四步:填入网关地址,设备默认为:192.168.55.1;设置完参数,点击【保存】按钮,设备重启后,在IE浏览器中输入设备的IP地址即可访问设备.5.2 Internet(互联网)您可以通过三种方式让网络摄像机(或DVS)连接到互联网:* W4 e/ Z9 G" U# f8 X. B( f0 r. ?固定IP模式;路由器共享上网模式;# M+ I$ C# m
W- a9 J通过PPPoE拨号上网模式.网络摄像机(或DVS)连接到互联网后,远程Internet用户可通过域名或IP地址直接访问网络摄像机(或DVS).A. 固定IP模式网络拓扑图如下图:& a4 @9 I/ F6 M: h3 e0 I7 V$ F# J$ e' l, g& Y6 N
d设置步骤:第一步:通过交叉线直连的方式登录网络摄像机(或DVS).(详见【网络连接】)
f9 N4 k+ {+ |6 Z第二步:切换到页面,在中填入从网络服务商申请到的IP地址,例如:218.84.31.161;8 s! p) a" G
g第三步:填入正确的子网掩码,例如:255.255.255.192;第四步:填入正确的网关,例如:218.84.31.130;9 E3 D9 ^
E; y! h设置完参数,点击【保存】按钮,设备重启,然后将设备连入到公网,则所有Internet用户可以通过在IE地址栏输入网络摄像机(或DVS)的IP地址进行远程访问.B. 路由器共享上网模式* o, R; h" z! W) l7 A如果网络摄像机(或DVS)设备使用的是局域网内网IP地址通过路由器共享上网,可以通过设置路由器端口映射来让外网用户直接访问到设备.端口映射设置步骤:" l7 g7 P3 ^1 }( L# I' _. ]* e以TP-LINK的TL-WR340G路由器举例说明:9 X3 P2 e1 d4 `+ P第一步:询问网络管理员,获得路由器的IP地址(即局域网网关地址)、登陆用户名和密码,登陆路由器.打开主界面如下:第二步:打开“转发规则”,选择“虚拟服务器”,页面如下图:' m: \, j" I% y3 b6 C0 k* O! {, O7 m- W3 a第三步:选择“添加新条目”,输入网络摄像机(或DVS)的IP地址(如:192.168.1.100)、端口(如:85)、状态(如:生效)等信息,点击保存,页面如下图:8 @1 u) t* Z8 h- ?4 K8 u8 I7 e, U" n第四步:保存成功后,页面如下图:设置好端口映射以后,所有Internet用户可以通过在IE地址栏输入:http://外网IP:映射端口来远程访问网络摄像机(或DVS).C. 通过PPoE拨号上网模式1 ^3 ]: o" F! f& ?" u6 t1 o* J网络摄像机(或DVS)拨号上网,网络拓扑图如下:5 D
_( ~2 b6 Z4 M7 ]+ `* R9 v6 d: T6 e3 S5 v! \1 ^8 Y/ L设置步骤:第一步:通过交叉线直连的方式登录网络摄像机(或DVS).(详见【网络连接】)7 y6 F0 t1 b5 l
}- U2 _3 N% p第二步:设置PPPoE参数.(详见【PPPOE设置】)第三步:把网络摄像机(或DVS)接入到Internet.第四步:若设备成功设置了DDNS服务,则可以通过在IE地址栏输入域名来访问设备了.
为您推荐:
其他类似问题
扫描下载二维码

我要回帖

更多关于 手机后面双摄像头 的文章

 

随机推荐