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端市面上机型众多, ...
随机推荐
- 一个C/C++结构体初始化有趣的现象
我们知道C语言当中结构可以使用{}进行初始化,例如有结构体定义如下: typedef struct type_t { int a; int b; int c; int d; }type_t; 我们可以 ...
- Csharp递归和循环实现折半查找
static bool whilehalf(int n) { ; //低位 ; //高位 ; while(low <= hight) { if(n> arr[c]) { low = c + ...
- C++_nullptr
C++_nullptr null 0 nullptr 的区别
- C语言中头文件和cpp文件解析
务必提前预读这里的内容:http://www.cnblogs.com/stemon/p/3999844.html 回到cpp文件与头文件各写什么内容的话题上: 理论上来说cpp文件与头文件里的内容,只 ...
- MySQL:ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
MySQL在删除一张表时出现 ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fa ...
- Android 如何让 app 自行处理 power key M
前言 欢迎大家我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net ...
- git彻底删除commit记录的方法
在github上,如果非默认分支的话,直接用以下方法: git reset --hard <commit_id> git push origin HEAD --force 如是默认分支,需 ...
- 关于RSA加密
RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密. RSA的算法涉及三个参数,n.e1.e2. 其中,n是两个大质数p.q的积,n的二进制 ...
- SQL Server Primary key 、clustered index 、 unique
primary key: 1.主键不可以有空值. 2.不可以有重复行. unique : 1.可以有空行. 2.不可以有重复行. clustered index: 1.可以有重复行. 2.可以有空行. ...
- sketch 跟随鼠标指针移动的特效
演示地址:http://www.ke01.com/yanshi/sucai/20140830/2/ 下载地址:https://yunpan.cn/cqgWeIYPer8eC 访问密码 672b