- 最近在研究直播 app 的实现,然而系统的播放器,不能解码直播视频的格式,自然也不能用于直播。好在 B 站提供了一款名为 ijkplayer 的开源直播框架,它基于 ffmpeg , 支持 Andriod 和 iOS 。现在将 ijkplayer 集成到直播 app 的过程分享给大家。
一、下载
- 前往 GitHub 搜索 ijkplayer ,传送门在此 https://github.com/Bilibili/ijkplayer
-
下翻找到 Build iOS 一项,如下图
Build iOS.png
- 打开终端,为了便于操作,cd 到 Desktop
1.GitHub写的很明朗,所以只需要傻瓜式操作,git clone 一下
git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-ios
过程很快,因为这不是完整的 ijkplayer
2.进入到 ijkplayer-ios 文件下,并切换到 B latest k0.6.3 这一分支
cd ijkplayer-ios
git checkout -B latest k0.6.3
3.主要人物出场了,下载 ffmpeg
./init-ios.sh
虽然翻了墙,网速很快,但这一过程还是十分漫长,可以去看看美剧
4. ffmpeg 下载完毕,但此时 demo 依旧是无法运行的,还需编译一下,依次执行如下命令即可
cd ios
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all
相比下载的过程,这里快很多,中间会显示几个 warning ,不必担心。这时可以打开 demo ,运行一下。但是我在 demo 中选的视频都播放不了,在网上找了个直播地址,输进去可以播放。
二、合并
- GitHub 上介绍了一种导入方法,但是我在网上发现了另一个方法,更方便今后的使用,将我们需要的 framework 文件合并导出。
1.打开 IJKMediaPlayer 的工程文件,将 Edit Scheme 中 Info 默认的 Debug 更改为 Release
![](https://img.haomeiwen.com/i2854545/55109ed6798189a3.png)
因为我们不需要对该 framework 进行修改调试,拿过来直接用即可,而项目上线是需要设置为 Release 模式的
2.选择真机模式,command + B 编译一下;再选择任意一个模拟器模式,编译一下。
![](https://img.haomeiwen.com/i2854545/8f8308caecaf96ab.png)
选中 IJKMediaFramework.framework,Show in Finder,你会看到目录下多了Release-iphoneos 和 Release-iphonesimulator 两个文件。我们要合并的就是两个文件下的 IJKMediaFramework 文件。
![](https://img.haomeiwen.com/i2854545/fa1387ff5cf35ea8.png)
3.在终端中,输入命令进行合并
lipo -create "真机的 IJKMediaFramework 路径" "模拟器路径" -output "合并后路径"
ps: 直接拖拽文件到终端内,它的路径就出来了。
⚠️ 合并后的文件路径,我们要给合并后文件命个名,否则终端会出现 error 信息。直接把下图的 Products 拖拽到终端,在路径后加上 /IJKMediaFramework 即可,下图右侧的 IJKMediaFramework 文件即为合并后的文件。
![](https://img.haomeiwen.com/i2854545/d2394dcd7ef47eca.png)
将下图左侧的 IJKMediaFramework 文件,拖拽到右侧,选择替换。替换完毕后,中间的 IJKMediaFramework.framework 即我们需要的文件,可以直放到桌面上,下一步使用了
![](https://img.haomeiwen.com/i2854545/b80f1be239aa5b39.png)
ps: 可以分别看一我们合并的两个文件,一个是66.5MB,一个是33.2MB,而我们合并后得到的文件是99.7MB,完美!(就是下面这个)
![](https://img.haomeiwen.com/i2854545/ae4cef8c5caf95f6.png)
三、集成
1.直接将我们上一步的到的 IJKMediaFramework.framework 拖入工程的 Frameworks 即可
⚠️ 一定要将 Copy items if needed 勾选上
![](https://img.haomeiwen.com/i2854545/42548fd3d16ad3c1.png)
2.导入其他相关依赖
![](https://img.haomeiwen.com/i2854545/b97e2edeec75116e.png)
⚠️ 不要漏添啊,一共13个
3.使用
在你要播放直播视频的 ViewController 中导入头文件
#import <IJKMediaFramework/IJKMediaFramework.h>
读下 demo,将你需要的方法直接复制过来,再传入你需要播放的数据源就 OK 啦(直播视频资源来自映客)
![](https://img.haomeiwen.com/i2854545/4650ccc13d97b97b.png)
![](https://img.haomeiwen.com/i2854545/b6e69ab9c88b9cc6.png)
下面是观看直播的 ViewController.m 文件,只用了几个基本的方法
(仿写的映客直播,过几天写完会把 demo 贴出来)
#import "QPPlayerViewController.h"
#import <IJKMediaFramework/IJKMediaFramework.h>
@interface QPPlayerViewController ()
@property (atomic, retain) id<IJKMediaPlayback> player;
@property (nonatomic ,strong) UIImageView * blurImageView;
@property (nonatomic, strong) UIButton * closeBtn;
@end
@implementation QPPlayerViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[self initPlayer];
[self initUI];
}
- (void)initUI {}
- (void)initPlayer {
IJKFFOptions * options = [IJKFFOptions optionsByDefault];
IJKFFMoviePlayerController * player = [[IJKFFMoviePlayerController alloc] initWithContentURLString:self.live.streamAddr withOptions:options];
self.player = player;
self.player.view.frame = self.view.bounds;
self.player.shouldAutoplay = YES;
[self.view addSubview:self.player.view];
}
/** 以下为 demo 里的方法,具体代码就不粘贴了 **/
- (void)viewWillAppear:(BOOL)animated {}
- (void)viewWillDisappear:(BOOL)animated {}
- (void)loadStateDidChange:(NSNotification*)notification {}
- (void)moviePlayBackDidFinish:(NSNotification*)notification {}
- (void)mediaIsPreparedToPlayDidChange:(NSNotification*)notification {}
- (void)moviePlayBackStateDidChange:(NSNotification*)notification {}
- (void)installMovieNotificationObservers {}
- (void)removeMovieNotificationObservers {}
@end
git 仓库地址:
git@github.com:JackieQu/QP_inke.git
网友评论