基于linux下的音视频采集与传输._第1页
基于linux下的音视频采集与传输._第2页
基于linux下的音视频采集与传输._第3页
基于linux下的音视频采集与传输._第4页
基于linux下的音视频采集与传输._第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于linux下的音视频采集与传输Based on the acquisition and transmission of audio and video under linux摘要:在LINUX下实现对音频和视频的米集,并编写Socket程序将米集到的音频文件在两台主机的进程之间进行传输。关键字:LINUX音频、视频采集 Socket传输1基于linux下的音视频采集与传输Based on the acquisition and transmission of audio and video under linux28项目简介本项目将分成三部分来分别实现,分别为 Linux下视频的采集、Li

2、nux下音 频的采集、Linux下Socket传输的实现。下面将分别介绍各部分具体的实现过 程。Linux下视频采集1、背景介绍V4L,其全称是 Video4Linux (Video for Linux ),是在 linux 内核中关于 视频设备的API接口,涉及开关视频设备、采集并处理视频图像信息。V4L从2.1.x 版本的内核中开始出现。现在出现 Video4Linux2(Video for Linux Two ),简称 V4L2。很显然,他是V4L的改进版,修复了第一代的部分设计bug。从2.5.x开始,V4L2就被集 成到内核里面去了。尽管如此,还是有一部分设备的驱动不支持新版本的V4

