最近直播火的一塌糊涂,人人都想搞直播,各路明星也开直播,也诞生了很多网红。刷着跑车,谢谢点亮,各取所需!各个公司也想分到一杯羹,纷纷搭起了直播平台,目前较出名的有:
映客 、斗鱼、熊猫、花椒 等等
效果图如下:
喵播直播页面直播原理:
把主播录制的视频,推送到服务器,在由服务器分发给观众观看。
直播环节:
推流端(采集、美颜处理、编码、推流)、服务端处理(转码、录制、截图、鉴黄)、播放器(拉流、解码、渲染)、互动系统(聊天室、礼物系统、赞)
实现流程:
采集、滤镜处理、编码、推流、CDN分发、拉流、解码、播放、聊天互动
如果想要自己从零开始搭建,除非是大牛,而且是一群大牛,因为直播需要运用的技术非常多,例如视频/音频处理、图形处理、视频/音频压缩、CDN分发、即时通讯,都需要你学习很久!所以现在对于对于一个初创团队来讲,自研直播不管在技术门槛、CDN、带宽上都是有很大的门槛的,而且需要耗费大量的时间才能做出成品,不利于拉投资。一般会采取使用第三方SDK。但对于公司直播平台大,从长远看,自研可以节省成本,技术成面比直接用SDK可控。
那有哪些第三方SDK能够快速的开发一个完整的直播APP呢?
自研语音视频引擎,在语音前处理、网络自适应和跨平台兼容性等方面,达到国际顶尖水平。致力于提供全球最清晰稳定的实时语音视频云服务,帮助企业快速获得实时通讯能力。花椒、一直播、繁星、么么、美播都是用此SDK;
直播(Live Video Broadcasting)依托腾讯强大的技术平台,为您提供专业稳定快速的直播接入和分发服务,全面满足超低延迟和超大并发访问量的苛刻要求
基于专业的跨平台视频编解码技术和大规模视频内容分发网络,提供稳定流畅、低延时、高并发的实时音视频服务,可将视频直播无缝对接到自身App
专为直播平台打造的全球化直播流服务和一站式实现SDK端到端直播场景的企业级直播云服务平台;熊猫TV、龙珠TV等直播平台都是用的七牛云.
还有阿里云等等,就不一一列举了;这些第三方提供完整的方案,较简便,当然需要花钱!公司有钱,也急需完整开发的可以选择使用。下面介绍一种免费拉流开源SDKijkplayer
的集成,顾名思义,拉流就是播放,ijkplayer
是一款做视频直播的框架, 基于ffmpeg, 支持 Android 和 iOS。
一、首先下载ijkplayer,下载地址https://github.com/Bilibili/ijkplayer,star很高哦~
gitHub下载页面二、看下README.md文档,这里会教我们怎么操作。操作步骤及添加的库都在里面。下面就详细介绍下流程。
README.md三、其实下载完成之后下一步操作就是编译ijkplayer,也就是编译 ffmpeg:
1、打开终端,先执行cd jkplayer-master
路径,进入到该文件夹下,路径拖入终端就行,如下图:
2、在终端执行命令
./init-ios.sh
,有点慢,视网速决定,我大概花了一个半小时,耐心等待,此操作目的是下载ffmpeg。当100%时说明下载完毕!
下载 ffmpeg
3、下载完成后,进入
jkplayer-master
中的ios
文件夹,在终端输入cd ios
。
进入iOS文件夹
4、执行
./compile-ffmpeg.sh clean
命令
执行./compile-ffmpeg.sh clean命令
5、执行
./compile-ffmpeg.sh all
命令, 编译 ffmpeg。此次编译时间也较久,大概十几分钟,到此也编译完成了;
执行./compile-ffmpeg.sh all命令
四、打包静态库IJKMediaFramework.framework合并
1、打开文件夹IJKMediaPlayer下的工程IJKMediaPlayer.xcodeproj
2、打开工程后先选择IJKMediaFramework,然后点击Edit Scheme
32122.png3、选择Release后点击close
选择Release后点击close4、然后分别选择真机和模拟器进行编译,执行command B,这时在目录Products文件下多了个IJKMediaFramework.framework静态库,然后右击Show in Finder 进入文件夹
12232.png
5、上步编译一定要选择真机和模拟器分别编译一遍,才会得到下面的两个版本的framework
真机和模拟器6、接下来就是合并真机和模拟器的framework了,注意是IJKMediaFramework.framework里面的IJKMediaFramework文件
合并的文件
合并的命令是:
lipo -create 真机版本路径 模拟器版本路径 -output 合并后的文件路径/名称
1.合并操作很容易出现问题,当提示这个错误时:
error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: can't move temporary file: /Users/xiong/Desktop/demo to file: /Users/xiong/Desktop/demo.lipo (Is a directory)
解决方法:
此错误一般是在合并后的路径没有加上合并后生成的文件名字,加上就行。
2.当出现这种错误时:
xcrun: error: active developer path ("/Applications/Xcode 7.1.app/Contents/Developer") does not exist, use xcode-select --switch path/to/Xcode.app to specify the Xcode that you wish to use for command line developer tools (or see man code-select)
解决方法:
此错误是多个Xcode,删掉一个后出现,终端执行sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer命令,然后再输入一次系统的密码就可以。
下面是我合并时输入的命令,可以参考下:
合并命令7、合并后,这边就生成了一个合并的文件:
合并生成的文件8、然后把合并的文件替换真机里面的IJKMediaFramework文件
替换文件9、然后IJKMediaFramework.framework就是我们需要的框架了
最终的framework
五、导入静态库到我们的工程
导入库 导入库之后,我们先包含头文件#import <IJKMediaFramework/IJKMediaFramework.h>
编译没问题就说明集成成功了,如果有碰到这个问题 :
请再引入libc++.tbd解决
六、到此ijkplayer已集成完成,接下来就是播放了
1、先定义两个View
@property (atomic, retain) id <IJKMediaPlayback> player;
@property (nonatomic, strong) UIView *playerView;
2、创建播放器
//背景View
self.playerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)];
self.playerView.backgroundColor = [UIColor lightGrayColor];
[self.view addSubview:self.playerView];
//提示文字
UILabel *titleLabel = [[UILabel alloc]initWithFrame:CGRectMake(10, SCREEN_HEIGHT/2-30, SCREEN_WIDTH-20, 30)];
titleLabel.text = @"正在加载视频,请稍后...";
titleLabel.textAlignment = NSTextAlignmentCenter;
titleLabel.textColor = [UIColor whiteColor];
titleLabel.font = [UIFont systemFontOfSize:18];
[self.playerView addSubview:titleLabel];
//创建播放器
NSString *url = @"http://live.hkstv.hk.lxdns.com/live/hks/playlist.m3u8";//播放地址
self.player = nil;
self.player = [[IJKFFMoviePlayerController alloc] initWithContentURL:[NSURL URLWithString: url] withOptions:nil];
self.player.shouldAutoplay = YES;//自动播放
[self.player setScalingMode:IJKMPMovieScalingModeAspectFill];
[self.playerView addSubview:_player.view];
[self.player prepareToPlay];
if (![self.player isPlaying]) {
[self.player play];
}
3、界面消失,一定要记得停止播放
[self.player pause];
[self.player stop];
[self.player shutdown];
中间遇到过坑,不过也总算成功了,遇到问题多试几次,做出来还是挺好玩的,也吸取了一些大神的经验。
声明: 转载请注明出处http://www.jianshu.com/p/6fbf05a6a257
网友评论