iOS RTMP 视频直播开发笔记(1) – 采集摄像头图像
1. 采集硬件(摄像头)视频图像
这里简单说下 iOS 的摄像头采集。
首先初始化AVCaptureSession,说到Session,有没有人想到AVAudioSession呢?
// 初始化 AVCaptureSession
_session = [[AVCaptureSession alloc] init];
设置采集的 Video 和 Audio 格式,这两个是分开设置的,也就是说,你可以只采集视频。
// 配置采集输入源(摄像头)
NSError *error = nil;
// 获得一个采集设备,例如前置/后置摄像头
AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
// 用设备初始化一个采集的输入对象
AVCaptureDeviceInput *videoInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error];
if (error) {
    NSLog(@"Error getting video input device: %@", error.description);
}
if ([_session canAddInput:videoInput]) {
    [_session addInput:videoInput]; // 添加到Session
}
// 配置采集输出,即我们取得视频图像的接口
_videoQueue = dispatch_queue_create("Video Capture Queue", DISPATCH_QUEUE_SERIAL);
_videoOutput = [[AVCaptureVideoDataOutput alloc] init];
[_videoOutput setSampleBufferDelegate:self queue:_videoQueue];
// 配置输出视频图像格式
NSDictionary *captureSettings = @{(NSString*)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_32BGRA)};
_videoOutput.videoSettings = captureSettings;
_videoOutput.alwaysDiscardsLateVideoFrames = YES;
if ([_session canAddOutput:_videoOutput]) {
    [_session addOutput:_videoOutput];  // 添加到Session
}
// 保存Connection,用于在SampleBufferDelegate中判断数据来源(是Video/Audio?)
_videoConnection = [_videoOutput connectionWithMediaType:AVMediaTypeVideo];
实现 AVCaptureOutputDelegate:
- (void) captureOutput:(AVCaptureOutput *)captureOutput
 didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
        fromConnection:(AVCaptureConnection *)connection
{
    // 这里的sampleBuffer就是采集到的数据了,但它是Video还是Audio的数据,得根据connection来判断
    if (connection == _videoConnection) {  // Video
        /*
        // 取得当前视频尺寸信息
        CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
        int width = CVPixelBufferGetWidth(pixelBuffer);
        int height = CVPixelBufferGetHeight(pixelBuffer);
        NSLog(@"video width: %d  height: %d", width, height);
        */
         NSLog(@"在这里获得video sampleBuffer,做进一步处理(编码H.264)");
    } else if (connection == _audioConnection) {  // Audio
        NSLog(@"这里获得audio sampleBuffer,做进一步处理(编码AAC)");
    }
}
关于实时编码H.264和AAC Buffer,这里又是两个技术点,之后再讲吧。
配置完成,现在启动 Session:
// 启动 Session
[_session startRunning];
1.1 附加任务:将当前硬件采集视频图像显示到屏幕
很简单,发送端直接使用自家的AVCaptureVideoPreviewLayer显示,so easy
_previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:_session];
_previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; // 设置预览时的视频缩放方式
[[_previewLayer connection] setVideoOrientation:AVCaptureVideoOrientationPortrait]; // 设置视频的朝向
_previewLayer.frame = self.view.layer.bounds;
[self.view.layer addSublayer:_previewLayer];
然后将这个layer添加到界面中即可显示了。
采集时候有个小坑,就是采集的图像尺寸和方向设置。有空我会单开个帖子来聊聊。
iOS RTMP 视频直播开发笔记(1) – 采集摄像头图像的更多相关文章
- 《转》iOS音频视频初级开发
		代码改变世界 Posts - 73, Articles - 0, Comments - 1539 Cnblogs Dashboard Logout HOME CONTACT GALLERY RSS ... 
- 使用ckplayer搭建rtmp视频直播应用
		视频直播才有的是RTMP协议进行视频实时流传输,在这里我们用到的软件都是 adobe 公司的一个是:Flash Media Server4 另一个是flash media live encoder 这 ... 
- iOS中 视频直播功能-流媒体的使用(详解)韩俊强的CSDN博客
		上一篇博客:(流媒体实现视频播放和下载功能):http://blog.csdn.net/qq_31810357/article/details/50574914 最近视频直播功能比较火,处于需求,研究 ... 
