ios 怎么配置编译ffmpeg

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ios 怎么配置编译ffmpeg相关的知识,希望对你有一定的参考价值。

ios上编译ffmpeg需要先下载两个程序:iFrameExractor和ffmpeg
编译步骤:
1、在终端下: cd /iFrameExtractor/ffmpeg 建议开始就执行 sudo -s (获取权限命令)
2、在终端下输入 ./configure --prefix=/iFrameExtractor/ffmpeg --libdir=iFrameExtractor/ffmpeg/lib --enable-gpl --enable-static --disable-shared --enable-swscale --enable-zlib --enable-bzlib --disable-ffmpeg --disable-ffplay --disable-ffserver --enable-pthreads
3、执行make 这里会有一堆的编译情况。
注:最好先升级Command Line Tools,避免编译错误

4、执行make install。 (执行完后 到iFrameExtractor/ffmpeg/lib文件上去看看)
出现 libavcodec libavdevice libavformat libavutil libswscale5个.a文件
5、用xcode 打开iFrameExractor工程,确认Header Search Paths里有:"$(SRCROOT)/ffmpeg"路径。 $(SRCROOT)表示工程路径。同时可以看到iFrameExractor工程下ffmpeg文件下的.a文件都不是红色的了。

6、真机上编译(模拟器上i386,真机上是arm的,真机还分arm6 和arm7 )
以下是针对arm7的

