使用 Carthage 安装 R.swift

作者:新葡京简介

由于工程中不想引入 CocoapodsR.swift 官方又没有提供 Carthage 的集成方法,因此按照 R.swift 中提供的 Manually ,记录下以下集成过程。

  1. 下载 h264 源码和对应的编译脚本;
  2. 将解压后的 h264 源码文件夹改名成 x264 放到解压后的编译脚本 x264-ios-master 文件夹中(编译脚本内设置的源码文件夹名为 x264);
  3. 编译脚本内执行 ./build-x264.sh 命令;

字数486 阅读288 评论7 喜欢5

创建工程

图片 1

创建工程

  1. 使用 Carthage 集成 R.swift.Library ,Carthage 的安装与使用看这里1.1、 将 github "mac-cain13/R.swift.Library 添加到 Cartfile

    图片 21.2、 �终端运行 carthage update图片 31.3、 �打开目标工程,并按下图添加目标库和运行脚本:图片 4图片 5

  2. 集成 R.swift2.1、下载并解压 R.swift

    图片 6图片 72.2、将上面解压得到的 rswift 文件拖到工程目录下,在此工程中,rswift 的路径为 "$SRCROOT/${PROJECT_NAME}/rswift"(集成的时候应该根据实际的路径进行相应的修改)图片 8图片 92.3、添加新的运行脚本 Run Script,与如下图所示将其拖到 Compile Sources 的上边,并输入以下内容:"$SRCROOT/${PROJECT_NAME}/rswift" "$SRCROOT"图片 10

  3. 获取并集成生成的文件3.1、编译目标工程,即可在工程根目录下看到生成的 R.generated.swift 文件

    图片 113.2、将生成的 R.generated.swift 文件以引用的形式拖到工程中去图片 123.3、为防团队在协作的时候资源文件发生冲突,将 *.generated.swift 添加到 .gitignore 文件中去。

集成

  1. 下载FFmpeg For iOS编译脚本;
  2. 打开 terminal 执行sh build-ffmpeg.sh
  3. 步骤2执行完成后运行sh build-ffmpeg.sh lipo.a文件合并成一个;
  4. 步骤3执行完成将FFmpeg-iOS文件夹拖到目标工程并添加libz.dyliblibbz2.dyliblibiconv.dylib三个库,xcode7 及以上则是添加libz.tbdlibbz2.tbdlibiconv.tbd,并添加框架VideoToolbox.framework(此框架是 iOS8 新增的,用于硬解码)
    图片 13
