ijkplayer集成问题

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链接

你可能感兴趣的:(ijkplayer集成问题)