美文网首页程序员
ijkplayer集成问题

ijkplayer集成问题

作者: 大象会唱歌 | 来源:发表于2020-10-07 14:50 被阅读0次

    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集成问题

        本文链接:https://www.haomeiwen.com/subject/qjpfpktx.html