开发一款直播app,集成ijkplayer成功后,就算完成直播功能一半的工程了,只要有拉流url,就能播放直播啦
本篇主要讲解的是直播app中,需要用到的一个很重要的开源框架ijkplayer,然后集成这个框架可能对大多数初学者还是比较有难度的,所以本篇主要教你解决集成【ijkplayer】遇见的各种坑。
很多文章,可能讲解的是如何做,我比较注重讲解为什么这样做,大家有什么不明白,还可以多多提出来。
如果喜欢我的文章,可以关注我微博:袁峥Seemygo,也可以来袁峥Seemygo,了解下我们的iOS培训课程。后续还会更新更多内容,有任何问题,欢迎简书留言峥吖。。。
README.md文件:框架的描述文件,描述这个框架怎么使用
编译语言:程序在被执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件,运行时不需要翻译,所以编译型语言的程序执行效率高,比如OC,C,C++
解释性语言:解释性语言的程序不需要编译,在运行程序的时候才翻译,每个语句都是执行的时候才翻译。这样解释性语言每执行一次就需要逐行翻译一次,效率比较低
解释性语言执行和编译语言执行的区别:
解释性语言一行一行的解析,如果有错误,就不会执行,直接执行下一行。编译语言,只要有错,就不能编译,一行都不能执行。脚本语言:属于解析语言,必须通过解释器解析,将其一条条的翻译成机器可识别的指令,并按程序顺序执行。
python:脚本语言,适合网络应用程序的开发,有利于开发效率,现在显得越来越强大php:服务器端脚本语言,适合做动态网站JS:作为客户端的脚本语言,在浏览中解释执行,shell:操作系统脚本语言,一般指Unix/linux中使用的命令行编译语言,执行文件是二进制。脚本语言是解释执行的,执行文件是文本shell解释器:shell是一个命令行解释器,相当于windows的cmd,处于内核和用户之间,负责把用户的指令传递给内核并且把执行结果回显给用户.
默认Unix都有shell,OS基于Unix,因此OS自带shell。bash: bash是一种shell解释器版本,shell有很多种版本,就像人,也分不同国家的人。
牛程序员看到不爽的Shell解释器,就会自己重新写一套,慢慢形成了一些标准,常用的Shell解释器有这么几种,sh、bash、csh等shell:通常我们说的shell,指的是shell脚本语言,而不是shell解释器。
在编写shell时,第一行一定要指明系统需要哪种shell解释器解释你的shell脚本,如:#! /bin/bash,使用bash解析脚本语言什么时候使用shell命令,比如有些系统命令经常需要用到,可以把命令封装到一个脚本文件,以后就不用再敲一遍了,直接执行脚本语言。比如ijkplayer,就用脚本文件下载ffmpeg,因为下载ffmpeg需要执行很多命令,全部封装到脚本文件中。在导入一些第三方框架的时候,经常需要用到一些命令,所以一般都会封装到一个脚本文件中,以后只要执行脚本,就会自动执行集成第三方框架的命令。sh:sheel脚本文件后缀名
原因:因为libavformat是ffmpeg中的库,而ijkplayer是基于ffmpeg这个库的,因此需要导入ffmpeg
解决:查看ijkplayer的README.md,一般都会有说明。
执行脚本.pnginit-ios.sh脚本的作用:下载ffmpeg源码
想了解脚本具体怎么做的,可以查看之前写的文章带你走进脚本世界,ijkplayer之【init-ios.sh】脚本分析,全面剖析了init-ios.sh这个脚本做了哪些事情。打开 IJKMediaPlayer库
IJKMediaPlayer源码.png右击,发现FFMPEG中的库都是红的,表示不存在
Snip20160829_23.png解决:查看ijkplayer的README.md
编译ffmpeg.png编译完ffmpeg后,IJKMediaPlayer库中显示
成功获取到ffmpeg库.pngcmd+r,Demo运行成功
Demo运行成功.png- (void)loadData{ // 映客数据url NSString *urlStr = @"http://116.211.167.106/api/live/aggregation?uid=133825214&interest=1"; // 请求数据 AFHTTPsessionManager *mgr = [AFHTTPSessionManager manager]; mgr.responseSerializer = [AFJSONResponseSerializer serializer]; mgr.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/plain", nil]; [mgr GET:urlStr parameters:nil PRogress:nil success:^(NSURLSessionDataTask * _Nonnull task, NSDictionary * _Nullable responSEObject) { _lives = [YZLiveItem mj_objectArrayWithKeyValuesArray:responseObject[@"lives"]]; [_tableView reloadData]; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"%@",error); }];}3.获取拉流url,直播
IJKFFMoviePlayerController:用来做直播的类- (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor whiteColor]; // 设置直播占位图片 NSURL *imageUrl = [NSURL URLWithString:[NSString stringWithFormat:@"http://img.meelive.cn/%@",_live.creator.portrait]]; [self.imageView sd_setImageWithURL:imageUrl placeholderImage:nil]; // 拉流地址 NSURL *url = [NSURL URLWithString:_live.stream_addr]; // 创建IJKFFMoviePlayerController:专门用来直播,传入拉流地址就好了 IJKFFMoviePlayerController *playerVc = [[IJKFFMoviePlayerController alloc] initWithContentURL:url withOptions:nil]; // 准备播放 [playerVc prepareToPlay]; // 强引用,反正被销毁 _player = playerVc; playerVc.view.frame = [UIScreen mainScreen].bounds; [self.view insertSubview:playerVc.view atIndex:1];}4.结束播放
界面不播放,一定要记得结束播放,否则会报内存溢出内存bug.png- (void)viewWillDisappear:(BOOL)animated{ [super viewWillDisappear:animated]; // 界面消失,一定要记得停止播放 [_player pause]; [_player stop];}结束语
后续还会更新更多有关直播的资料,希望做到教会每一个朋友从零开始做一款直播app,并且Demo也会慢慢完善.Demo点击下载
由于FFMPEG库比较大,大概100M。本来想自己上传所有代码了,上传了1个小时,还没成功,就放弃了。提供另外一种方案,需要你们自己导入IJKPlayer库具体步骤:
下载Demo后,打开YZLiveApp.xcworkspace问题打开YZLiveApp.xcworkspace问题pod install就能解决Snip20160830_12.png下载jkplayer库,点击下载把jkplayer直接拖入到与Classes同一级目录下,直接运行程序,就能成功了拖入ijkplayer到与Classes同一级目录下.png注意不需要打开工程,把jkplayer拖入到工程中,而是直接把jkplayer库拷贝到与Classes同一级目录下就可以了。错误示范:不要向下面这样操作原文链接:http://www.jianshu.com/p/7b2f1df74420
新闻热点
疑难解答