- 利用Nginx搭建RTMP视频直播,点播服务器,ffmpeg推流,回看
		一.环境和工具 ubuntu 14.04 desktop 不用server的原因是一部分的演示用到了linux视频播放和直播软件,自己还要装桌面,麻烦. 不建议使用 最新的16TLS,我一开始 ... 
- Nginx与Nginx-rtmp-module搭建RTMP视频直播和点播服务器
		一.开发环境 Nginx地址: http://nginx.org/download/nginx-1.14.2.tar.gz Nginx-rtmp-module地址: https://github.c ... 
- iOS中 视频直播功能-流媒体的使用
		简单介绍: HLS 协议 : >5M会被AppStore拒绝 服务器要求低 延迟高 多平台 RTMP 协议: 电视直播 PC端使用 配合flash插件 及时性好 ... 
- GUI开发:实时显示摄像头图像
		import tkinter as tk from PIL import Image, ImageTk import cv2 import numpy as np import time g_exit ... 
- iOS视频直播初窥:高仿<喵播APP>
		视频直播初窥 视频直播,可以分为 采集,前处理,编码,传输, 服务器处理,解码,渲染 采集: iOS系统因为软硬件种类不多, 硬件适配性比较好, 所以比较简单. 而Android端市面上机型众多, 要 ... 
- iOS视频直播
		视频直播技术点 视频直播,可以分为 采集,前处理,编码,传输, 服务器处理,解码,渲染 采集: iOS系统因为软硬件种类不多, 硬件适配性比较好, 所以比较简单. 而Android端市面上机型众多, ... 
随机推荐
- istream类的公有成员函数
			1 eatwhite 2 get 3 getline 4 gcount 5 ignore 6 operator>> 7 peek 8 read 9 seekg 10 tellg 1 eat ... 
- 怎样安装pip--python的包管理工具
			pip是python的包管理工具,使用它来安装python的模块很方便. pip支持的操作系统:Unix/Linux, OS X, and Windows. 支持的python版本号:2.6, 2.7 ... 
- Codeforces Round #256 (Div. 2/C)/Codeforces448C_Painting Fence(分治)
			解题报告 给篱笆上色,要求步骤最少,篱笆怎么上色应该懂吧,.,刷子能够在横着和竖着刷,不能跳着刷,,, 假设是竖着刷,应当是篱笆的条数,横着刷的话.就是刷完最短木板的长度,再接着考虑没有刷的木板,,. ... 
- 【邻接表字符串Hash】【HDU1800】Flying to the Mars
			题意: 给你N个数字,带前导0,问出现最多的数字个数 思路: 读入,清楚前导0,Hash. 用邻接表字符串Hash有一下几点注意 string,不要memset,否则地址也没了,涉及到stl的东西,少 ... 
- Mina入门:Java NIO基础概念
			JDK1.4引入了Java NIO API(Java New IO),Java NIO得到了广泛应用.NIO允许程序进行非阻塞IO操作.java.nio.* 包括以下NIO基本结构: Buffer - ... 
- 3种SQL语句分页写法
			在开发中经常会使用到数据分页查询,一般的分页可以直接用SQL语句分页,当然也可以把分页写在存储过程里,下面是三种比较常用的SQL语句分页方法,下面以每页5条数据,查询第3页为例子: 第一种:使用not ... 
- create a (VSTO) Office 2007 add-in using VS 2012?
			You can get VS 2012 working with Office 2007. First create an Outlook 2010 Add-In and modify the pro ... 
- MS SQLSERVER通用存储过程分页
			最近在面试的时候,遇到个奇葩的秃顶老头面试官. 问:写过存储过程分页吗? 答:没写过,但是我知道分页存储的原理,我自己也写过,只是在工作中没写过. 问:那你这么多年工作中就没写过吗? 答:的确没写过, ... 
- TCP/IP详解之:ARP协议 和 RARP协议
			ARP功能:从逻辑internet地址(IP地址)到对应的物理硬件地址(以太网地址)之间的转换 ARP工作原理: (1)首先每个主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP和MAC间的 ... 
- leetcode Merge K sorted Lists python
			# Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # self.val = ... 
