ijkplayer 是一款做视频直播的框架, 基于ffmpeg, 支持 Android 和 iOS, 网上也有很多集成说明, 但是个人觉得还是不够详细, 在这里详细的讲一下在 iOS 中如何集成ijkplayer, 即便以前从没有接触过, 按着下面做也可以集成成功!
一. 下载ijkplayer
ijkplayer
下载地址:https://github.com/Bilibili/ijkplayer
下载完成后解压, 解压后文件夹内部目录如下图:
二. 编译 ijkplayer
说是编译 ijkplayer, 其实是编译 ffmpeg, 在这里我们已经下载好了ijkplayer
, 所以 github 上README.md
中的Build iOS
那一步中有一些步骤是不需要的.
下面开始一步一步编译:
1.打开终端, cd 到jkplayer-master
文件夹中, 也就是下载完解压后的文件夹, 如下图:
2.执行命令行./init-ios.sh
, 这一步是去下载 ffmpeg 的, 时间会久一点, 耐心等一下.如下图:
3.在第2步中下载完成后, 执行cd ios
, 也就是进入到 ios目录中, 如下图:
4.进入 ios 文件夹后, 在终端依次执行./compile-ffmpeg.sh clean
和./compile-ffmpeg.sh all
命令, 编译 ffmpeg, 也就是README.md
中这两步, 如下图:
编译时间较久, 耐心等待一下.
三. 打包IJKMediaFramework.framework
框架
集成 ijkplayer 有两种方法:
一种方法是按照IJKMediaDemo
工程中那样, 直接导入工程IJKMediaPlayer.xcodeproj
, 在这里不做介绍, 如下图:
第二种集成方法是把 ijkplayer 打包成framework
导入工程中使用. 下面开始介绍如何打包IJKMediaFramework.framework
, 按下面步骤开始一步一步做:
- 首先打开工程
IJKMediaPlayer.xcodeproj
, 位置如下图:
打开后是这样的, 如下图:
要打包的 framework 工程.png2.工程打开后设置工程的 scheme, 具体步骤如下图:
第一步.png 第二步.png3.设置好 scheme 后, 分别选择真机和模拟器进行编译, 编译完成后, 进入 Finder, 如下图:
进入 Finder 后, 可以看到有真机和模拟器两个版本的编译结果, 如下图:
运行后生成的文件.png下面开始合并真机和模拟器版本的 framework, 注意不要合并错了, 合并的是这个文件, 如下图:
合并真机和模拟器文件中的这个文件.png打开终端, 进行合并, 命令行具体格式为:
lipo -create "真机版本路径" "模拟器版本路径" -output "合并后的文件路径"
合并后如下图:
合并生成后的文件.png下面很重要, 需要用合并后的IJKMediaFramework
把原来的IJKMediaFramework
替换掉, 如下图, 希望你能看懂:
上图中的1、2两步完成后, 绿色框住的那个IJKMediaFramework.framework
文件就是我们需要的框架了, 可以复制出来, 稍后我们需要导入工程使用.
四. iOS工程中集成ijkplayer
新建工程, 导入合并后的IJKMediaFramework.framework
以及相关依赖框架以及相关依赖框架,如下图:
导入框架后, 在ViewController.m
进行测试, 首先导入IJKMediaFramework.h
头文件, 编译看有没有错, 如果没有错说明集成成功.
接着开始在ViewController.m
文件中使用IJKMediaFramework
框架进行测试使用, 写一个简单的直播视频进行测试, 在这里看一下运行后的结果, 后面会放上 Demo 供下载.
至此, ijkplayer 集成完毕!
Demo地址:https://coding.net/u/wanglei123/p/ijkplayerDemo/git
官方讨论区:https://github.com/Bilibili/ijkplayer/issues.有问题可以在这里进行查找与提问.
网友评论
'IJKMediaFramework/IJKMediaFramework.h' file not found
这个要怎么破?
./libavutil/arm/asm.S:50:9: error: unknown directive
.arch armv7-a
在 compile-ffmpeg.sh 中删除 armv7 , 修改如:
FF_ALL_ARCHS_IOS8_SDK="arm64 i386 x86_64"
再重新执行出现错误的命令: ./compile-ffmpeg.sh all
打印出来
2017-07-06 17:06:24.117 bilili[654:11711] AVPlayer: onError
2017-07-06 17:06:24.175 bilili[654:11711] loadStateDidChange: ???: 0
2017-07-06 17:06:24.176 bilili[654:11711] playbackStateDidChange: IJKMPMovieFinishReasonPlaybackError: 1
var ijkLivePlay:IJKFFMoviePlayerController!
就报错了.
错误信息:
Apple Mach-O Linker Error Group
! "operator delete(void*)", referenced from:
! "operator new(unsigned long)", referenced from:
! clang: error: linker command failed with exit code 1 (use -v to see invocation)
"operator delete(void*)", referenced from:
_ijk_map_destroy in IJKMediaFramework(ijkstl.o)
std::__1::__tree<std::__1::__value_type<long long, void*>, std::__1::__map_value_compare<long long, std::__1::__value_type<long long, void*>, std::__1::less<long long>, true>, std::__1::allocator<std::__1::__value_type<long long, void*> > >::destroy(std::__1::__tree_node<std::__1::__value_type<long long, void*>, void*>*) in IJKMediaFramework(ijkstl.o)
std::__1::__tree<std::__1::__value_type<long long, void*>, std::__1::__map_value_compare<long long, std::__1::__value_type<long long, void*>, std::__1::less<long long>, true>, std::__1::allocator<std::__1::__value_type<long long, void*> > >::erase(std::__1::__tree_const_iterator<std::__1::__value_type<long long, void*>, std::__1::__tree_node<std::__1::__value_type<long long, void*>, void*>*, long>) in IJKMediaFramework(ijkstl.o)
"operator new(unsigned long)", referenced from:
_ijk_map_create in IJKMediaFramework(ijkstl.o)
std::__1::map<long long, void*, std::__1::less<long long>, std::__1::allocator<std::__1::pair<long long const, void*> > >::operator[](long long const&) in IJKMediaFramework(ijkstl.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
#import <IJKMediaFramework/IJKMediaFramework.h>的时候提示文件不存在
duplicate symbol _validate_avcC_spc in:
/Users/zhangjunze/Desktop/测试文件/10/10/IJKMediaFramework.framework/IJKMediaFramework(IJKVideoToolBoxAsync.o)
/Users/zhangjunze/Desktop/测试文件/10/10/IJKMediaFramework.framework/IJKMediaFramework(IJKVideoToolBoxSync.o)
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: /Users/yangchenglong/Library/Developer/Xcode/DerivedData/IJKMediaPlayer-fzolvazvmufpushbpkhaudrouxqf/Build/Products/Release-iphoneos/IJKMediaFramework.framework/IJKMediaFramework and /Users/yangchenglong/Library/Developer/Xcode/DerivedData/IJKMediaPlayer-fzolvazvmufpushbpkhaudrouxqf/Build/Products/Release-iphonesimulator/IJKMediaFramework.framework/IJKMediaFramework have the same architectures (armv7) and can't be in the same fat output file
但是 我ijk的官方demo 是运行的起来的, 说明ffmpeg的下载以及ios里的编译是没错的, 难道是打包framework的时候出错了?
lipo -create "/Users/xinjianbao/Library/Developer/Xcode/DerivedData/IJKMediaPlayer-gpmnpuhbduqugoeksbvdwafyxygs/Build/Products/Release-iphoneos/IJKMediaFramework.framework/IJKMediaFramework " "/Users/xinjianbao/Library/Developer/Xcode/DerivedData/IJKMediaPlayer-gpmnpuhbduqugoeksbvdwafyxygs/Build/Products/Release-iphonesimulator/IJKMediaFramework.framework/IJKMediaFramework" -output "/Users/xinjianbao/Library/Developer/Xcode/DerivedData/IJKMediaPlayer-gpmnpuhbduqugoeksbvdwafyxygs/Build/Products/IJKMediaFramework.framework“
按下回车以后Linux,就弹一个>就没反应了
fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: can't open input file: Release-iphoneos/IJKMediaFramework.framework/IJKMediaFramework (No such file or directory)
ijkmp_stop()
ijkmp_stop()=0
ijkmp_shutdown_l()
LittleBaiTravel(1334,0x16e503000) malloc: *** error for object 0x114b14008: pointer being freed was not allocated
这是控制台打的log
我合并真机和模拟器版本的 framework,lipo -create "真机版本路径" "模拟器版本路径" -output "合并后的文件路径", 没有合并出来,请教
后期的带宽或是CDN要贵死人..
error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: can't move temporary file: /Users/stone/Library/Developer/Xcode/DerivedData/IJKMediaPlayer-hbywmfgpuwcrdnfwhicejvrarwyp/Build/Products/ to file: /Users/stone/Library/Developer/Xcode/DerivedData/IJKMediaPlayer-hbywmfgpuwcrdnfwhicejvrarwyp/Build/Products/.lipo (Is a directory)
大神 求解啊