FFmpeg for iOS 编译与集成
1.下载编译脚本
2.运行编译脚本
打开终端,进入文件目录,运行命令行./build-ffmpeg.sh
编译过程中可能会遇到的错误:
1、报错yasm
没有安装,按提示操作安装
2、报错"xcrun -sdk iphoneos clang is unable to create an executable file."
,运行命令行sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer/
后重新编译
3、报错"src/libavutil/arm/asm.S:50:9: error: unknown directive .arch armv7-a"
,将编译脚本build-ffmpeg.sh
中ARCHS="arm64 armv7 x86_64 i386"
的armv7去掉后重新编译
4、报错".../FFmpeg-iOS-build-script-master-2/ffmpeg-xxx/configure: No such file or directory"
,打开http://www.ffmpeg.org/releases
,将相应版本的源码下载解压后拷贝到/FFmpeg-iOS-build-script-master
文件夹下,重新编译
5、报错"GNU assembler not found, install/update gas-preprocessor"
,打开https://github.com/mansr/gas-preprocessor
,下载安装最新的gas-preprocessor
脚本后,重新编译
编译会花费一段时间,如果终端没有报错并显示如下,说明编译成功,其中,FFmpeg-iOS即是我们需要用到的framework。
3.集成FFmpeg-iOS
将整个FFmpeg-iOS文件夹拖入工程中,并引入相关的头文件,例如:
#import "libavcodec/avcodec.h"
,如果报错'libavcodec/avcodec.h' file not found
解决方法如下:
在工程的Build Settings
中搜索search
,找到Header Search Paths
与Library Search Paths
,将Library Search Paths
中的ffmpeg的lib路径$(PROJECT_DIR)/FFmpegTest/FFmpeg-iOS/lib
复制粘贴到Library Search Paths
中,并将lib改为include
添加头文件的声明
如果还出现了链接报错clang: error: linker command failed with exit code 1 (use -v to see invocation)
,可能是因为缺少系统库,需要#import <VideoToolbox/VideoToolbox.h>
,并且需要在工程Build Phases
中的Link Binary With Libraries
中Add items:libz.1.2.5.tbd、libbz2.1.0.tbd、libiconv.2.4.0.tbd
,成功编译。
获取H264数据
H.264和H.265
H264压缩技术主要采用了以下几种方法对视频数据进行压缩。包括:
- 帧内预测压缩,解决的是空域数据冗余问题。
- 帧间预测压缩(运动估计与补偿),解决的是时域数据冗徐问题。
- 整数离散余弦变换(DCT),将空间上的相关性变为频域上无关的数据然后进行量化。
- CABAC压缩。
经过压缩后的帧分为:I帧,P帧和B帧:
- I帧:关键帧,采用帧内压缩技术。
- P帧:向前参考帧,在压缩时,只参考前面已经处理的帧。采用帧间压缩技术。
- B帧:双向参考帧,在压缩时,它即参考前而的帧,又参考它后面的帧。采用帧间压缩技术。
除了I/P/B帧外,还有图像序列GOP。
GOP:两个I帧之间是一个图像序列,在一个图像序列中只有一个I帧。如下图所示:
YUV
YUV不能直接在opengles中显示,需要转化为RGB