3、L2,所以,有时候我们会看到 V4L跟V4L2同时出现在代码里面。Linux系统中,视频设备被当作一个设备文件来看待,设备文件存放在/dev目录下,完整路径的设备文件名为:/dev/videoO .2、视频米集基本步骤视频采集基本步骤流程:打开设备- 检查和设置设备属性- 设置帧格式 -设置一种输入输出方法(缓冲区管理) 循环获取数据 关闭设备。其中打开视频设备非常简单,在V4L2中,视频设备被看做一个文件。使用open函数打开这个设备,打开这个设备有两种模式即阻塞模式和非阻塞模式。 主要实现代码为: 用非阻塞模式打开摄像头设备代码为int cameraFd;cameraFd = ope n(

4、 /dev/video0, O_RDWR | O_NONBLOCK); 用阻塞模式打开摄像头设备,上述代码变为:cameraFd = ope n( /dev/video0, O_RDWR);应用程序能够使用阻塞模式或非阻塞模式打开视频设备, 如果使用非阻塞模 式调用视频设备,即使尚未捕获到信息,驱动依旧会把缓存(DQBUFFF里的东西 返回给应用程序。3、Linux视频设备驱动常用控制命令使用说明设置视频设备属性通过ioctl来进行设置,ioctl有三个参数,分别是fd, cmd, 和parameter,表示设备描述符,控制命令和控制命令参数。Linux视频设备驱动接口 V4L2支持的常用控制

5、命令如下:控制命令 VIDIOC_ENUM_FMT功能:获取当前视频设备支持的视频格式。参数说明:参数类型为 V4L2的视频格式描述符类型struct v4l2_fmtdesc 返回值说明:执行成功时,函数返回值为 0 ; struct v4l2_fmtdesc结构体中的.pixelformat 和.description成员返回当前视频设备所支持的视频格式;使用举例:struct v4l2_fmtdesc fmt;memset (& fmt, 0, sizeof(fmt);fmt.i ndex = 0;fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;while

6、(ret = ioctl(dev, VIDIOC_ENUM_FMT, &fmt) = 0) fmt.i ndex+;printf( pixelformat = %c%c%c%c, description = %s n,fmt.pixelformat& 0xFF, (fmt.pixelformat 8) & 0xFF,(fmt.pixelformat 16) & 0xFF, (fmt.pixelformat 24)& 0xFF,fmt.descripti on); 控制命令VIDIOC_QUERYCAP功能:查询视频设备的功能;参数说明:参数类型为 V4L2的能力描述类型struct v4l2_

7、capability ; 返回值说明:执行成功时,函数返回值为 0 ;函数执行成功后,structv4l2_capability结构体变量中的返回当前视频设备所支持的功能;例如支持视频捕获功能 V4L2_CAP_VIDEO_CAPTUFV4L2_CAP_STREAMIlNG使用举例:struct v4l2_capability cap;iret = ioctl(fd_usbcam, VIDIOC_QUERYCAP, & cap);if(iret 255) r = 255;if(g 255) g = 255;if(b 255) b = 255;if(r 0) r = 0;if(g 0) g =

8、0;if(b 500000) ? 500000 : MAX_BUFFER_TIME; peroid_time = buffer_time/4 。关于 peroid 的概念有 这样的描述: The “period ” is a term that corresp onds to a fragme nt in the OSS world. The period defi nes the size at which a PCM in terrupt is gen erated.从底层驱动看来,应该是 PCM DMA单次传送数据帧的大小。其实真正关注底层驱动的话,它并不是关心 peroid_time

9、,它关心的是 peroid_size ,这两者有转换关系。见struct sn d_pcm_hardware 结构体。(3) 通过 snd_pcm_hw_params_get_period_size() 取得 peroid_size ,注意在 ALSA中 peroid_size 是以 frame 为单位的。根据描述“ The con figured buffer and period sizes are stored in“ frames ” in the run time. 1 frame =channels * sample_size ” . 所以要对 peroid_size 进行转换:c

10、hunk_bytes = peroid_size * sample_length / 8。 chunk_bytes 就是我们单次从 WAV读 PCM数据的大小。由以上playback过程可以知道,capture的过程是类似的,只是一个对文 件读而另一个对文件写操作。当打开PCM设备时我们指定打开模式为 SND_PCM_STREAM_CPAT在主循环中,我们调用snd_pcm_readi从声卡中读取 数据,并把它们写入到标准输出。同时也要注意 frames和bytes的转换。SND Commo中 SNDWAV_ReadP和iSNDWAV_WritePcft用了 snd_pcm_readi 和sn

11、d_pcm_writei,其调用和Linux下的读写系统调用类似。字母i表示处理 的帧是交错(interleaved) 的。ALSA中存在非交互模式的对应的函数。Linux下 的许多设备也支持mma系统调用,这个调用将设备内存映射到主内存,这样数 据就可以用指针来维护。ALSA也运行以mma模式打开一个PCM言道,这允许有 效的零拷贝(zero copy)方式访问声音数据。WAWarser是对WAV文牛的分析和封装,包括对文件头读写的操作和格式定 义等。算法见程序源文件。亍&录曰*音频采集出来的结果:*sound wavbyni eub un tu:/wav/alsa1$ ./lrecord

12、soun d.wavPlug PCM: Rate con version PCM (48000, sformat=S32_LE)Con verter: libspeex (builti n)Protocol versio n: 10002Its setup is:stream:CAPTUREaccess:RW_INTERLEAVEDformat:S16_LEsubformat:STDcha nn els:2rate:8000exact rate:8000 (8000/1)msbits:16buffer_size:2730period_size:170period_time:21333tstam

13、p_mode:NONEperiod_step:1avail_min:170period_eve nt : 0start_threshold:1stop_threshold:2730sile nce_threshold: 0sile nce_size : 0boun dary:178913280Slave: Soft volume PCMCon trol: Digital Capture Volume min_dB: -30max_dB: 30resoluti on: 121Its setup is:stream:CAPTUREaccess:MMAP_INTERLEAVEDformat:S32_

14、LEsubformat:STDcha nn els:2rate:48000exact rate:48000 (48000/1)msbits:32buffer_size:16384period_size period_time tstamp_mode period_step avail_min period_eve nt : 0:1024:21333:NONE:1:1024start_threshold:6stop_threshold:16384sile nce_threshold: 0sile nce_size : 0boun dary:1073741824Slave: Direct Sn o

15、op PCMIts setup is:stream:CAPTUREaccess:MMAP_INTERLEAVEDformat:S32_LEsubformat:STDcha nn els:2rate:48000exact rate:48000 (48000/1)msbits:32buffer size:16384period_size period_time tstamp_mode period_step avail_min period_eve nt : 0:1024:21333:NONE:1:1024start_threshold stop_threshold:6:16384sile nce

16、_threshold: 0sile nce_size : 0 boun dary:1073741824Hardware PCM card 0 HDA SIS966 device 0 subdevice 0 Its setup is:stream:CAPTUREaccess format subformat cha nn els rate exact rate msbits buffer_size period_size period_time tstamp_mode period_step avail_min period_eve nt : 0:MMAP_INTERLEAVED:S32_LE:

17、STD:2:48000:48000 (48000/1):32:16384:1024:21333:ENABLE:1:1024start_threshold stop_threshold:1:1073741824sile nce_threshold: 0sile nce_size : 0 boun dary appl_ptr hw_ptr:1073741824:0:1054+/n/nF ileMagic:Type:RIFF/nFile Len gth:480036/nFileWAVE/n/nFmt Magic:fmt /nFmtSize:Chann els:16/nFmt Format:PCM/n

18、Fmt2/nFmt Sample_rate:8000(HZ)/nFmt Bytes_p_seco nd:32000/nFmt Blocks_alig n:4/nFmt Sample_le ngth:16/n/nChu nkType:data/nChu nkLen gth:480000/n/n+*sound wav放音*byni eub un tu:/wav/alsa1$ ./Iplay soun d.wavPlug PCM: Rate con version PCM (48000, sformat=S32_LE)Con verter: libspeex (builti n)Protocol v

19、ersio n: 10002Its setup is:stream:PLAYBACKaccess:RW_INTERLEAVEDformat:S16_LEsubformat:STDcha nn els:2rate:8000exact rate:8000 (8000/1)msbits:16buffer_size:2730period_size:170period_time:21333tstamp_mode:NONEperiod_step:1avail_min:170period_eve nt : 0start_threshold:1stop_threshold:2730sile nce_thres

20、hold:0sile nce_size : 0boun dary:178913280Slave: Soft volume PCMCon trol: PCM Playback Volumemin_dB: -51max_dB: 0resoluti on: 256Its setup is:stream:PLAYBACKaccess:MMAP_INTERLEAVEDformat:S32_LEsubformat:STDcha nn els:2rate:48000exact rate:48000 (48000/1)msbits:32buffer_size:16384period_size:1024peri

21、od_time:21333tstamp_modeNONEperiod_step1avail_min:1024period_eve nt : 0start_threshold:6stop_threshold:16384sile nce_threshold:0sile nce_size : 0boun dary:1073741824Slave: Direct Stream Mixi ng PCMIts setup is:stream:PLAYBACKaccess:MMAP_INTERLEAVEDformat:S32_LEsubformat:STDcha nn els:2rate:48000exac

22、t rate:48000 (48000/1)msbits:32buffer_size16384period_size1024period_time21333tstamp_modeNONEperiod_step1avail_min:1024period_eve nt : 0start_threshold:6stop_threshold:16384sile nce_threshold:0sile nce_size : 0boun dary:1073741824Hardware PCM card 0 HDA SIS966 device 0 subdevice 0Its setup is:stream

23、:PLAYBACKaccess:MMAP_INTERLEAVEDformat:S32_LEsubformat:STDcha nn els:2rate:48000exact rate:48000 (48000/1)msbits:32buffer_size16384period_size1024period_time21333tstamp_mode period_step avail_min period_eve nt : 0:ENABLE:1:1024start_threshold stop_threshold:1:1073741824sile nce_threshold: 0 sile nce

24、_size : 1073741824boun dary appl_ptr hw_ptr:1073741824:0:0+/n/nF ileMagic:Type:RIFF/nFile Len gth:480036/nFileWAVE/n/nFmt Magic:fmt /nFmtSize:Chann els:16/nFmt Format:PCM/nFmt2/nFmt Sample_rate:8000(HZ)/nFmt Bytes_p_seco nd:32000/nFmt Blocks_alig n:4/nFmt Sample_le ngth:16/n/nChu nkType:data/nChu nk

25、Len gth:480000/n/n+/1Socket文件传输1、Socket基础介绍(1) 什么是 Socket ?所谓socket通常也称作套接字,应用程序通常通过套接字向网络发出 请求或者应答网络请求。以 J2SDK-1.3为例,Socket和ServerSocket类库位于 java .net 包中。ServerSocket用于服务器端,Socket是建立网络连接时使用 的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因 为在服务器端或在客户端而产生不同级别。不管是Socket还是Server

26、Socket它们的工作都是通过SocketImpl类及其子类完成的。(2) Socket连接过程根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等 待连接的状态,实时监控网络状态。客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器 端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字, 指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接 请求,它

27、就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的 描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接 字继续处于监听状态,继续接收其他客户端套接字的连接请求。(3) 常用的Socket类型有两种:流式 Socket( SOCK_STRE)和数据报式 Socket( SOCK_DGRAM 流式是一种面向连接的Socket,乍针对于面向连接的TCP服务应用;数据报式 Socket是一种无连接的Socket,对应于无连接的UDPK务应用。Socket为了建 立Socket,程序可以调用Socket函数,该函数返回一个类似于文件描述符的句 柄。socket 函数原型为

28、:int socket(int domain,int type,int protocol);domain 指明所使用的协议族,通常为 PF_INET (其与addrinfo 里 的AF_INET在现在看来是相同的。只是历史上人们曾构想将AF (地址家族address family )与PF(protocol family协议家族)分开,但实际上这种区分并未真正推广,所以现在 AFNET和PF_INET具有相同的意义。其中 AF_INET 是基于IPv4而PF_INET基于IPv6)表示互联网协议族(TCP/IP协议族);type 参数指定 socket 的类型:SOCK_STREAM SOCK

29、_DGR,Sbcket 接口还定义了原 始Socket( SOCK_RAW 允许程序使用低层协议;protocol通常赋值0。Socket ()调用返回一个整型socket描述符,你可以在后面的调用使用它。Socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。调用Socket函数时,socket执行体将建立一个 Socket,实际上建立一个Socket意味着为一个 Socket数据结构分配存储空间。Socket执行体为你管理描述符表。两个网络程 序之间的一个网络连接包括五种信息:通信协议、本地协议地址、本地主机端口、 远端主机地址和远端协议端口。 Socket数据结构中包含这五种信息。socket在 测量软件中的使用也很广泛。2、So

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论