Skip to content
tiger edited this page Feb 11, 2018 · 32 revisions

如何使用动态库?

1. 编译动态库

当前库中未包含动态库,需要自行编译输出

  • clone KSYLive_iOS.git
  • 进入releaseFramework目录
  • 执行release-libKSYLive.sh脚本
  • framework/dynamic目录下查找libksygpulive.framework

示例调用脚本如下

git clone https://github.com/ksvc/KSYLive_iOS.git KSYLive_iOS --depth 1
cd KSYLive_iOS/releaseFramework
./release-libKSYLive.sh libksygpulive lite dy
ls ../framework/dynamic

将出现libksygpulive.framework

2. 动态库配置

使用动态库时,需要将libksygpulive.framework和GPUImage.framework添加至Embed Frameworks选项中, 具体配置如下图所示 dylib_config.png 如果未进行以上配置,运行时将会出现如下错误

dyld: Library not loaded: @rpath/...
  Referenced from: ...
  Reason: image not found

3. framework说明

直播SDK位于framework目录下,ipa size是支持bitcode时的demo size,包含GPUImage和Bugly等第三方库。

名称 库名称 库size ipa size iOS要求
直播SDK静态库 libksygpulive.framework 95M 5.7M 7.0及以上
直播SDK动态库 libksygpulive.framework 67M 6.9M 8.0及以上

为什么framework这么大?

因为framework包括了armv7/arm64/i386/x86_64 四个体系结构。

3.1 优缺点

  • 静态库体积更小,直播SDK对ipa的影响只有5.7M(含GPUImage和Bugly)
  • 静态库iOS版本要求更低,只需要iOS 7.0。
  • 动态库能解决ffmpeg冲突问题。
  • 静态库对第三方库有更多的依赖库。静态库依赖以下第三方库:
    • GPUImage.framework
    • libstdc++.6.tbd

3.2 动态库提交app store

为了能够顺利提交app至app store, 需要移除动态库中的x86_64和i386平台,具体操作如下:

进入framework/dynamic/libksygpulive.framework目录,执行命令:

  • lipo libksygpulive -remove x86_64 -output libksygpulive
  • lipo libksygpulive -remove i386 -output libksygpulive

执行完成后可使用lipo -info libksygpulive 命令确认当前的动态库已经移除上面两个平台。

如果不执行上述操作,那么在提交app store的时候,可能会出现ITMS-90087, ITMS-90209, ITMS-90125错误。

4. release-libKSYLive.sh使用说明

该脚本位于releaseFramework文件夹下面, 使用它可以自行编译出需要的framework文件; 执行该脚本后,会在项目下生成framework文件夹(与releaseFramework平级);不同的编译类型,生成的framework会位于不同的子文件夹(static/dynamic)中

4.1 用法

./release-libKSYLive.sh name format [dy]

参数说明:

name:framework名称
  KSYMediaPlayer - 只支持播放的framework
  libksygpulive - 集成播放和推流的framework

format:
  lite - 适用于KSYMediaPlayer和libksygpulive,支持主流的音视频格式,不支持265推流
  265 - 只适用于libksygpulive,支持主流的音视频格式,支持265推流
  vod - 只适用于KSYMediaPlayer,支持绝大多数常见的音视频格式

dy:
 可选项,如果不存在该参数,则编译静态的framework;如果存在该参数,则编译动态的framework

4.2 举例

./release-libKSYLive.sh libksygpulive 265 dy

则在项目的framework/dynamic文件夹下生成libksygpulive.framework,它含有推流和播放功能,且支持265推流。

5 iOS 7.0 版本上使用

如果app的Deployment Target是7.0,需要使用动态库时需要把Deployment Target升级到8.0。如果仍然需要维持APP的最低iOS版本7.0,需要做一些额外工作:

  1. 使用Weakly Linked
  2. 使用objc_getClass来找到对应的Class后进行调用

该方案只能发行越狱版本,提交APPStore后将导致iOS 7.x 版本运行crash。

6. Archive时Bitcode报错

v2.9.4及之前的版本,使用动态库打包时,会报bitcode的错误,具体信息如下:

bitcodeError.jpg

相应的解决方案如下:

  1. 进入releaseFramework/libKSYLive目录
  2. 打开libKSYLive.xcodeproj工程
  3. 删除所有target的Build Settings中有关bitcode的配置,如下图所示:

bitcodeConfig.png

  1. 重新配置bitcode,工程的Build Settings中增加自定义配置BITCODE_GENERATION_MODE,Debug时为marker,Release时为bitcode,具体示意图如下:

bitcodeNewCfg.jpg

  1. 配置完成后,回到releaseFramework目录,执行release-libKSYLive.sh脚本,即可在../framework/dynamic下面看到新生成的framework,需要注意的是,脚本生成的framework是含有i386和x86_64两个平台的,需要手动去掉,参考3.2

7. 调试支持平台:arm64、armv7、armi386、armx86_64。发布appStore的支持平台为 armv7, arm64

按照下面步骤

脚本代码

APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"

# This script loops through the frameworks embedded in the application and
# removes unused architectures.
find "$APP_PATH" -name 'KSYMediaPlayer.framework' -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"

EXTRACTED_ARCHS=()

for ARCH in $ARCHS
do
echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
done

echo "Merging extracted architectures: ${ARCHS}"
lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
rm "${EXTRACTED_ARCHS[@]}"

echo "Replacing original executable with thinned version"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"

done

1. 推流环节说明

2. 特色功能说明

2.1 采集

2.2 音频处理

2.3 视频处理

2.4 编码

2.5 推流

2.6 输入多样化

2.7 集成

3. 第三方功能

4. 技术专栏

5. 已知问题

8. FAQ

金山云计算

Clone this wiki locally