freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于mjpeg-streamer的遠程視頻監(jiān)控系統(tǒng)(編輯修改稿)

2025-07-24 18:10 本頁面
 

【文章內(nèi)容簡介】 ir /dev/pts mount t devpts devpts /dev/pts echo /sbin/mdev /proc/sys/kernel/hotplug mdev s mkdir p /var/lock /bin/hostname F /etc/sysconfig/HOSTNAME /sbin/ifconfig eth0 up/bin/mount n o nolock,rsize=1024,wsize=1024,timeo=15 :/ /tmp/sbin/telnetd9). 修改profile文件,內(nèi)容如下: Ash profile vim: syntax=sh No core files by default ulimit S c 0 /dev/null 2amp。1 USER=`id un` LOGNAME=$USER PS1=39。[\u@\h \W] 39。 PATH=$PATH HOSTNAME=`/bin/hostname` export USER LOGNAME PS1 PATH10)將交叉編譯器的庫拷貝到rootfs/lib 11)在dev目錄下,創(chuàng)建兩個設(shè)備節(jié)點: mknod console c 5 1 mknod null c 1 3(4) 制作yaff根文件系統(tǒng)鏡像工具:mkyaffs2image128M,命令如下:./mkyaffs2image128M rootfs 。結(jié)合之前的內(nèi)核系統(tǒng)就可以運行了。需要注意的是串口工具不能再使用DNW了,否則會顯示亂碼。原因是busybox配置了很多新功能,比如采用不同的顏色顯示不同類型的文件,而DNW不支持這些功能??梢愿挠贸壗K端或者PuTTY。移植成功后在PuTTY上顯示的界面如圖3。其中“yaffs:dev is 32505859 name is “mtdblock3” rw”表明文件系統(tǒng)移植成功?!癷nput:Vimicro USB Camera (Altair) as /class/input/input0”表明攝像頭已經(jīng)成功掛載,其設(shè)備文件名為input0?!癳th0:link up,100Mbps,fullduplex, lpa 0x45E1”表明網(wǎng)卡驅(qū)動成功。最后出現(xiàn)“[root@FL2440Chen /]”就表明系統(tǒng)運行成功,進入了控制臺。之后是測試文件列表命令ls的輸出結(jié)果。圖3 啟動后的串口輸出界面 4 視頻采集本章主要介紹了Linux系統(tǒng)中視頻設(shè)備的通用調(diào)用接口V4L2,通過它可以實現(xiàn)操作攝像頭,獲取視頻數(shù)據(jù)。首先是介紹對視頻設(shè)備的一般操作流程,之后對具體實現(xiàn)代碼進行了詳細的分析。 V4L2簡介V4L2(Vedio For Linux Two)是在Linux中操作音視頻設(shè)備的一套統(tǒng)一的API, 是V4L的升級版。它是linux內(nèi)核提供給用戶空間的編程接口。V4L2可以分為三層。底層為音視頻設(shè)備在內(nèi)核中的驅(qū)動程序,如果是自己開發(fā)驅(qū)動就要實現(xiàn)這一層的底層函數(shù),如打開,初始化等。上層是為用戶編程提供的API,本設(shè)計中主要是調(diào)用該層的接口函數(shù)。中間層為VFS(Virtual File Systerm),連接底層和上層的,最大的作用是可以實現(xiàn)統(tǒng)一的接口調(diào)用。而對于用戶編程來說,需要了解的就是如何使用系統(tǒng)提供的API。 視頻采集的實現(xiàn) 視頻采集流程視頻設(shè)備的一般操作流程:1)打開設(shè)備文件。如以讀寫方式打開:fd=open(/dev/video0,O_RDWR)。2)查看設(shè)備具有什么功能,比如是否具有視頻輸入,或者音頻輸入輸出等功能。命令為VIDIOC_QUERYCAP。3)選擇視頻輸入。一個視頻設(shè)備可以有多個視頻輸入。命令為VIDIOC_S_INPUT。4)設(shè)置視頻的制式和幀格式。制式包括PAL,NTSC,幀的格式包括寬度和高度等。命令分別為VIDIOC_S_STD,VIDIOC_S_FMT。5)向系統(tǒng)申請幀緩沖,一般不超過5個。命令為VIDIOC_REQBUFS。6)將申請到的幀緩沖映射到內(nèi)存。普通文件被映射到進程地址空間后,進程可以像訪問普通內(nèi)存一樣對文件進行訪問。傳統(tǒng)的文件訪問方式,首先需要調(diào)用系統(tǒng)調(diào)用open打開設(shè)備文件, 然后調(diào)用read, write以及l(fā)seek等進行順序或者隨機的I/O訪問,效率非常低的, 每一次I/O操作都需要一次系統(tǒng)調(diào)用。 另外, 如果若干個進程訪問同一個設(shè)備文件, 每個進程都要在自己的地址空間維護一個副本, 浪費了內(nèi)存空間。因此本設(shè)計采用更為高效的內(nèi)存映射mmap()。7)將申請到的幀緩沖插入隊列,存儲采集到的數(shù)據(jù)。命令為VIDIOC_QBUF。8)開始視頻采集。命令為VIDIOC_STREAMON。9)從隊列中取出已采集到數(shù)據(jù)的幀緩沖。命令為VIDIOC_DQBUF。10)將幀緩沖重新插入隊尾,這樣可以循環(huán)采集。命令為VIDIOC_QBUF11)停止視頻的采集。命令為VIDIOC_STREAMOFF。12)關(guān)閉視頻設(shè)備。如close(fd)。 關(guān)鍵函數(shù)分析(1) 攝像頭初始化函數(shù)init_v4l2static int init_v4l2(struct vdIn *vd)// 用來描述攝像頭信息的結(jié)構(gòu){ int i。 int ret = 0。 /*1:打開設(shè)備*/ if ((vdfd = open(vdvideodevice, O_RDWR)) == 1) { perror(ERROR opening V4L interface)。 return 1。 } /*2:獲取攝像頭設(shè)備屬性*/ memset(amp。vdcap, 0, sizeof(struct v4l2_capability))。 ret = ioctl(vdfd, VIDIOC_QUERYCAP, amp。vdcap)。 if (ret 0) { fprintf(stderr, Error opening device %s: unable to query device.\n, vdvideodevice)。 goto fatal。 } if ((vd amp。 V4L2_CAP_VIDEO_CAPTURE) == 0) { fprintf(stderr, Error opening device %s: video capture not supported.\n, vdvideodevice)。 goto fatal。 } if (vdgrabmethod) { if (!(vd amp。 V4L2_CAP_STREAMING)) { fprintf(stderr, %s does not support streaming i/o\n, vdvideodevice)。 goto fatal。 } } else { if (!(vd amp。 V4L2_CAP_READWRITE)) { fprintf(stderr, %s does not support read i/o\n, vdvideodevice)。 goto fatal。 } } /*3:設(shè)置攝像頭輸出參數(shù)*/ memset(amp。vdfmt, 0, sizeof(struct v4l2_format))。 vd = V4L2_BUF_TYPE_VIDEO_CAPTURE。 vd = vdwidth。 //捕獲視頻橫向像素 vd = vdheight。 //捕獲視頻縱向像素 vd = vdformatIn。//捕獲視頻格式Y(jié)UV/MJPEG vd = V4L2_FIELD_ANY。 ret = ioctl(vdfd, VIDIOC_S_FMT, amp。vdfmt)。 if (ret 0) { perror(Unable to set format)。 goto fatal。 } /*如果設(shè)置的尺寸超過攝像頭所能設(shè)置的最大像素,就恢復為攝像頭能設(shè)置的最大值*/ if ((vd != vdwidth)||(vd != vdheight)) { fprintf(stderr, format asked unavailable get width %d height %d \n, vd, vd)。 vdwidth = vd。 vdheight = vd。 } /*4:設(shè)置幀率*/ struct v4l2_streamparm *setfps。 setfps = (struct v4l2_streamparm *) calloc(1, sizeof(struct v4l2_streamparm))。 memset(setfps, 0, sizeof(struct v4l2_streamparm))。 setfpstype = V4L2_BUF_TYPE_VIDEO_CAPTURE。 setfps = 1。 setfps = vdfps。 ret = ioctl(vdfd, VIDIOC_S_PARM, setfps)。 /*5:申請幀緩沖 這里NB_BUFFER預先定義為4,也就是四重緩沖*/ memset(amp。vdrb, 0, sizeof(struct v4l2_requestbuffers))。 vd = NB_BUFFER。 vd = V4L2_BUF_TYPE_VIDEO_CAPTURE。 vd = V4L2_MEMORY_MMAP。//內(nèi)存映射方式 ret = ioctl(vdfd, VIDIOC_REQBUFS, amp。vdrb)。 if (ret 0) { perror(Unable to allocate buffers)。 goto fatal。 } /*5:映射幀緩沖到內(nèi)存。對于用戶只需要訪問地址vdmem[i]*/ for (i = 0。 i NB_BUFFER。 i++) { memset(amp。vdbuf, 0, sizeof(struct v4l2_buffer))。 vd = i。 vd = V4L2_BUF_TYPE_VIDEO_CAPTURE。 vd = V4L2_MEMORY_MMAP。 ret = ioctl(vdfd, VIDIOC_QUERYBUF, amp。vdbuf)。/*主要是查出每一個幀緩沖的偏移量offset,也就是哪個地址開始映射*/ if (ret 0) { perror(Unable to query buffer)。 goto fatal。 } vdmem[i] = mmap(0 ,vd, PROT_READ, MAP_SHARED, vdfd, vd)。/*映射的指定地址為0即由系統(tǒng)分配 */ if (vdmem[i] == MAP_FAILED) { perror(Unable to map buffer)。 goto fatal。 }} /*5:把四個幀緩沖形成一個環(huán)形隊列,輪流存儲圖片*/ for (i = 0。 i NB_BUFFER。 ++i) { memset(amp。vdbuf, 0, sizeof(struct v4l2_buffer))。 vd = i。 vd = V4L2_BUF_TYPE_VIDEO_CAPTURE。 vd = V4L2_MEMORY_MMAP。 ret = ioctl(vdfd, VIDIOC_QBUF, amp。vdbuf)。//把幀緩沖插入循環(huán)隊列 if (ret 0) { perror(Unable to queue buffer)。 goto fatal。 } } return 0。fatal: return 1。}(2) 抓圖線程void *cam_thread( void *arg ) { …… /*循環(huán)調(diào)用抓圖函數(shù)uvcGrab()*/ while( !pglobalstop ){ //pglobalstop為全局變量為1時停止抓圖 /* grab a frame */ if( uvcGrab(videoIn) 0 ) { IPRINT(Error grabbing frames\n)。 exit(EXIT_FAILURE)。 }……}(3) 抓取一幀圖像int uvcGrab(struct vdIn *vd){…… if (!vdisstreaming)// 啟動抓圖后isstreaming會賦值為1 if (video_enable(vd))/*開始抓圖*/ goto err。 memset(amp。vdbuf, 0, sizeof(struct v4l2_buffer))。 vd = V4L2_BUF_TYPE_VIDEO_CAPTURE。 vd = V4L2_MEMORY_MMAP。 ret = ioctl(vdfd, VIDIOC_
點擊復制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1