![](http://upload-images.jianshu.io/upload_images/808722-61bef0e3ffeb3dd7?imageMogr2/auto-orient/strip|imageView2/2/w/1240)
  1. 设置头文件路径$(PROJECT_DIR)/$(PRODUCT_NAME)/FFmpeg-iOS/include
    图片 14

  2. OC 工程在调用的时候直接#include "avformat.h"

  3. swift 工程创建桥接头文件,在头文件内添加#include "avformat.h"
    图片 15

添加源代码

  1. 添加OC源文件
    在 swift 制作 framework 添加 OC文件时,不能设置桥接文件,而是将 OC头文件放到框架的头文件中,如下图:
同时将该OC头文件设置为 public(默认添加到Private,可拖动到Public):
  1. 添加框架源代码
  1. 下载FFmpeg For iOS编译脚本;
  2. 打开 terminal 执行sh build-ffmpeg.sh
  3. 步骤2执行完成后运行sh build-ffmpeg.sh lipo.a文件合并成一个;
  4. 步骤3执行完成将FFmpeg-iOS文件夹拖到目标工程并添加libz.dyliblibbz2.dyliblibiconv.dylib三个库,xcode7 及以上则是添加libz.tbdlibbz2.tbdlibiconv.tbd,并添加框架VideoToolbox.framework(此框架是 iOS8 新增的,用于硬解码)图片 16图片 17
  5. 设置头文件路径$(PROJECT_DIR)/$(PRODUCT_NAME)/FFmpeg-iOS/include图片 18
  6. OC 工程在调用的时候直接#include "avformat.h"
  7. swift 工程创建桥接头文件,在头文件内添加#import "avformat.h"图片 19

使用

通过以上我们得到一个集成了FFmpeg的工程,接下来进行测试。为了方便,我们使用github上一个基于FFmpeg的框架 kxmovie。

添加脚本

添加生成模拟器与真机都可使用的 framework 的运行脚本。

  1. 给框架工程添加Target:File/New/Target
![](http://image.xiaomantou.net/FmotWoB3NZkGWER0du76zdbav66t)
脚本内容


脚本内容如下(脚本内容是从网上搜索到的,但在工程中一直出现问题,无法用于模拟器,后来发现是缺少了`cp -R "${SIMULATOR_DIR}/" "${INSTALL_DIR}/"`):
# Sets the target folders and the final framework product.
# 如果工程名称和Framework的Target名称不一样的话,要自定义FMKNAME
# 例如: FMK_NAME = "MyFramework"
FMK_NAME=${PROJECT_NAME}
# Install dir will be the final output to the framework.
# The following line create it in the root folder of the current project.
INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework
# Working dir will be deleted after the framework creation.
WRK_DIR=build
DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework
SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework
# -configuration ${CONFIGURATION}
# Clean and Building both architectures.
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build
# Cleaning the oldest.
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
cp -R "${SIMULATOR_DIR}/" "${INSTALL_DIR}/"
# Uses the Lipo Tool to merge both binary files (i386   armv6/armv7) into one Universal final product.
lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"
rm -r "${WRK_DIR}"
open "${INSTALL_DIR}"
  1. 编译脚本:Product/Build For/Profiling
编译完脚本会自动弹出生成的framework的文件夹。

通过以上我们得到一个集成了FFmpeg的工程,接下来进行测试。为了方便,我们使用github上一个基于FFmpeg的框架 kxmovie。

kxmovie编译
  1. 终端运行:git clone https://github.com/kolyvan/kxmovie
  2. cd kxmovie
  3. git submodule update --init
  4. rake
  5. kxmovie目录下的kxmovie文件夹拖到工程中
    图片 20
![](http://upload-images.jianshu.io/upload_images/808722-b58708cc6e776405?imageMogr2/auto-orient/strip|imageView2/2/w/1240)
  1. 在桥接文件里添加要使用到的目标文件,如#include "KxMovieViewController.h"
    图片 21

添加framework到工程

  1. 将目标 framework 和其所用到的资源文件拖到目标工程中
  1. 添加目标框架到复制文件中去
kxmovie编译
  1. 终端运行:git clone https://github.com/kolyvan/kxmovie
  2. cd kxmovie
  3. git submodule update --init
  4. rake
  5. kxmovie目录下的kxmovie文件夹拖到工程中图片 22图片 23
  6. 在桥接文件里添加要使用到的目标文件,如#include "KxMovieViewController.h"图片 24
代码

vitamio 这里有一些视频链接供测试用。

  1. 按下按钮弹出视频窗口

    @IBAction func playVedio(sender: AnyObject) {
    
         let paths = ["http://live.3gv.ifeng.com/zixun.m3u8",
                      "http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8"]
    
         guard let vedioVc = KxMovieViewController.movieViewControllerWithContentPath(paths[1], parameters: nil) as? UIViewController else {
             print("err")
             return;
         }
    
         self.presentViewController(vedioVc, animated: true, completion: nil);
     }
    

�打包提交到 App Store

在使用自制的 Framework 的应用程序打包提交到 App Store 的时候,可能会遇到以下问题“Unsupported architectures. Your executable contains unsupported architectures '[x86_64, i386]'”,此时在你要打包提交的目标程序Build Phases下添加Run Script,并将以下内容复制进去:

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 '*.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

到此就结束了

代码

vitamio 这里有一些视频链接供测试用。

  1. 按下按钮弹出视频窗口
@IBAction func playVedio(sender: AnyObject) { let paths = ["http://live.3gv.ifeng.com/zixun.m3u8", "http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8"] guard let vedioVc = KxMovieViewController.movieViewControllerWithContentPath(paths[1], parameters: nil) as? UIViewController else { print return; } self.presentViewController(vedioVc, animated: true, completion: nil); }
转至:

参考

  1. Creating your first iOS Framework
题外话

有些人应该听过或用过Libav,从网上搜索到的资料: 原来FFmpeg的一群开发者不满FFmpeg的项目管理方式,所以fork了新的一个项目,叫LibavFFmpeg更侧重底层的效率。(由于开发者大多是设备厂家的人希望自己的设备尽快的run起来,于是更偏向底层些),Libav更侧重软件构架。(也是此原因分裂的,不满对软件框架的混乱,为了更好的代码结构,分裂出来)

题外话

    有些人应该听过或用过Libav,从网上搜索到的资料:
    原来FFmpeg的一群开发者不满FFmpeg的项目管理方式,所以fork了新的一个项目,叫LibavFFmpeg更侧重底层的效率。(由于开发者大多是设备厂家的人希望自己的设备尽快的run起来,于是更偏向底层些),Libav更侧重软件构架。(也是此原因分裂的,不满对软件框架的混乱,为了更好的代码结构,分裂出来)

本文由新葡京8455发布,转载请注明来源

关键词: