ijkplayer ios项目集成(图文详细版)

来源:互联网 发布:淘宝盖楼活动在哪进去 编辑:程序博客网 时间:2024/06/15 01:51

    前言

     

    因为项目的关系,在5个月前写了一篇关于ijkplayer集成的文,当时是以个人笔记的形式修改后发出来的,写的太糙,没有考虑到刚接触ijkplayer新人的感受,导致大部分人即使看完依然表示疑惑不解。

     

    回头看看自己写的这篇文,确实需要好好检讨。于是我决定重新回炉,以一个新手的角度思考,写下这篇ijkplayer ios项目集成(图文详细版)一步步带着大家来。

     

    1.必要的准备工作

     

    首先是安装必要的工具

     

    homebrew:MAC OSX上必备的软件包管理工具,有了它之后可以很方便的安装开发套件,首先我们打开命令终端输入以下命令安装homebrew:

    1. ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

    复制代码

    待安装完毕后使用以下命令分别安装git和yasm:

    1. brew install git
    2. brew install yasm

    复制代码

    因为我之前都已经安装过了,所以在这里做一个版本检查:

    1. (zsh) Ø.9.5 (git revision 2fd4Ø; last camit 2016-03-22) git --version git version 2.7.4 yasm --version yasm 1.3.Ø Carviled on Nov 23 2015. Copyright (c) 2ØØ1-2Ø14 Peter Johnson and other Yasm developers. Run yasm --license for licensing and sumpry.

    2.下载ijkplayer

     

    1.首先我们在当前用户的目录下创建一个文件夹用于后面存放ijkplayer项目,打开终端输入:

    1. //创建showcase目录
    2. mkdir ~/showcase
    3. //进入该目录中
    4. cd ~/showcase

    复制代码

    2.接着我们需要将ijkplayer项目克隆到本地,在终端中输入:

    1. //克隆项目
    2. git clonehttps://github.com/Bilibili/ijkplayer.git ijkplayer-ios
    3. //进入ijkplayer-ios
    4. cd ijkplayer-ios
    5. //切换分支
    6. git checkout -B latest k0.5.1
    7. //查看
    8. ls

    复制代码

    3.真实效果如下:

    1. •-/showcase/iikpayer-ios (zsh) mkdi r N/s}mcase cd N/symcase it clone https:// ithub.can/Bi1ibi1i/i•kp1 r. •t i • kpl r-ios Cloning into 'ijkpiayer-ios• . raote: Counting objects: 20377, raote: Total 20377 (delta O), reused (delta D, pack-reused 20377 Receiving objects: 1B (2ø377/2ø377), 6.68 MiB 1 58.øø KiB/s, done. Resolving deltas: 1B (12O7/12O7), done. Checking connectivity... ijkplayer-ios COPYING. GPLv2 COPYING. GPLv3 COPYING. LGPLv2.1 COPYING. LGPLv2.1.txt COPYING. LGPLv3 BOWLE_LICENSE-APACHE2 NEWS BOTICE init-android-openssl . sh ccmpi le-android-j4a.sh init-android-prof. sh config extra ijkmedia ijkprof init-androi d-exo. sh init-android-j4a. sh init-android. sh init-config. sh init-ios-openssl . sh init-ios. sh ios tool s init-android-libyuv.sh version. sh —/stmcase/i • r-ios nuster git checkout -B latest kø 5 1 t to a atest N/symcase/i kplayer-i os latest 31d 31d

    下载ffmpeg并编译

     

    1.首先我们需要下载ffmpeg,接着上面的目录在终端中输入:

    1. //下载ffmpeg和相关脚本
    2. ./init-ios.sh

    复制代码

    因为ffmpeg比较大,再加上访问国外线路比较慢,遇到下载失败需要多试几次,如果有代理建议上代理,真实效果如下:

    1. izsh) r-ios latest p hains4 ./init-ios. sh 31d [proxychains] config file found: /usr/10ca1/CeUar/proxychains-ng/4. Il/etc/proxy chains. conf Cproxychains] preloading /usr/10ca1/CeUar/proxychains-ng/4. Il/lib/libproxychain s4.dy1ib git version 2.7.4 pull gas-preprocessor base Fetching origin 'Users/shi rokutn/slmcase/i j kplayer-i os pull ffnveg base Cloning into 'extra/ffnveg' . raote: Counting objects: 477723, ±ne. retote: Total 477723 (delta O), reused (delta O), pack-reused 477723 Receiving objects: 1B (477723/477723), 164.82 MiB 1 3.19 MiB/s, done. Resolving deltas: 1B (372216/372216), done. Checking connectivi

    太长了中间我就略过去了,需要留意中间有没有出错,否则影响后面流程。

     

    2.编译ffmpeg

    1. //进入ios目录
    2. cd ios
    3. //clean
    4. ./compile-ffmpeg.sh clean
    5. //编译
    6. ./compile-ffmpeg.sh all

    复制代码

    真实效果如下:

    —/st•mcase/ijkplayer-ios latest > cd ios symcase/ijkplayer-ios/ios latest ./cmvile-ffnpeg.sh clean check xcode version - arm.n amr64 i386 x86.64 'Users/shi rokum/slmcase/i j kplayer-i os 'Users/shi rokutn/symcase/i j kplayer-ios/ios 'Users/shi rokutn/s}mcase/i j kplayer-i os/i os 'Users/shi rokutn/s"mcase/i j kplayer-i os/i os 31d 31d

    编译环节比较久,估计15分钟,中间偶尔会报警告,只要不是错误,无视即可。

    cc 1 ibswscale/sl i ce. o Iibswscale/slice.c: 178: 56: mrning : assigning to 'uint8—t (aka 'unsigned clur fran 'const uint8_t (aka 'const unsigned c}ur• * discards qtnlifiers C-Wi i e -poi nter -types -di scards ers] - first + j] src_Ci] + j * strideCi]; libswscale/slice. c: 184: 37: assigning to 'uint8—t (aka 'unsigned frm 'const uint8_t 'const unsigned * discards qtnlifiers C-Wi e -po i nter -types -di scards ers] s->p1aneCi] . lineCj] 2 generated. src—Ci] + j * strideCi]; fiwamingU, u ynerrorn cc cc cc ibswscale/swscale. o i bswscal e/swscale_unscaled. o libswscale/utils. o

    正确编译的效果:

    lipo archs: armv7 am64 i386 Architectures in the fat file: 'Users/shirokuu/sh%case/ijkplayer-ios/ios/build 'universal/lib/libavcodec.a are: amy7 i386 x86_64 Architectures in the fat file: nsers/shirokutn/sh%case/ijkplayer-ios/ios/build 'universal/lib/libavfilter.a are: amw7 i386 Architectures in the fat file: 'Users/shirokum/sh%case/ijkplayer-ios/ios/build /universal/lib/libavfomnt.a are: amnv7 i386 Architectures in the fat file: "Users/shirokurn/sh%case/ijkplayer-ios/ios/build 'universal/lib/libavutil .a are: arm" i386 x86_64 am64 Architectures in the fat file: 'Users/shirokutn/sh%case/ijkplayer-ios/ios/build 'universal/lib/libswscale.a are: amnv7 i386 x86_64 Architectures in the fat file: 'Users/shirokuu/sh%case/ijkplayer-ios/ios/build 'universal/lib/libswresmvle.a are: amw7 i386 skip skip skip skip skip skip skip skip Iibcrypto.a of amy7 libcrypto.a of libcrypto.a of i386 ibcrypto.a of libssl.a of amy7 libssl.a of libssl.a of i386 libssl.a of j kplayer-ios/ios latest 31d

    前面几步是新手最容易遇到错误的环节(其实大部分还是网络问题,你懂的),成功走到这步后就简单多了

    热身运动,从Demo入手

     

    1.ijkplayer给我们提供了一个学习用的demo,它就是IJKMediaDemo。

     

    首先我们先找到IJKMediaDemo,并打开它:

    IJKMediaDemo android compile-android- contig COPYING.GPLv2 COPYING.GPLv3 j4a.sh build compile-ffmpeg.sh compile-openssl.sh "mpeg-arm64 ftmpeg-armv7 ttmpeg-i386 ftmpeg-x86_64 IJKMediaDem0 IJKMediaPlayer IJKMediaPodDemo tools WKMediaDemo IJKMediaDemoxcodeproj XCAssets COPYING.LGPLv2.1 COPYING.LGPLv2.1 txt COPYING.LGPLv3 extra ijkmedia ijkprof init-android-exo.sh init-android- j4a.sh init-android-libyuv.sh _J init-android-openssl.sh _L init-android-prot.sh init-android.sh init-config.sh _J init-ios-openssl.sh init-ios.sh ios IJKMediaDemo.xcodeproj Xcode Project— 34 KB

    2.运行Demo

     

    只要前面的流程没报错,这里编译运行都不会出现问题:

     

    我们在Online Samples中选择一个m3u8测试ijkplayer是否运行正常。

     

    不过有些公司会封锁在线播放视频行为,可能出现无法播放的情况,比如我司(- -||),我们可以使用本地视频来解决这个问题,后面讲解代码的时候会提到。

     

    大家还记得官网上的这句话吗?

    1. # import ios/IJKMediaPlayer for MediaPlayer.framework-like interface (recommended)

    复制代码

    将IJKMediaPlayer集成进项目中当framework一样调暴露的接口用,看下面画红圈处:

    IJKMediaDemo)O iPhone 6s Plus No Selection Running LIKMediaDemo on iPhone 65 Plus V _ IJKMediaDemo V IJKMedia Player.xcodeproj Classes IJKMedia Framework IJKMediaFrameworkTests Frameworks Products Framewo IJKMediaDemo Products X CA ssets iPhone 6s Plus - iPhone 6s Plus / i0S 9.3 (13E230) TEST PATTERN - ear 1 16 000016 No Editor

    3.ijkplayer基本使用方式

    1. IJKFFOptions *options = [IJKFFOptions optionsByDefault]; //使用默认配置
    2. self.player = [[IJKFFMoviePlayerController alloc] initWithContentURL:self.url withOptions:options]; //初始化播放器,播放在线视频或直播(RTMP)
    3. // NSString *filePath = [[NSBundle mainBundle] pathForResource:@"init"ofType:@"mp4"];
    4. // self.player = [[IJKFFMoviePlayerController alloc]initWithContentURLString:filePath withOptions:options]; //初始化播放器,播放本地视频
    5. self.player.view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
    6. self.player.view.frame = self.view.bounds;
    7. self.player.scalingMode = IJKMPMovieScalingModeAspectFit; //缩放模式
    8. self.player.shouldAutoplay = YES; //开启自动播放
    9. self.view.autoresizesSubviews = YES;
    10. [self.view addSubview:self.player.view];
    11. -------------常用操作-------------------
    12. //准备
    13. [self.player prepareToPlay];
    14. //播放
    15. [self.player play];
    16. //暂停
    17. [self.player pause];
    18. //销毁
    19. [self.player shutdown];

    复制代码

    我将ijkplayer最基本的代码都用红圈圈出来了

    Pius I JKMediaDemo • rib Misc Files Running on iPhone // t 1 OKFFMov-iePLayerContr01 checkltPLayerUersTonMatch:YES wajor:ä t- IJKFFOptions *options [13KFFOptions optionsByDefauIt] ; self.player ttIJKFFMowiePIayerControIIer altoc] NSString *filePath z ttNS8undte main8undIe] self.ptayer z tt13KFFMoviePtayerControtIer attocjinitWithContentURLString:fiIePath self. player .view. autoresizingMask UIV-iewAutores-izingFIexibteW-idthlUIViewAutoresiz•ingFIex-ibIeHeight; self .player. view. frame self.view.bounds; self.player. scalingMode = 13KMPYovieScaIingXodeAspectFit; seLf.ptayer.shoutdAutopIay = YES; self.view.autOresizesSubviews YES; self. view addSubview:seIf. la er.view • LseLt.view addSubview:seLr.mediaControLJ; self.medfacontrot.delegatemayer self. player; 90 92 107 ' 09 — (void) ) animated { [super vie'* ItAppear ; [self ; [self.player prepareToPIay]; (void) viewDidDisappear: ( ECJOU)animated { [super viewDidDisappear:animated) ; [self. player shutdown]; -v o r•caoonuoservers]; remove (BOOL) shouldAutorotateToInterfaceOr1 : ( Ullnte r on ) tolnterfaceorf entatf return ulInterfaceOrientationIsLandscape(toInterfaceOrientation); 01 Auto C I

    将ijkplayer集成进自己的项目中

     

    1.直接拖拽(暂不可用)

    ijkplayer-showcase IPhone Es Plus > ijkplayer-showcase General ijkplayer-showcase: Capabilities Ready Today at Resource Tags Main Interface Device Orientation Status Bar Style Build Settings Build Phases AudioTooIboxframework AVFoundationframework CoreGraphics. framewqyrk CoreMedia.framework Iibz.tbd libbz2.tbd MediaPIayer.framework OpenGLES.framework QuartzCore.framework UlKit.framework VideoTooIöox.framework w ijkplayer-showcase e la ayer.xco eproj Classes IJKMediaFramework IJKMediaFrameworkTests Frameworks Products h App legate. AppDeIegate.m h ViewContrOIIer.h ViewControIIer.m Main storyboard A ssets.xca ssets LaunchScreen.storyboard Info.plist Supporting Files Products PROJECT ijkplayer-showcase TARGETS iikolayer-showcase Main Portrait n Upside Down Landscape Left Landscape Right Default n Hide status bar Requires full screen App Icons and Launch Images App Icons Source Launch Images Source App Icon use Asset Catalog Launch Screen File LaunchScreen Embedded Binaries Linked Frameworks and Libraries AudioTooIbox.framework AVFoundation.framework CoreGraphics.tramework CoreMedia.tramework Iibz.tbd (j' libbz2.tbd MediaP'ayer.framework OpenGLES.framework QuartzCore.framework UlKit.frameworW VideoTooIOox.framework IJKMediaFrameworkframework Add embedded binaries here guild Rules Status Required Required A Required A Required A Required Required A Required A Required A Required Required A Required A Required A

    不知道为什么这次创建出的工程会报头文件找不到,我怀疑是不是头文件搜索出了问题,暂时还没找到具体原因,如下所示:

    88 : 7 10) Ijkplayer-showcase ijkplayer-showcase ViewContr011er . m •ijkplayer-showcase ViewControIIer.m No Selection Created by shi rokuma on 16/5/27. Copyright @ 231* shi rokuma. All rights reserved. *import "ViewContr011er. *import "13WoviePtayerViewControIIer. h" O 'IJKMoviePlayerViewController.h' tile not found 121 @interface ViewControIter ( )

    2.制作framework

     

    相比拖拽引入的方式,制作出来的framework体积来的更小,默认情况下大约100MB,容易放到版本管理中。而且可以事先针对开发和生产做不同的配置来精简framework,等到生产时再替换生产的framework就好,节约时间。

     

    当然缺点也是必须iOS8以上才支持framework,这个还得看项目。.a包我目前还没做过不太清楚。

     

    制作framework其实挺方便,因为作者基本上已经帮我们设置好了。我们只需要对细节进行一些微调就完成了。

     

    2.1.首先我们打开IJKMediaPlayer.xcodeproj,如下图所示:

    COPYING.LGPLv2. I-txt COPYING.LGPLv3 extra ijkmedia ijkprot init-android-exo.sh init-android- j4a.sh init-android-libyuv.sh init-android-openssLsh init-android-prot.sh init-android.sh init-contig.sh init-ios-openssl.sh init-ios.sh NEWS.md NOTICE README.md tools version.sh IJKMediaPlayer build compile-ffmpeg.sh compile-openssl.sh ffmpeg-arm64 ttmpeg-armv7 ftmpeg-i386 ffmpeg-x86_64 IJKMediaDemo IJKMediaPlayer IJKMediaPodDemo tools IJKMediaFramework IJKMediaFrameworkTests IJKVediaPlayer WKMediaPIayer_xcodeproj

    2.2.接着点击IJKMediaFramework出现选择框,选择edit scheme,如下图所示:

    6s Plus IdKMediaF IJKMediaPIayer Classes IJKMediaFramework IJKMediaFramework New Scheme... Manage Schemes... PROJECT IJKMedia Framework Tests Frameworks Products IJKMediaPIayer TARGETS IJKMediaFramework IJKMediaFramewor..

    2.3.将buildconfiguration改为Release后点Close,如下图所示:

    IJKMediaFramework Build Release L Test Debug Profile Release Analyze C•ebcg Archive Release Duplicate Scheme iPhone Es Plus Manage Schemes... Arguments Options Diagnostics Build Configuration Executable Debug Process As Launch Shared Release None Oeöug executable MO (snirokuma) root Automatically Wait executaö;c to Dc lounchco Release Close

    2.4.分别在模拟器和真机(GenericiOS Device也可以)上编译

     

    2.5.打开framework所在的目录,如下图所示:

    IJKMediaPIayer Classes IJKMediaFramework IJKMediaFrameworkTests Frameworks Products IJK MediaFra rk. E] IJKMediaFrameworkTestS PROJECT IJKMediaPIayer TARGETS WKMediaFramework, Show in inder Open wit -External Editor Open As Show File Inspector

    2.6.接下来我们要将两个framework合并在一起,这样就可以在真机和模拟器上开发调试了

     

    finder中显示有两个文件夹,看名字就能猜到iphoneos是真机,iphonesimulator是模拟器的版本,如下图所示:

    Release-iphoneos IJKMediaFra.„rk.framework Release-iphoneos Release-iphonesimulator

    接下来我们要通过lipo的命令将两者合并输出,在Products目录下输入:

    1. //合并
    2. lipo -create Release-iphoneos/IJKMediaFramework.framework/IJKMediaFramework Release-iphonesimulator/IJKMediaFramework.framework/IJKMediaFramework -output IJKMediaFramework
    3. //将合并后的framework拷贝到iphoneos/IJKMediaFramework.framework中
    4. cp IJKMediaFramework Release-iphoneos/IJKMediaFramework.framework/

    复制代码

    如下图所示:

    ayer -ei nboupyndwas±fontbvi wi qn/Bui d/P roducts lipo -create Re -output IJW an aye r -e i wvi qn/Bui d/P roducts Release-iphoneos Release-iphonesimulator a PI aye r -ei nboupyndvoasdofontbv"i wv-i qn/Bui d/P roducts cp frat—rk/

    可以使用lipo-info IJKMediaFramework查看framework的支持

    lipo -info Architectures in the fat file: are: amw7 i386

    2.7.将制作好的iphoneos/IJKMediaFramework.framework复制到要集成的项目中,如下图所示:

    Q) IJKMediaFramework.framework ijkplayer-showcase ijkplayer-sho„.se.xcodeproj AppDelegate.h AppDelegate.m Assets .xcassets Base.lproj l.JKMediaFra„ffk.tramework Into.plist mainm ViewController.h ViewController.m CodeSignature Headers IJKMediaFramework Into.plist Modules

    2.8.AddFiles...

    > ijkplayer-showcase General ijkplayer-sh owcase ijkpiayer-showcase h AppDeIegate.h App Delegate .m h ViewControIIer.h ViewControI'er. Main .storyboard A ssets.xca *sets LaunchScreen.s Info.plist Show in Finder Open with External Editor Open As Show File Inspector New File... Add Files to "ijkpiayer-showcase". Delete Delete Real Group

    2.9.添加动态库

    frshowcase OpenGLES.fra Med I a P CoreVideo CoreMedia.framework CoreGraphics .tramework AVFOLmdati-Or1 Audi OTOOlbOX f iikplayer-showcase iPhone ss Plus < ijkplayer-showca se PROJECT iikplaycr• Showcase TARGETS iikp'ayer-showcase ijkplayer-sh.wcase ties Build ijkplayer-showcase: Succeeded Today at Se tings Tags O Orientation Status Bar Style I mfO Phases Rules Reg wired Required Required Required Required Required C Required Reg wired Required Required Required Re O wired Required Identity and Type Portrait n upside Down Landscape Left Landscape Right Default CJ Hide n Requires full Screen Path Absolute ijkglayer- _ XCOd raj Docu ments Work k p layer. showcase / ijkpraycr• show•ca s e ep Iibz.tbd libbz2,tbd h App De'egate h rp App Oelegato.m h, ViewControner.h Assets.xcassets Info. plist Supporting Files D Products App Icon use Asset Catalog rame•xo App Icons and Launch Images App Source Launch Images Source Launch Screen File Embedded Binaries Add embedded binaries here Linked Frameworks and L QuartzCore.framework OpenGLES.framework MobileCoreServices.tramework Med i a P CoreVideo.tramework CoreMedia.framewOrk CoreGraphics.tramework AVFOun dation _fram Audi 01001 box f liObz2.tbC I JKMediaFramewo.rk,tramework Project Document ProÉCt XCOde 3.2•compatibte Organization Shirokuma Class Prefix re Settings Wrap So Contro I Repository current æancn - Version • Status No changes No Matches A-EVE

    2.10.测试集成


     

    将本段代码复制到ViewController.m中,可直接使用:

    1. #import "ViewController.h"
    2. #import <IJKMediaFramework/IJKFFMoviePlayerController.h>
    3. @interface ViewController ()
    4. @property(nonatomic,strong)IJKFFMoviePlayerController * player;
    5. @end
    6. @implementation ViewController
    7. - (void)viewDidLoad {
    8.     [super viewDidLoad];
    9.     IJKFFOptions *options = [IJKFFOptions optionsByDefault]; //使用默认配置
    10.     NSURL * url = [NSURL URLWithString:@"rtmp://live.hkstv.hk.lxdns.com/live/hks"]; 
    11.     self.player = [[IJKFFMoviePlayerController alloc] initWithContentURL:url withOptions:options]; //初始化播放器,播放在线视频或直播(RTMP)
    12.     self.player.view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
    13.     self.player.view.frame = self.view.bounds;
    14.     self.player.scalingMode = IJKMPMovieScalingModeAspectFit; //缩放模式
    15.     self.player.shouldAutoplay = YES; //开启自动播放
    16.     self.view.autoresizesSubviews = YES;
    17.     [self.view addSubview:self.player.view];
    18. }
    19. - (void)viewWillAppear:(BOOL)animated {
    20.     [super viewWillAppear:animated];
    21.     [self.player prepareToPlay];
    22. }
    23. -(void)viewDidDisappear:(BOOL)animated {
    24.     [super viewDidDisappear:animated];
    25.     [self.player shutdown];
    26. }
    27. - (void)didReceiveMemoryWarning {
    28.     [super didReceiveMemoryWarning];
    29.     // Dispose of any resources that can be recreated.
    30. }
    31. @end

    复制代码

    在模拟器上声音和画面不同步或者比较卡顿的现象在真机没事的,不用太担心。

    iPhone 6s Plus - iPhone es Pus / ios g.g (12E2go:

    3.通过第三方的cocoapods集成方式(非官方)

     

    为苦于各种奇怪原因而无法玩耍的小伙伴们提供了包装了ijkplayer的pod,仅供测试体验。

     

    1.基于ijkplayer 5737ccc提交制作成的framework,需要注意的是需要iOS8+。

     

    2.如果使用ijkplayer过程中遇到BUG什么的,可以移步去ijkplayer作者的GitHub上提issue或者PR。

     

    地址在这里https://coding.net/u/shirokuma/p/IJKMediaLibrary/git,因framework超过100MB无法传到GitHub上,就放到Coding上了。祝各位玩的愉快!

     

    技巧

     

    1.如何强制打开硬解

    1. //需要注意的是强制打开硬解,以前发现过播放视频白屏等问题,现在的版本不清楚,谨慎开启
    2. [options setPlayerOptionIntValue:1 forKey:@"videotoolbox"];

    复制代码

    我自己集成ijplayer 自定义了个播放器dome地址:https://github.com/Wang454431208/ijkPlayer