音频采集参数git
一、采样率(samplerate):采样就是把模拟信号数字化的过程,采样频率越高,记录这一段音频信号所用的数据量就越大,同时音频质量也就越高。github
二、位宽:每个采样点都须要用一个数值来表示大小,这个数值的数据类型大小能够是:4bit、8bit、16bit、32bit 等等,位数越多,表示得就越精细,声音质量天然就越好,而数据量也会成倍增大。咱们在音频采样过程当中经常使用的位宽是 8bit 或者 16bit。算法
三、声道数(channels):因为音频的采集和播放是能够叠加的,所以,能够同时从多个音频源采集声音,并分别输出到不一样的扬声器,故声道数通常表示声音录制时的音源数量或回放时相应的扬声器数量。声道数为 1 和 2 分别称为单声道和双声道,是比较常见的声道参数。缓存
音频帧(frame):音频跟视频很不同,视频每一帧就是一张图像,音频数据是流式的,自己没有明确的一帧帧的概念,在实际的应用中,为了音频算法处理/传输的方便,通常约定俗成取 2.5ms~60ms 为单位的数据量为一帧音频。这个时间被称之为“采样时间”,其长度没有特别的标准,它是根据编解码器和具体应用的需求来决定的。框架
根据以上定义,咱们能够计算一下一帧音频帧的大小。假设某音频信号是采样率为 8kHz、双通道、位宽为 16bit,20ms 一帧,则一帧音频数据的大小为: size = 8000 x 2 x 16bit x 0.02s = 5120 bit = 640 byteide
视频采集参数性能
一、图像传输格式:通用影像传输格式(Common Intermediate Format)是视讯会议(video conference)中常使用的影像传输格式。ui
二、图像格式:一般采用 YUV 格式存储原始数据信息,其中包含用 8 位表示的黑白图像灰度值,以及可由 RGB 三种色彩组合成的彩色图像。spa
三、传输通道:正常状况下视频的拍摄只需 1 路通道,随着 VR 和 AR 技术的日渐成熟,为了拍摄一个完整的 360° 视频,可能须要经过不一样角度拍摄,而后通过多通道传输后合成。代理
四、分辨率:随着设备屏幕尺寸的日益增多,视频采集过程当中原始视频分辨率起着愈来愈重要的做用,后续处理环节中使用的全部视频分辨率的定义都以原始视频分辨率为基础。视频采集卡能支持的最大点阵反映了其分辨率的性能。
采样频率:采样频率反映了采集卡处理图像的速度和能力。在进行高度图像采集时,须要注意采集卡的采样频率是否知足要求。采样率越高,图像质量越高,同时保存这些图像信息的数据量也越大。
采集介绍
AVFoundation: 音视频数据采集须要用AVFoundation框架.
AVCaptureDevice:硬件设备,包括麦克风、摄像头,经过该对象能够设置物理设备的一些属性(例如相机聚焦、白平衡等)
AVCaptureDeviceInput:硬件输入对象,能够根据AVCaptureDevice建立对应的AVCaptureDeviceInput对象,用于管理硬件输入数据。
AVCaptureOutput:硬件输出对象,用于接收各种输出数据,一般使用对应的子类- 这里是列表文本AVCaptureAudioDataOutput(声音数据输出对象)、AVCaptureVideoDataOutput(视频数据输出对象)
AVCaptionConnection:当把一个输入和输出添加到AVCaptureSession以后,AVCaptureSession就会在输入、输出设备之间创建链接,并且经过AVCaptureOutput能够获取这个链接对象。
AVCaptureVideoPreviewLayer:相机拍摄预览图层,能实时查看拍照或视频录制效果,建立该对象须要指定对应的AVCaptureSession对象,由于AVCaptureSession包含视频输入数据,有视频数据才能展现。
AVCaptureSession: 协调输入与输出之间传输数据 系统做用:能够操做硬件设备 工做原理:让App与系统之间产生一个捕获会话,至关于App与硬件设备有联系了, 咱们只须要把硬件输入对象和输出对象添加到会话中,会话就会自动把硬件输入对象和输出产生链接,这样硬件输入与输出设备就能传输音视频数据。
捕获音视频步骤
捕获音视频
// 捕获音视频 - (void)setupCaputureVideo { // 1.建立捕获会话,必需要强引用,不然会被释放 AVCaptureSession *captureSession = [[AVCaptureSession alloc] init]; _captureSession = captureSession; // 2.获取摄像头设备,默认是后置摄像头 AVCaptureDevice *videoDevice = [self getVideoDevice:AVCaptureDevicePositionFront]; // 3.获取声音设备 AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; // 4.建立对应视频设备输入对象 AVCaptureDeviceInput *videoDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:nil]; _currentVideoDeviceInput = videoDeviceInput; // 5.建立对应音频设备输入对象 AVCaptureDeviceInput *audioDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:nil]; // 6.添加到会话中 // 注意“最好要判断是否能添加输入,会话不能添加空的 // 6.1 添加视频 if ([captureSession canAddInput:videoDeviceInput]) { [captureSession addInput:videoDeviceInput]; } // 6.2 添加音频 if ([captureSession canAddInput:audioDeviceInput]) { [captureSession addInput:audioDeviceInput]; } // 7.获取视频数据输出设备 AVCaptureVideoDataOutput *videoOutput = [[AVCaptureVideoDataOutput alloc] init]; // 7.1 设置代理,捕获视频样品数据 // 注意:队列必须是串行队列,才能获取到数据,并且不能为空 dispatch_queue_t videoQueue = dispatch_queue_create("Video Capture Queue", DISPATCH_QUEUE_SERIAL); [videoOutput setSampleBufferDelegate:self queue:videoQueue]; if ([captureSession canAddOutput:videoOutput]) { [captureSession addOutput:videoOutput]; } // 8.获取音频数据输出设备 AVCaptureAudioDataOutput *audioOutput = [[AVCaptureAudioDataOutput alloc] init]; // 8.2 设置代理,捕获视频样品数据 // 注意:队列必须是串行队列,才能获取到数据,并且不能为空 dispatch_queue_t audioQueue = dispatch_queue_create("Audio Capture Queue", DISPATCH_QUEUE_SERIAL); [audioOutput setSampleBufferDelegate:self queue:audioQueue]; if ([captureSession canAddOutput:audioOutput]) { [captureSession addOutput:audioOutput]; } // 9.获取视频输入与输出链接,用于分辨音视频数据 _videoConnection = [videoOutput connectionWithMediaType:AVMediaTypeVideo]; // 10.添加视频预览图层 AVCaptureVideoPreviewLayer *previedLayer = [AVCaptureVideoPreviewLayer layerWithSession:captureSession]; previedLayer.frame = [UIScreen mainScreen].bounds; [self.view.layer insertSublayer:previedLayer atIndex:0]; _previedLayer = previedLayer; // 11.启动会话 [captureSession startRunning]; } // 指定摄像头方向获取摄像头 - (AVCaptureDevice *)getVideoDevice:(AVCaptureDevicePosition)position { NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; for (AVCaptureDevice *device in devices) { if (device.position == position) { return device; } } return nil; } #pragma mark - AVCaptureVideoDataOutputSampleBufferDelegate // 获取输入设备数据,有多是音频有多是视频 - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { if (_videoConnection == connection) { NSLog(@"采集到视频数据"); } else { NSLog(@"采集到音频数据"); } }
切换摄像头
- (WXResult)switchCamera:(AVCaptureDevicePosition)position { // 获取当前设备方向 AVCaptureDevicePosition curPosition = wx_deviceInput.device.position; if (curPosition == position) { return WXResultNoErr; } // 建立设备输入对象 AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithDeviceType:AVCaptureDeviceTypeBuiltInWideAngleCamera mediaType:AVMediaTypeVideo position:position]; // 获取改变的摄像头输入设备 AVCaptureDeviceInput *videoDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:nil]; // 移除以前摄像头输入设备 [wx_captureSession removeInput:wx_deviceInput]; // 添加新的摄像头输入设备 [wx_captureSession addInput:videoDeviceInput]; // 记录当前摄像头输入设备 wx_deviceInput = videoDeviceInput; return WXResultNoErr; }``` github 地址: https://github.com/simonwxun/WXH264AndAACDemo.git