音视频编程: iOS 推流

本篇分享是基于 音视频编程: 构建 nginx 推流服务器 这篇文章的, 之前是使用 ffmpeg 命令进行推流并且都是在 macos 上面进行的操作.

现在在 iOS 平台上使用 LFLiveKit 进行推流, 然后使用 VLC 播放器播放流视频.

该系列博文:

基本概念

一般直播过程包括对音视频的采集、处理、编码、封包、推流、传输、转码、分发、解码、播放等.

推流, 指使用推流工具把直播内容传输到服务器的过程. 本篇分享使用 LFLiveKit 工具将 iPhone 摄像头和麦克风采集的数据推流到本地流服务器.

拉流, 指对服务器直播的内容,用指定地址进行拉取(播放)的过程, 本篇分享使用 VLC 充当拉流的角色.

集成 LFLiveKit

LFLiveKit 是一个开源的推流 SDK, 支持 H264 and AAC 的硬编码, 支持美颜(集成了 GPUImage).

使用 LFLiveKit 比较简单, 按照其 demo 集成即可.

1.工程配置info.plist

需要访问相机和麦克风权限.

1
2
3
Privacy - Camera Usage Description
Privacy - Microphone Usage Description

2.请求相机和麦克风权限.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
- (void)requestAccessForVideo {
__weak typeof(self) _self = self;
AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
switch (status) {
case AVAuthorizationStatusNotDetermined: {
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
if (granted) {
dispatch_async(dispatch_get_main_queue(), ^{
[_self.session setRunning:YES];
});
}
}];
break;
}
case AVAuthorizationStatusAuthorized: {
dispatch_async(dispatch_get_main_queue(), ^{
[_self.session setRunning:YES];
});
break;
}
case AVAuthorizationStatusDenied:
case AVAuthorizationStatusRestricted:
// 用户明确地拒绝授权,或者相机设备无法访问
break;
default:
break;
}
}
- (void)requestAccessForAudio {
AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio];
switch (status) {
case AVAuthorizationStatusNotDetermined: {
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeAudio completionHandler:^(BOOL granted) {
}];
break;
}
case AVAuthorizationStatusAuthorized: {
break;
}
case AVAuthorizationStatusDenied:
case AVAuthorizationStatusRestricted:
break;
default:
break;
}
}

务必要调用 LFLiveSession 的 setRunning 方法.

完整的工程代码, 后续我会放到 Github 上面. 方便有需要的下载.

推流播放

上面的基本配置完成后, 可以开始推流了.

1.启动 nginx

1
sudo nginx

2.启动推流

1
2
3
4
5
6
7
- (void)startLive {
LFLiveStreamInfo *streamInfo = [LFLiveStreamInfo new];
streamInfo.url = sRTMPUrl;
[self.session startLive:streamInfo];
self.session.beautyFace = YES;
}

这里的 sRTMPUrl 是一个常量定义:

1
static NSString * const sRTMPUrl = @"rtmp://192.168.1.102:1935/rtmplive/channel";

192.168.1.102 是我的本机(mac) ip 地址.

如果一切正常的话, 你在手机上面可以看到自己的预览画面.

3.VLC 播放

使用 VLC 播放 rtmp 的流, 打开 VLC 播放器, 选择 File/Open Network, 输入 rtmp://192.168.1.102:1935/rtmplive/channel 这个地址即可实时播放了.

这里注意一定要使用本机的 ip 地址, 不要使用 localhost:1935 类似的地址, 否则无法播放和推流.

后续分享如何在 iOS 上面使用播放器来播放直播流.

坚持原创技术分享!