iOS推流SDK使用文档¶
VideoCore项目
- Github地址 https://github.com/sinacloud/VideoCore
- Forked from https://github.com/jgh-/VideoCore
- MIT协议
使用方法¶
添加SDK¶
方法一:使用CocoaPods¶
- 在Podfile中添加
platform:ios, '7.0'
pod 'VideoCore', :git=> 'https://github.com/sinacloud/VideoCore.git'
- 执行
pod install
- 打开xcworkspace文件
方法二:使用lib库文件¶
稍后提供。
Quick Start¶
- 引入头文件
#import "VCSimpleSession.h"
- 初始化
self.session = [[VCSimpleSession alloc] initWithCurrentStatus]; // 基于当前网络状况和设备朝向自动初始化
self.session.delegate = self; // 设置代理VCSessionDelegate,用于监听推流连接状态
self.session.previewView.frame = CGRectMake(0, 0, self.session.videoSize.width, self.session.videoSize.height);
[self.view addSubview:self.session.previewView]; // 添加预览视图
- 开始推流
self.pushUrl = @"rtmp://xxxxx";
[self.session startRtmpSessionWithURL:self.pushUrl];
- 结束推流
[self.session endRtmpSession];
- 监听连接状态
需要添加VCSessionDelegate
- (void) connectionStatusChanged: (VCSessionState) sessionState
{
switch(sessionState) {
case VCSessionStateStarting:
case VCSessionStateStarted:
case VCSessionStatePreviewStarted:
case VCSessionStateEnded:
case VCSessionStateError:
case VCSessionStateNone:
}
}
- 切换摄像头
self.session.cameraState = VCCameraStateFront;
self.session.cameraState = VCCameraStateBack;
- 添加滤镜效果
[self.session setFilter: VCFilterNormal];
[self.session setFilter: VCFilterGray];
[self.session setFilter: VCFilterInvertColors];
...
详细API说明¶
VCSimpleSession
类完成了音视频采集,并通过RTMP协议上推到服务端的功能。
初始化¶
有六种初始化方法,用来设置视频的分辨率、相关品质及其他相关参数:
方法一:
/**
根据当前网络状态和状态栏的朝向自动初始化,推荐该种使用方式,默认配置了不同分辨率下的品质:
当前网络为Wifi条件时,视频为720p,当isPortrait=YES时采用 VCVideoQuality720x1280,NO时采用 VCVideoQuality1280x720;
当前为移动网络时,视频为480p,当isPortrait=YES时采用 VCVideoQuality480x640,NO时采用 VCVideoQuality640x480;
其他网络状态时,视频为360p,当isPortrait=YES时采用 VCVideoQuality360x480,NO时采用VCVideoQuality480x360.
*/
-(id)initWithCurrentStatus;
方法二:
/**
初始化推流Session,默认配置了不同分辨率下的品质。
@param quality 视频大小,包括以下几个选项
VCVideoQuality1280x720,
VCVideoQuality720x1280,
VCVideoQuality640x480,
VCVideoQuality480x640,
VCVideoQuality480x360,
VCVideoQuality360x480
*/
-(instancetype) initWithQuality:(VCVideoQuality)quality;
方法三:
/**
初始化推流Session
@param videoSize 视频分辨率大小
@param fps 帧速率
@param bps 比特率
@return VCSimpleSession实例
*/
- (instancetype) initWithVideoSize:(CGSize)videoSize
frameRate:(int)fps
bitrate:(int)bps;
方法四:
/**
初始化推流Session
@param videoSize 视频分辨率大小
@param fps 帧速率
@param bps 比特率
@param useInterfaceOrientation 是否采用应用的竖朝向作为视频的竖朝向
@return VCSimpleSession实例
*/
- (instancetype) initWithVideoSize:(CGSize)videoSize
frameRate:(int)fps
bitrate:(int)bps
useInterfaceOrientation:(BOOL)useInterfaceOrientation;
方法五:
/**
初始化推流Session
@param videoSize 视频分辨率大小
@param fps 帧速率
@param bps 比特率
@param useInterfaceOrientation 是否采用应用的竖朝向作为视频的竖朝向
@param cameraState 摄像头类型
@return VCSimpleSession实例
*/
- (instancetype) initWithVideoSize:(CGSize)videoSize
frameRate:(int)fps
bitrate:(int)bps
useInterfaceOrientation:(BOOL)useInterfaceOrientation
cameraState:(VCCameraState) cameraState;
方法六:
/**
初始化推流Session
@param videoSize 视频分辨率大小
@param fps 帧速率
@param bps 比特率
@param useInterfaceOrientation 是否采用应用的竖朝向作为视频的竖朝向
@param cameraState 摄像头类型
@param aspectMode 画面填充模式
@return VCSimpleSession实例
*/
- (instancetype) initWithVideoSize:(CGSize)videoSize
frameRate:(int)fps
bitrate:(int)bps
useInterfaceOrientation:(BOOL)useInterfaceOrientation
cameraState:(VCCameraState) cameraState
aspectMode:(VCAspectMode) aspectMode;
本地预览¶
通过VCSimpleSession的只读属性UIView *previewView
进行本地摄像头效果预览。类似下面代码:
self.session = [[VCSimpleSession alloc] initWithQuality: VCVideoQuality720x1280];
self.session.previewView.frame = self.view.bounds;
[self.view addSubview:self.session.previewView];
上推¶
将流媒体数据以rtmp协议推送到服务器,需要设置推送地址Url。开始推送有两个方法:
方法一:
/**
开始推送RTMP流
@param rtmpUrl 上推地址,rtmp:// 协议
@param streamKey 秘钥
*/
- (void) startRtmpSessionWithURL:(NSString*) rtmpUrl
andStreamKey:(NSString*) streamKey;
方法二:
/**
开始推送RTMP流
@param rtmpUrl 上推地址,rtmp:// 协议
*/
- (void) startRtmpSessionWithURL:(NSString *)rtmpUrl;
上推状态检测¶
通过VCSessionDelegate的代理方法完成推送状态的检测,以便更新UI。
/** 推流的运行状态改变时的回调方法
@param sessionState VCSessionState 有以下几种状态
VCSessionStateNone,
VCSessionStatePreviewStarted,
VCSessionStateStarting,
VCSessionStateStarted,
VCSessionStateEnded,
VCSessionStateError
*/
- (void) connectionStatusChanged: (VCSessionState) sessionState;
注意:在使用上述方法更新UI时,请确保已切换到主线程。
属性参数¶
/** 视频分辨率,在推流开始运行后不能修改 */
@property (nonatomic, assign) CGSize videoSize;
/** 视频的比特率,在推流开始运行后不能修改 */
@property (nonatomic, assign) int bitrate;
/** 视频的帧速率,在推流开始运行后不能修改 */
@property (nonatomic, assign) int fps;
/** 视频的朝向 YES: 以应用的竖直方向为视频的竖直方向,NO: 以设备的竖直方向为视频的竖直方向。在推流开始运行后不能修改,readonly*/
@property (nonatomic, assign, readonly) BOOL useInterfaceOrientation;
/** 摄像头类型,默认是后置摄像头 VCCameraStateBack */
@property (nonatomic, assign) VCCameraState cameraState;
/** 摄像头的视频是否锁定方向,默认为 NO,在推流开始运行后不能修改 */
@property (nonatomic, assign) BOOL orientationLocked;
/** 是否开启闪光灯,默认不开启 NO */
@property (nonatomic, assign) BOOL torch;
/** 视频的缩放比例,取值范围为(0, 1] */
@property (nonatomic, assign) float videoZoomFactor;
/** 音频的声道,只能为1或者2,默认为2,在推流开始运行后不能修改 */
@property (nonatomic, assign) int audioChannelCount;
/** 音频的采样频率,只能为44100或者22050,默认为44100.0,在推流开始运行后不能修改 */
@property (nonatomic, assign) float audioSampleRate;
/** 麦克风的增益因子,取值范围为[0,1],默认为 1 */
@property (nonatomic, assign) float micGain;
/** 自动对焦时的对焦焦点,取值范围为[(0,0),(1,1)],默认为视频中心,(0,0)为左上角,(1,1)为右下角 */
@property (nonatomic, assign) CGPoint focusPointOfInterest;
/** 自动对焦时的测光中心点,取值范围为[(0,0),(1,1)],默认为视频中心,(0,0)为左上角,(1,1)为右下角*/
@property (nonatomic, assign) CGPoint exposurePointOfInterest;
/** 是否开启自动对焦,默认开启 YES */
@property (nonatomic, assign) BOOL continuousAutofocus;
/** 是否开启动态测光,默认开启 YES */
@property (nonatomic, assign) BOOL continuousExposure;
/** 视频画面的填充方式,默认为 VCAspectModeFit */
@property (nonatomic, assign) VCAspectMode aspectMode;
/** 视频的滤镜效果,默认为正常模式 VCFilterNormal */
@property (nonatomic, assign) VCFilter filter;
Demo¶
完整见sample/SampleBroadcaster
项目。
相关问题¶
问题1¶
pod install
sample/SampleBroadcaster项目时,采用cocoapods
v0.38.2,更高的pod版本有问题。
解决方法:
sudo gem install cocoapods -v 0.38.2 // 安装指定版本pod
pod _0.38.2_ install // 用指定版本的pod创建工程
问题2¶
编译项目sample/SampleBroadcaster,target为SampleBroadcaster的时候提示:
Undefined symbols for architecture arm64:
"videocore::Apple::H264Encode::~H264Encode()",
...
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
分析
原因:
工程中没有将VideoCore/transforms/Apple/
目录下的H264Encode.h
和H264Encode.mm
添加进来。
解决方法:
手动将上述两个文件添加到SampleBroadcaster.xcworkspace
的项目Pods.xcodeproj
中的Development Pods/VideoCore/transforms/Apple/
文件夹下。