随笔

iOS下使用FFMPEG的一些总结

ffmpeg是一个多平台多媒体处理工具, 处理视频和音频的功能非常强大。目前在 网上搜到的iOS上使用FFMPEG的资料都 比较旧,而FFMPEG更新迭代比较快; 且网上的讲解不够详细.以下是对FFMPEG 的一些简单介绍和理解:

1.FFMPEG层次结构的简单理解
要使用FFMPEG,首先需要理解FFMPEG 的代码结构。根据志哥的提示, mpeg 的代码是包括两部分的,一部分是librar y,一部分是tool。api都是在library里 面,如果直接调api来操作视频的话,就 需要写c或者c++了。另一部分是tool, 使用的是命令行,则不需要自己去编码来 实现视频操作的流程。实际上tool只不过 把命令行转换为api的操作而已。
2. 预热-在mac os下使用 ffmpeg
在mac os下使用 ffmpeg比较简单,可以 直接使用命令行来操作。首先安装 ffmpeg,这里默认系统已经安装好brew,只需 要在终端上输入:
brew install ffmpeg
等待安装结束即可。
安装结束后,尝试以下命令: mpeg -i input.mp4 output.avi
如果能顺利转换,表明安装成功
3. 编译能在iOS下使用的FFMPEG library库
这一步是编译1所说的library,编译好之 后可以调用FFMPEG的api。网上有一些 方法,但都要自己手动编译,稍显复杂而 且比较陈旧。按照app store的需求,编译出来的包还必须支持arm64。我在万能 的github中找到一个能够”一键编译”的脚 本,地址如下:
https://github.com/kewlbear/FFm peg-iOS-build-script
而且写这个脚本的歪果仁挺好人,更新很及时,下载下来,只有一个build- mpeg.sh 脚本文件。在终端中转至脚本的目录,执 行命令:
./build- mpeg.sh
脚本则会自动从github中把 mpeg源码 下到本地并开始编译。
编译结束后,文件目录如下:
其中, mpeg-2.5.3是源码,FFmpeg -iOS是编译出来的库,里面有我们需要 的.a静态库,一共有7个。
执行命令:
lipo -info libavcodec.a
查看.a包支持的架构,这几个包都支持了 armv7 armv7s i386 x86_64 arm64 这几个架构,这个脚本果真是业界良心啊 ~~~
4.在xcode中引入FFMPEG library库
新建工程,把上面编译好的FFmpeg-iO S拖到xcode工程中,添加一个头文件引 用
include “avformat.h”
添加一个api语句:
av_register_all();
添加一个空的类,把执行文件.m后缀改为 .mm,开启混编模式。
添加相应的framework,包括avfound ation和coremedia。
运行工程,如果没有报错,则表明编译成
功。
5.在xcode项目中使用命令行
执行到第4步,已经可以使用library库了 。但是如果要对视频进行操作,还是需要 手动写很多代码去调用api,工作量较大 ,自然不如直接写命令行方便。为了命令 行能够在xcode工程中使用,还需要做以 下工作:
(1)添加源码中的tools
(2)添加Header Search Paths
在target–build setting中搜索Heade r Search Paths,并在Header Search Paths下面添加源码 mpeg-2.5.3和scr atch的路径。
(3)修改 mpeg.h和 mpeg.c源码
如果此时run这个工程,则会报错,原因 是工程里面有2个main函数,此时处理方 法为:
在 mpeg.h中添加一个函数声明:
int mpeg_main(int argc, char **argv);
在 mpeg.c中找到main函数,把main函数改为 mpeg_main。 (4)调用命令行范例
添加头文件:#import ” mpeg.h” 调用命令行
int numberOfArgs = 16;
char** arguments = calloc(numb erOfArgs, sizeof(char*));
arguments[0] = ” mpeg”;
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 = mpeg_main(numbe rOfArgs, arguments);
其中inputpath和outputpath是文件路 径。经测试,这两个路径不支持asset-li brary://协议和file:// 协议,所以如果 是要用相册的文件,我目前的解决办法是 把它拷贝到沙盒里面。
6.改关闭进程为关闭线程
如果顺利进行到了第5步,在app中是能 够用命令行处理视频了,但会出现一个问 题,app会退出。经肖大神提醒,发现了 命令行执行完毕之后会退出进程。而iOS 下只能启动一个进程,因此必须改关闭进 程为关闭线程,或者直接把关闭进程的方 法给注掉。
在 mpeg.c中可以看到,执行退出进程 的方法是exit_program,定位到了cmd utils.c中执行了c语言的exit方法。这里 我将它改为了pthread_exit(需要添加# include 头文件)。在xcode项目中使用 时,则可以用NSThread来新开一个线程 ,执行完毕之后,把线程关闭了即可。再 使用NSThreadWillExitNotification通 知,即可监听线程退出的情况。
7.修复 mpeg.c里面的一个bug
在实际项目中,可能需要多次调用命令行 ,但在多次调用命令行的过程中,发现 mpeg.c的代码中会访问空属性导致程序 崩溃。逐步debug后发现,很多指针已经 置空了,但它们的计数却没有置零,不知 道是不是 mpeg.c的一个bug。修复方
法如下:在 mpeg_cleanup方法下,将 各个计数器置零,包括:
nb_filtergraphs
nb_output_files
nb_output_streams
nb_input_files
nb_input_streams
置零之后,重复使用 mpeg_main方法 一切正常。
以上是近期研究 mpeg的一些小结,目 前对于 mpeg还是处于刚认识阶段,对 于其api的使用、命令行的具体参数等,
都还需要继续研究和学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值