IOS个人开发iOS技术iOS进阶

【如何快速的开发一个完整的iOS直播app】(播放篇)

2016-08-30  本文已影响56138人  袁峥

前言

在看这篇之前,如果您还不了解直播原理,请查看上篇文章如何快速的开发一个完整的iOS直播app(原理篇)

开发一款直播app,集成ijkplayer成功后,就算完成直播功能一半的工程了,只要有拉流url,就能播放直播啦

本篇主要讲解的是直播app中,需要用到的一个很重要的开源框架ijkplayer,然后集成这个框架可能对大多数初学者还是比较有难度的,所以本篇主要教你解决集成【ijkplayer】遇见的各种坑

很多文章,可能讲解的是如何做,我比较注重讲解为什么这样做,大家有什么不明白,还可以多多提出来

如果喜欢我的文章,可以关注我微博:袁峥Seemygo

效果

直播.gif

一、基本知识

README.md文件:框架的描述文件,描述这个框架怎么使用

编译语言:程序在被执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件,运行时不需要翻译,所以编译型语言的程序执行效率高,比如OC,C,C++

解释性语言:解释性语言的程序不需要编译,在运行程序的时候才翻译,每个语句都是执行的时候才翻译。这样解释性语言每执行一次就需要逐行翻译一次,效率比较低

解释性语言执行和编译语言执行的区别

脚本语言:属于解析语言,必须通过解释器解析,将其一条条的翻译成机器可识别的指令,并按程序顺序执行。

shell解释器:shell是一个命令行解释器,相当于windows的cmd,处于内核和用户之间,负责把用户的指令传递给内核并且把执行结果回显给用户.

bash: bash是一种shell解释器版本,shell有很多种版本,就像人,也分不同国家的人。

shell:通常我们说的shell,指的是shell脚本语言,而不是shell解释器。

sh:sheel脚本文件后缀名

二、下载ijkPlayer

三、编译ijkPlayer的步骤

1、找到ijkPlayerMediaDemo并运行

bug1.png

原因:因为libavformat是ffmpeg中的库,而ijkplayer是基于ffmpeg这个库的,因此需要导入ffmpeg

解决:查看ijkplayer的README.md,一般都会有说明。

执行脚本.png

init-ios.sh脚本的作用:下载ffmpeg源码

如何执行init-ios.sh脚本文件

找到init-ios.sh文件.png 进入init-ios.sh目录.png cd ijkplayer-master.png 执行init-ios.sh.png 执行脚本后.png

2、下载好ffmpeg源码后,再次运行Demo

Demo源码.png IJKMediaPlayer工程位置.png 编译ffmpeg.png

编译ffmpeg库

Snip20160828_19.png 执行./compile-ffmpeg.sh all

执行compile-ffmpeg.sh all前

编译前.png

执行compile-ffmpeg.sh all后

编译后.png

3.再次运行Demo,就能成功了,因为IJKMediaPlayer库获取到ffmpeg库了

Demo运行成功.png

四、如何集成到ijkplayer到自己的项目中

Snip20160830_9.png

1.推荐自己把IJKMediaPlayer打包成静态库,在导入到自己的项目中。

2.直接把ijkplayer库拖入到自己的工程中,

Snip20160829_5.png

3.导入ijkplayer依赖的库,具体可以查看ijkplayer的README

Snip20160829_6.png Snip20160829_7.png

五、使用ijkplayer直播

1.ijkplayer用法简介

2.抓取数据

- (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,直播

- (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点击下载

具体步骤:

打开YZLiveApp.xcworkspace问题 Snip20160830_12.png 拖入ijkplayer到与Classes同一级目录下.png Snip20160830_14.png
上一篇下一篇

猜你喜欢

热点阅读