/configure --disable-doc --disable-ffmpeg --disable-ffplay --disable-ffserver --enable-cross-compile --arch=arm --target-os=darwin --cc=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc --as='gas-preprocessor/gas-preprocessor.pl /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc' -- sysroot=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk --cpu=cortex-a8 --extra-cflags='-arch armv7' --extra-ldflags='-arch armv7 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk' --enable-pic
7、执行 make 和make install 就有上面的几个.a文件,至此编译结束。
参考技术A   ffmpeg是一个多平台多媒体处理工具,处理视频和音频的功能非常强大。目前在网上搜到的iOS上使用FFMPEG的资料都比较陈旧,而FFMPEG更新迭代比较快; 且网上的讲解不够详细,对于初次接触FFMPEG的新手(例如我)来说确实不太好使用。为了防止忘记,这里对iOS下使用FFMPEG做一个总结。

  1. FFMPEG层次结构的简单理解
  要使用FFMPEG,首先需要理解FFMPEG的代码结构。根据志哥的提示,ffmpeg的代码是包括两部分的,一部分是library,一部分是tool。api都是在library里面,如果直接调api来操作视频的话,就需要写c或者c++了。另一部分是tool,使用的是命令行,则不需要自己去编码来实现视频操作的流程。实际上tool只不过把命令行转换为api的操作而已。

  2. 预热-在mac os下使用ffmpeg
  在mac os下使用ffmpeg比较简单,可以直接使用命令行来操作。首先安装ffmpeg,这里默认系统已经安装好brew,只需要在终端上输入:
  brew install ffmpeg
  等待安装结束即可。
  安装结束后,尝试以下命令:
  ffmpeg -i input.mp4 output.avi
  如果能顺利转换,表明安装成功

  3. 编译能在iOS下使用的FFMPEG library库
  这一步是编译1所说的library,编译好之后可以调用FFMPEG的api。网上有一些方法,但都要自己手动编译,稍显复杂而且比较陈旧。按照app store的需求,编译出来的包还必须支持arm64。我在万能的github中找到一个能够"一键编译"的脚本,地址如下:
  https://github.com/kewlbear/FFmpeg-iOS-build-script
  而且写这个脚本的歪果仁挺好人,更新很及时,已经更新到了最新的2.5.3版本。下载下来,只有一个build-ffmpeg.sh脚本文件。在终端中转至脚本的目录,执行命令:
  ./build-ffmpeg.sh
  脚本则会自动从github中把ffmpeg源码下到本地并开始编译。
  编译结束后,文件目录如下:

  其中,ffmpeg-2.5.3是源码,FFmpeg-iOS是编译出来的库,里面有我们需要的.a静态库,一共有7个。
  执行命令:
  lipo -info libavcodec.a
  查看.a包支持的架构,这几个包都支持了armv7 armv7s i386 x86_64 arm64这几个架构,这个脚本果真是业界良心啊~~~

  4.在xcode中引入FFMPEG library库
  新建工程,把上面编译好的FFmpeg-iOS拖到xcode工程中,添加一个头文件引用
  
  #include "avformat.h"
  添加一个api语句:

  av_register_all();
  添加一个空的类,把执行文件.m后缀改为.mm,开启混编模式。
  添加相应的framework,包括avfoundation和coremedia。
  运行工程,如果没有报错,则表明编译成功。

  5.在xcode项目中使用命令行
  执行到第4步,已经可以使用library库了。但是如果要对视频进行操作,还是需要手动写很多代码去调用api,工作量较大,自然不如直接写命令行方便。为了命令行能够在xcode工程中使用,还需要做以下工作:
  (1)添加源码中的tools,具体文件包括:
  

  (2)添加Header Search Paths
  在target--build setting中搜索Header Search Paths,并在Header Search Paths下面添加源码ffmpeg-2.5.3和scratch的路径。
  (3)修改ffmpeg.h和ffmpeg.c源码

  如果此时run这个工程,则会报错,原因是工程里面有2个main函数,此时处理方法为:
  在ffmpeg.h中添加一个函数声明:
  int ffmpeg_main(int argc, char **argv);
  在ffmpeg.c中找到main函数,把main函数改为ffmpeg_main。
  (4)调用命令行范例
  添加头文件:#import "ffmpeg.h"
  调用命令行
  int numberOfArgs = 16;
  char** arguments = calloc(numberOfArgs, sizeof(char*));
  
  arguments[0] = "ffmpeg";
  arguments[1] = "-i";
  arguments[2] = inputPath;
  arguments[3] = "-ss";
  arguments[4] = "0";
  arguments[5] = "-t";
  arguments[6] = durationChar;
  arguments[7] = "-vcodec";
  arguments[8] = "copy";
  arguments[9] = "-acodec";
  arguments[10] = "aac";
  arguments[11] = "-strict";
  arguments[12] = "-2";
  arguments[13] = "-b:a";
  arguments[14] = "32k";
  arguments[15] = outputPath;
  
  int result = ffmpeg_main(numberOfArgs, arguments);
  其中inputpath和outputpath是文件路径。经测试,这两个路径不支持asset-library://协议和file:// 协议,所以如果是要用相册的文件,我目前的解决办法是把它拷贝到沙盒里面。

  6. 改关闭进程为关闭线程
  如果顺利进行到了第5步,在app中是能够用命令行处理视频了,但会出现一个问题,app会退出。经肖大神提醒,发现了命令行执行完毕之后会退出进程。而iOS下只能启动一个进程,因此必须改关闭进程为关闭线程,或者直接把关闭进程的方法给注掉。

  在ffmpeg.c中可以看到,执行退出进程的方法是exit_program,定位到了cmdutils.c中执行了c语言的exit方法。这里我将它改为了pthread_exit(需要添加#include 头文件)。在xcode项目中使用时,则可以用NSThread来新开一个线程,执行完毕之后,把线程关闭了即可。再使用NSThreadWillExitNotification通知,即可监听线程退出的情况。

  7. 修复ffmpeg.c里面的一个bug
  在实际项目中,可能需要多次调用命令行,但在多次调用命令行的过程中,发现ffmpeg.c的代码中会访问空属性导致程序崩溃。逐步debug后发现,很多指针已经置空了,但它们的计数却没有置零,不知道是不是ffmpeg.c的一个bug。修复方法如下:在ffmpeg_cleanup方法下,将各个计数器置零,包括:
  nb_filtergraphs
  nb_output_files
  nb_output_streams
  nb_input_files
  nb_input_streams
  置零之后,重复使用ffmpeg_main方法一切正常。本回答被提问者和网友采纳
参考技术B 1、ios系统更新,首先是下载系统更新文件,然后就是把升级系统安装到设备上面;下载升级文件可以在苹果设备上面直接下载,然后进入到更新程序里面点击在线联网更新,还可以是在电脑端下载更新程序文件,然后使用电脑更新升级。更新系统程序存在风险,所以更新系统要慎重。
2、尤其是在设备端直接更新升级出现的问题率是很高的。在设备端直接更新,打开设置——通用——软件更新,系统在更新的时候,设备的可用内存空间一定要到达系统最低的要求,否则无法进行只更新。
3、使用电脑更新系统的优势在于安全稳定快速,出现的问题率比较低。在电脑端安装iTunes软件程序,然后使用数据线连接手机跟电脑,系统在同步扫描手机信息的时候,就会自动提示更新手机系统,然后点击更新下载,下载完之后就可以开始同步更新到设备上面,来完成设备系统的升级。
4、更新系统升级之前最好把重要的文件备份一下然后在升级,然后还可以同步恢复到设备上面来。
参考技术C MAC OS X Mountain Lion 10.8.3、 XCode 5.1
二、编译FFMpeg
1、下载ffmpeg2.2.5版本代码,并解压。
2、下载并解压gas-preprocessor.pl (附件中有,zip格式,因网易博客不能上传zip后缀的文件,故加了个.rar)
在终端中使用cp命令将它复制到 /usr/sbin/目录,并赋予可执行权限。
sudo cp -f gas-preprocessor/gas-preprocessor.pl /usr/sbin/chmod +x /usr/sbin/gas-preprocessor.pl

3、在ffmpeg目录下创建一个config.sh脚本
#!/bin/bash
SDKVERSION="7.1"

ARCHS="armv7 armv7s i386"

DEVELOPER=`xcode-select -print-path`

cd "`dirname \"$0\"`"
REPOROOT=$(pwd)

# where we will store intermediary builds
INTERDIR="$REPOROOT/built"
mkdir -p $INTERDIR

########################################
# Exit the script if an error happens

for ARCH in $ARCHS
do
if [ "$ARCH" == "i386" ];
then
PLATFORM="iPhoneSimulator"
EXTRA_CONFIG="--arch=i386 --disable-asm --enable-cross-compile --target-os=darwin --cpu=i386"
EXTRA_CFLAGS="-arch i386"
EXTRA_LDFLAGS="-I$DEVELOPER/Platforms/$PLATFORM.platform/Developer/SDKs/$PLATFORM$SDKVERSION.sdk/usr/lib"
else
PLATFORM="iPhoneOS"
EXTRA_CONFIG="--arch=arm --target-os=darwin --enable-cross-compile --cpu=cortex-a9 --disable-armv5te"
EXTRA_CFLAGS="-w -arch $ARCH"
fi

mkdir -p "$INTERDIR/$ARCH"

./configure --prefix="$INTERDIR/$ARCH" \
--disable-neon \
--disable-armv6 \
--disable-armv6t2 \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-iconv \
--disable-bzlib \
--enable-avresample \
--sysroot="$DEVELOPER/Platforms/$PLATFORM.platform/Developer/SDKs/$PLATFORM$SDKVERSION.sdk" \
--cc="$DEVELOPER/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" \
--as='/usr/local/bin/gas-preprocessor.pl' \
--extra-cflags="$EXTRA_CFLAGS -miphoneos-version-min=$SDKVERSION" \
--extra-ldflags="-arch $ARCH $EXTRA_LDFLAGS -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/$PLATFORM.platform/Developer/SDKs/$PLATFORM$SDKVERSION.sdk -miphoneos-version-min=$SDKVERSION" $EXTRA_CONFIG \
--enable-pic \
--extra-cxxflags="$CPPFLAGS -isysroot $DEVELOPER/Platforms/$PLATFORM.platform/Developer/SDKs/$PLATFORM$SDKVERSION.sdk"

make && make install && make clean

done

mkdir -p "$INTERDIR/universal/lib"

cd "$INTERDIR/armv7/lib"
for file in *.a
do

cd $INTERDIR
xcrun -sdk iphoneos lipo -output universal/lib/$file -create -arch armv7 armv7/lib/$file -arch armv7s armv7s/lib/$file -arch i386 i386/lib/$file
echo "Universal $file created."

done
cp -r $INTERDIR/armv7/include $INTERDIR/universal/

FFmpeg之Linux下编译与调试

参考技术A

下面的一切都是在 root 模式下进行的,可以不再 root 模式下进行

基础环境就是编译代码的基础库,Ubuntu联网安装软件很简单,一个语句即可搞定,这里列出语句如下:

依赖库分两方面,参考以下网站列出的依赖库信息,本文选择的版本均参考于此网页: FFmpeg依赖库信息

首先创建 FFmpeg 代码目录,所有的源代码放在这个目录下

FFmpeg 编译之后,即可使用。编译生成的可执行程序在 ~/bin 目录下

注:上面的 ./configure 配置编译后并不能进行调试,需要如下配置.

刚才的工程可以运行,但不能debug。解决此问题,首先认定一点,生成的可执行程序中,ffmpeg 不包含调试信息,调试信息在 ffmpeg_g 中,debug 要选择 ffmpeg_g。

另外,./config选项也是确定包含调试信息的核心,需要在config中添加:

采用以下命令重新config:

一些注意事项; 在使用 ffplay 播放生成 h264 格式的视频时,播放速度会加快,解决方式:不要使用 FFmpeg 转码生成纯 h264 格式的视频,要使用一种容器包含 h264 视频,即生成一种音视频流格式,也就是不要生成纯粹的 h264 码流,而是生成诸如 mkv 等格式的文件。

以上是关于ios 怎么配置编译ffmpeg的主要内容,如果未能解决你的问题,请参考以下文章

FFmpeg编译找不到库文件

FFmpegffmpeg 命令查询一 ( 版本 | 编译配置 | 复用格式 | 编解码器 )

FFmpegffmpeg 命令查询一 ( 版本 | 编译配置 | 复用格式 | 编解码器 )

[环境配置][转载]ubuntu上源码编译ffmpeg

FFmpeg之Linux下编译与调试

FFMPEG系列一:Mac下FFMPEG编译安装配置及使用例子