linux video?videography
Video4Linux的简介
对中断的处理实现,内存映射功能以及对I/O通道的控制接口函数ioct1的实现等,并把它们定义在struct file_operations中。这样当应用程序对设备文件进行诸如open、close、read、write等系统调用操作时,Linux内核将通过file_operations结构访问驱动程序提供的函数。例如,当应用程序对设备文件执行读操作时,内核将调用file_operations结构中的read函数。在系统平台上对USB口数码摄像头驱动,首先把USB控制器驱动模块静态编译进内核,使平台中支持USB接口,再在需要使用摄像头采集时,使用insmod动态加载其驱动模块,这样摄像头就可正常工作了,接着进行了下一步对视频流的采集编程。
程序中定义的数据结构
struct video_capability grab_cap;
struct video_picture grab_pic;
struct video_mmap grab_buf;
struct video_mbuf grab_vm;
这些数据结构都是由Video4Linux支持的,它们的用途如下:
*video_capability包含摄像头的基本信息,例如设备名称、支持的最大最小分辨率、信号源信息等,分别对应着结构体中成员变量name [32]、maxwidth、maxheight、minwidth、minheight、channels(信号源个数)、type等;
*voide_picture包含设备采集图像的各种属性,如brightness(亮度)、hue(色调)、contrast(对比度)、whiteness(色度)、depth(深度)等;
*video_mmap用于内存映射;
*video_mbuf利用mmap进行映射的帧信息,实际上是输入到摄像头存储器缓冲中的帧信息,包括size(帧的大小)、frames(最多支持的帧数)、offsets(每帧相对基址的偏移)。
程序中用到的主要系统调用函数有:open(/dev/voideo0,int flags)、close(fd)、mmap(void*start,size_t length,int prot,int flags,int fd,off_t offset)、munmap(void*start,size_tlength)和ioctl(int fd,int cmd,…)。
前面提到Linux系统中把设备看成设备文件,在用户空间可以通过标准的I/O系统调用函数操作设备文件,从而达到与设备通信交互的目的。当然,在设备驱动中要提供对这些函数的相应支持。这里说明一下ioctl(int fd,int cmd,…)函数,它在用户程序中用来控制I/O通道,其中,fd代表设备文件描述符,cmd代表用户程序对设备的控制命令,省略号一般是一个表示类型长度的参数,也可没有。
(2)采集程序实现过程
首先打开视频设备,摄像头在系统中对应的设备文件为/dev/video0,采用系统调用函数grab_fd=open(/dev/video0, O_RDWR),grab_fd是设备打开后返回的文件描述符(打开错误返回-1),以后的系统调用函数就可使用它来对设备文件进行操作了。接着,利用 ioctl(grab_fd,VIDIOCGCAP,&grab_cap)函数读取struct video_capability中有关摄像头的信息。该函数成功返回后,这些信息从内核空间拷贝到用户程序空间grab_cap各成员分量中,使用 printf函数就可得到各成员分量信息,例如printf(maxheight=%d,grab_fd.maxheight)获得最大垂直分辨率的大小。不规则用ioctl(grab_fd,VIDIOCGPICT,&grab_pic)函数读取摄像头缓冲中voideo_picture信息。在用户空间程序中可以改变这些信息,具体方法为先给分量赋新值,再调用VIDIOCSPICT ioctl函数,例如:
grab_fd.depth=3;
if(ioctl(grab_fd,VIDIOCSPICT,&grab_pic)<0)
{perror(VIDIOCSPICT);return-1;};
完成以上初始化设备工作后,就可以对视频图像截取了,有两种方法:一种是read()直接读取;另外一种mmap()内存映射。Read()通过内核缓冲区来读取数据;而mmap()通过把设备文件映射到内存中,绕过了内核缓冲区,最快的磁盘访问往往还是慢于最慢的内存访问,所以mmap()方式加速了 I/O访问。另外,mmap()系统调用使得进程之间通过映射同一文件实现共享内存,各进程可以像访问普通内存一样对文件进行访问,访问时只需要使用指针而不用调用文件操作函数。因为mmap()的以上优点,所以在程序实现中采用了内存映射方式,即mmap()方式。
利用mmap()方式视频裁取具体进行操作如下。
①先使用ioctl(grab_fd,VIDIOCGMBUF,&grab_vm)函数获得摄像头存储缓冲区的帧信息,之后修改voideo_mmap中的设置,例如重新设置图像帧的垂直及水平分辨率、彩色显示格式。可利用如下语句
grab_buf.height=240;
grab_buf.width=320;
grab_buf.format=VIDEO_PALETTE_RGB24;
②接着把摄像头对应的设备文件映射到内存区,具体使用grab_data=(unsigned char*)mmap(0,grab_vm.size,PROT_READ|PROT_WRITE,MAP_SHARED,grad_fd,0)操作。这样设备文件的内容就映射到内存区,该映射内容区可读可写并且不同进程间可共享。该函数成功时返回映像内存区的指针,挫败时返回值为-1。
下面对单帧采集和连续帧采集进行说明:
*单帧采集。在上面获取的摄像头存储缓冲区帧信息中,最多可支持的帧数(frames的值)一般为两帧。对于单帧采集只需设置 grab_buf.frame=0,即采集其中的第一帧,使用ioctl(grab_fd,VIDIOCMCAPTURE,&grab_buf)函数,若调用成功,则激活设备真正开始一帧图像的截取,是非阻塞的。接着使用ioctl(grab_fd,VIDIOCSYNC,&frame)函数判断该帧图像是否截取完毕,成功返回表示截取完毕,之后就可把图像数据保存成文件的形式。
*连续帧采集。在单帧的基础上,利用grab_fd.frames值确定采集完毕摄像头帧缓冲区帧数据进行循环的次数。在循环语句中,也是使用VIDIOCMCCAPTURE ioct1和VIDIOCSYNC ioctl函数完成每帧截取,但要给采集到的每帧图像赋地址,利用语句buf=grab_data+grab_vm.offsets[frame],然后保存文件的形式。若要继续采集可再加一个外循环,在外循环语句只要给原来的内循环再赋frame=0即可。
解锁Linux终端上的媒体播放能力MPVlinuxmpv
一直以来,Linux终端一直有杰出的软件表现,越来越多新的程序和发行版使终端变得更加特别,更加好用。尽管这一切都使终端变得更加有趣,通常的命令行用户会被期望使用更多的命令才能完成一个任务,而媒体播放就是一个例子。
MPV(Media Player Video)是一款开源媒体播放器,它在命令行特别有用,因为它提供了类似于VLC播放器一样的功能,但是在一个非图形环境,使用控制台窗口完成。使用MPV,您可以方便地看电影、收听有声小说、观看视频、运行交互式实验等。它可以从HTTP、FTP或任何可以使用的流媒体源播放媒体,可以以MP3、MP4、OGG格式存储的视频文件。
步骤:
1.安装MPV
要安装MPV,首先需要确保你的Linux发行版支持它,可以使用下面的命令检查:
`$ sudo apt-get install mpv`
安装完成后,您需要检查一下播放器的版本:
`$ mpv–version`
2.播放媒体文件
要播放媒体文件,只需使用mpv命令从本地文件系统路径中播放:
`$mpv [filename]`
3.播放远程文件
你也可以使用mpv来播放远程文件,如HTTP协议,FTP协议和其他可支持的流媒体协议。
`mpv []`
4.控制媒体文件
媒体文件的控制也非常简单,使用以下命令即可控制:
暂停/播放:[space]
循环播放:[enter]
快进/快退:[left arrow]/[right arrow]
向上/向下快进/快退:[up arrow]/[down arrow]
离开/退出:[Ctrl+C]/[q]
MPV几乎支持终端中的所有尖端功能,它拥有清晰的支持体验,可以使用命令行处理媒体文件。尽管安装有VLC播放器可以提高多媒体播放的性能,但是如果您想在终端中输入一次就可以完成媒体播放的话,MPV是最好的选择。
Linux系统如何制作Video将摄像头的内容显示出来
现在电脑上可以使用摄像头进行录像做成Video视频,那么在Linux系统下要如何实现呢?首先在制作前需要对内核进行升级,下面随小编一起来学习下吧。
升级内核:
1.这里我用的内核是linux-2.6.32.59版本的,首先下载这个内核
2.下载完毕之后拷贝到Linux中进行解压,tar jxvf linux-2.6.32.59.tar
3.进入linux-2.6.32.59目录把当前内核的配置文件拷贝到当前目录下
cp/boot/config-2.6.18-238.e15。/.config因为我当前用的内核是linux-2.6.18版本的
4.在配置视频所需要的驱动 make menuconfig进入之后找到Device Drivers按回车进入找到MultiMedia Support先按空格键进行选中再按回车键进入找到 Video For Linux按回车键选中再按空格键选中 Video capture adapters将此选项选中之后按回车键进入找到V4L USB devices按空格键选中再按回车键进入找到USB ZC0301[P] ImageProcessor and Control Chip support按空格键选中再找到《M》GSPCA based webcamsà先按空格键选中再按回车键进入在最后一项的菜单下选中ZC3XX USB Camera Driver
5.以上配置好之后再次回到顶层菜单,找到General setup-à按回车键进入找到[]enable deprecated sysfs features which may confuse old usersp按空格键选中
6.经过4,5两步骤已经将视频的驱动配置好退出保存
7.下面进行编译 make此步骤大概需要一个小时左右
8.再次进行 make modules_install
9.再次进行 make install
10.此时查看将摄像头插入USB再次查看设备文件中是否已经有了 video0用ls/dev/命令查看
11.如果有说明安装成功
以上是内核升级的步骤
下面是将摄像头的内容显示出来
1首先安装SDL库在此下载
2.进行解压tar zxvf SDL-1.2.15.tar
3.进入目录 cd SDL-1.2.15再进入 test目录 cd test在test目录下配置。/configure
再进行make则会有许多编译好的程序随便运行一个试试
4.在我上传的资料文件夹中找到servfox-R1_1_3文件夹进入之后首先将Makefile.i386的名字改为 Makefile,
5.编译 make
6.在我上传的资料文件夹中找到spcaview-20061208文件夹进入之后直接make
7.之后将摄像头插入到USB接口首先运行servfox-R1_1_3文件夹中的servfox
。/servfox如果提示出现错误则要把打印的错误语句在spcav4l.c中找到将错误信息删除知道没有错误出现
再次运行
。/servfox-g–w 127.0.0.1:7070–d/dev/video0
8.再次运行spcaview。/ spcaview–g–w 127.0.0.1:7070
此时应该在你的虚拟机上就会显示摄像头拍出来的视频注意此时的项目支持网络
上面就是Linux制作Video的方法介绍了,通过本文的方法,你就可以很轻易的通过摄像头来制作Video视频了,你学会了吗?