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 installsample/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/文件夹下。