ijkplayer下载地址:https://github.com/Bilibili/ijkplayer
执行命令行./init-ios.sh,这一步是去下载 ffmpeg 的。
进入 ios 文件夹后,在终端依次执行./compile-ffmpeg.sh clean和./compile-ffmpeg.sh all命令,编译 ffmpeg。
集成时报./libavutil/arm/asm.S:50:9: error: unknown directive .arch armv7-a
armv7架构无法成功
解决方案一:放弃armv7,打开这个 compile-ffmpeg.sh 文件
第24行 改为: FF_ALL_ARCHS_IOS8_SDK="arm64 i386 x86_64"
第120行 改为: if [ "$FF_TARGET" = "armv7s" -o "$FF_TARGET" = "arm64" ]; then
第159行 改为: echo " compile-ffmpeg.sh arm64|i386|x86_64"
然后再编译。
但这样在之后lipo合并的库中就没有armv7版本了,所以在xcode项目的Valid Architectures里就要去掉armv7,否则会报错。
解决方案二:禁用汇编,将tools/do-compile-ffmpeg.sh文件里的armv7架构的情况,改为:
elif [ "$FF_ARCH" = "armv7" ]; then
FF_BUILD_NAME="ffmpeg-armv7"
FF_BUILD_NAME_OPENSSL=openssl-armv7
FF_XCRUN_OSVERSION="-miphoneos-version-min=6.0"
FF_XCODE_BITCODE="-fembed-bitcode"
FFMPEG_CFG_FLAGS="$FFMPEG_CFG_FLAGS--enable-pic --disable-asm"
这样就能编译出包含armv7架构的库了。
xcode 10 以后 libstdc++库被移除了 添加 libc++解决了
have the same architectures (arm64) and can't be in the same fat output file
XCode12之前:
编译模拟器静态库支持i386 x86_64两架构
编译真机静态库支持armv7 arm64两架构
使用lipo -create 真机 模拟器 -output 合并后的路径 命令可以将两个库合并成一个支持模拟器和真机i386 x86_64 armv7 arm64四种架构的库。
lipo -create /Users/limuyi/Library/Developer/Xcode/DerivedData/IJKMediaPlayer-hcsbbhekfetrssebqvgfnsjfrgxl/Build/Products/Release-iphoneos/IJKMediaFramework.framework/IJKMediaFramework /Users/limuyi/Library/Developer/Xcode/DerivedData/IJKMediaPlayer-hcsbbhekfetrssebqvgfnsjfrgxl/Build/Products/Release-iphonesimulator/IJKMediaFramework.framework/IJKMediaFramework -output /Users/limuyi/Library/Developer/Xcode/DerivedData/IJKMediaPlayer-hcsbbhekfetrssebqvgfnsjfrgxl/Build/Products/IJKMediaFramework
XCode12编译的模拟器静态库也支持了arm64,导致出现真机库和模拟器库不能合并的问题。
lipo -info 模拟器静态库路径 查看支持什么架构。
Build Settings -> Excluded Architectures里按照这样设置一下,再编译合并就不会报错了。
使用第三方Framework时XCode报 'xxx.h'file not found'错误
1.BuildSetting里面,Framework Search Paths 双击,新增 $(PROJECT_DIR)/Frameworks
指明我的framework放在了此文件夹,如果是放在根目录就不用新增。
2.Header Search Paths 双击,新增 "$(PROJECT_DIR)/Frameworks/IJKMediaFramework.framework/Headers"
指明头文件路径。
重要参数说明
IJKFFOptions *options = [IJKFFOptions optionsByDefault];
// 静音设置
//[options setPlayerOptionValue:@"1" forKey:@"an"];
// 设置播放前的探测时间 1,达到首屏秒开效果
[options setFormatOptionIntValue:1 forKey:@"analyzeduration"];
// 帧速率(fps)可以改,确认非标准帧率会导致音画不同步,所以只能设定为15或者29.97)
[options setPlayerOptionIntValue:29.97 forKey:@"r"];
// 设置音量大小,256为标准音量。(要设置成两倍音量时则输入512,依此类推)
[options setPlayerOptionIntValue:512 forKey:@"vol"];
// 最大fps
[options setPlayerOptionIntValue:30 forKey:@"max-fps"];
// 跳帧开关,默认为1
// 跳帧开关,如果cpu解码能力不足,可以设置成5,否则会引起音视频不同步,也可以通过设置它来跳帧达到倍速播放
[options setPlayerOptionIntValue:5 forKey:@"framedrop"];
// 开启硬编码 (默认是 0 :软解)
[options setPlayerOptionIntValue:1 forKey:@"videotoolbox"];
// h265硬解
//[options setPlayerOptionIntValue:1 forKey:@"mediacodec-hevc"];
// 指定最大宽度
[options setPlayerOptionIntValue:960 forKey:@"videotoolbox-max-frame-width"];
// 自动转屏开关
[options setFormatOptionIntValue:0 forKey:@"auto_convert"];
// 重连开启 BOOL
[options setFormatOptionIntValue:1 forKey:@"reconnect"];
// 超时时间,timeout参数只对http设置有效,若果你用rtmp设置timeout,ijkplayer内部会忽略timeout参数。
//rtmp的timeout参数含义和http的不一样。
[options setFormatOptionIntValue:30 * 1000 * 1000 forKey:@"timeout"];
// 如果使用rtsp协议,可以优先用tcp(默认udp)
[options setFormatOptionValue:@"tcp" forKey:@"rtsp_transport"];
// 播放前的探测Size,默认是1M, 改小一点会出画面更快
[options setFormatOptionIntValue:1024 * 16 forKey:@"probesize"];
//解码参数,画面更清晰
// 开启环路滤波(0比48清楚,但解码开销大,48基本没有开启环路滤波,清晰度低,解码开销小)
[options setCodecOptionIntValue:IJK_AVDISCARD_DEFAULT forKey:@"skip_loop_filter"];
// 跳帧
[options setCodecOptionIntValue:IJK_AVDISCARD_DEFAULT forKey:@"skip_frame"];
// 关闭播放器缓冲 (如果频繁卡顿,可以保留缓冲区,不设置默认为1)
//[options setPlayerOptionIntValue:0 forKey:@"packet-buffering"];
// param for living
// 最大缓存大小是3秒,可以依据自己的需求修改
[options setPlayerOptionIntValue:3000 forKey:@"max_cached_duration"];
// 无限读
[options setPlayerOptionIntValue:1 forKey:@"infbuf"];
// 关闭播放器缓冲
[options setPlayerOptionIntValue:0 forKey:@"packet-buffering"];
//param for playback
// [options setPlayerOptionIntValue:0 forKey:@"max_cached_duration"];
// [options setPlayerOptionIntValue:0 forKey:@"infbuf"];
// [options setPlayerOptionIntValue:1 forKey:@"packet-buffering"];
_player = [[IJKFFMoviePlayerController alloc] initWithContentURL:self.url withOptions:options];
集成DEMO链接