iOS基于FFmpeg之配置FFmpeg框架(二)

本文出自:这里

摘自http://blog.sina.com.cn/s/blog_47522f7f0102vbwp.html,按步骤实践可行。感谢!

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源码下到本地并开始编译。

编译结束后,文件目录如下:

【iOS开发】iOS下使用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,具体文件包括:

【iOS开发】iOS下使用FFMPEG的一些总结

(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方法一切正常。

时间: 2024-08-26 16:08:39

iOS基于FFmpeg之配置FFmpeg框架(二)的相关文章

iOS基于B站的IJKPlayer框架的流媒体探究

学习交流及技术讨论可新浪微博关注:极客James 一.流媒体 流媒体技术从传输形式上可以分为:渐进式下载和实施流媒体. 1.渐进式下载 它是介于实时播放和本地播放之间的一种播放方式,渐进式下载不必等到全部下载完成后在播放,可以边下载边播放,播放完成后,整个文件会保存下来.从用户的体验上合播放方的效果来看,渐进式下载和实时流媒体没有什么区别,不过是渐进式下载保留有文件在本地.下面来介绍下渐进式下载的开发 渐进式下载的API和本地播放的API没有什么太大的区别,可以使用MediaPlayer框架中得

iOS基于ffmpeg做出的视频直播 (一)

现在非常流行直播,相信很多人都跟我一样十分好奇这个技术是如何实现的,正好最近在做一个ffmpeg的项目,发现这个工具很容易就可以做直播,下面来给大家分享下技术要点: 首先你得编译出ffmpeg运行所需的静态库,这个百度一下有很多内容,这里我就不多说了,建议可以用Github上的一个开源脚本来编译,简单粗暴有效率. 地址:GitHub - kewlbear/FFmpeg-iOS-build-script: Shell scripts to build FFmpeg for iOS and tvOS

iOS 利用FFmpeg 开发音视频流(二)

原文地址: iOS配置FFmpeg框架(原创) 脚本文件下载地址 https://github.com/kewlbear/FFmpeg-iOS-build-script. 上述博文中是直接下载脚本文件,运行脚本文件后会在本地下载FFmpeg源码并进行编译.

Visual Studio 开发(二):VS 2017配置FFmpeg开发环境

在上篇文章Visual Studio 开发(一):安装配置Visual Studio Code 中,我们讲了一下如何配置VS CODE,来编写和调试C的代码.如果你已经使用VS Code回顾和复习好C相关的知识了,并且有想深入学习FFmpeg的方法,那么可以看看这篇文章,相信对你会很有帮助. 一.下载安装Visual Studio 下载地址为:https://visualstudio.microsoft.com/zh-hans/downloads/ 然后进行安装,安装时选择C/C++开发的选项进

又是正版!Win下ffmpeg源码调试分析二(Step into ffmpeg from Opencv for bugs in debug mode with MSVC)

最近工作忙一直没时间写,但是看看网络上这方面的资源确实少,很多都是linux的(我更爱unix,哈哈),而且很多是直接引入上一篇文章的编译结果来做的.对于使用opencv但是又老是被ffmpeg库坑害的朋友们,可能又爱又恨,毕竟用它处理和分析视频是第一选择,不仅是因为俩者配合使用方便,而且ffmpeg几乎囊括了我所知道的所有解编码器,但是正是因为这个导致了一些bug很难定位,所以有必要考虑一下如何快速定位你的ffmpeg bug. sorry,废话多了.首先给个思路: 1.使opencv 的hi

基于最简单的FFmpeg采样读取内存读写:存储转

===================================================== 基于最简单的FFmpeg样品系列读写内存列表: 最简单的基于FFmpeg的内存读写的样例:内存播放器 最简单的基于FFmpeg的内存读写的样例:内存转码器 ===================================================== 上篇文章记录了一个基于FFmpeg的内存播放器,能够使用FFmpeg读取并播放内存中的数据. 这篇文章记录一个基于FFmpeg的

基于最简单的FFmpeg采样读取内存读写:内存玩家

===================================================== 基于最简单的FFmpeg样品系列读写内存列表: 最简单的基于FFmpeg的内存读写的样例:内存播放器 最简单的基于FFmpeg的内存读写的样例:内存转码器 ===================================================== 打算记录两个最简单的FFmpeg进行内存读写的样例. 之前的全部有关FFmpeg的样例都是对文件进行操作的.比如<100行代码实

基于最简单的FFmpeg包封过程:视频和音频分配器启动(demuxer-simple)

===================================================== 基于最简单的FFmpeg封装工艺的系列文章上市: 最简单的基于FFmpeg的封装格式处理:视音频分离器简化版(demuxer-simple) 最简单的基于FFmpeg的封装格式处理:视音频分离器(demuxer) 最简单的基于FFmpeg的封装格式处理:视音频复用器(muxer) 最简单的基于FFMPEG的封装格式处理:封装格式转换(remuxer) ===================

IOS基于XMPP协议开发--XMPPFramewok框架(一):基础知识

最近蘑菇街团队的TT的开源,使我对im产生了兴趣,然后在网上找到了XMPPFramework进行学习研究, 并写了以下系列教程供大家参考,有写的不对的地方,请大家多多包涵指正. 目录索引 IOS基于XMPP协议开发--XMPPFramewok框架(一):基础知识 IOS基于XMPP协议开发--XMPPFramewok框架(二):服务器连接 IOS基于XMPP协议开发--XMPPFramewok框架(三):用户注册 IOS基于XMPP协议开发--XMPPFramewok框架(四):用户认证 IOS