由于FFmpeg开源框架的功能非常强大,可以播放的视频种类很多,同时添加第三方库kxmovie,实现视频播放,真的是爽爆了,因此今天来说一下关于FFmpeg在iOS手机上的一些配置过程,配置工具,还有那些巨坑,以及在配置kxmovie过程中的一些坑。

iOS编译FFmpeg

需要工具:

1.gas-preprocessor
2.yasm
3.FFmpeg-iOS-build-script(ps:这个脚本真的是太好了,帮我们省了很多事)
4.kxmovie(ps:这个是第三方播放库)

编译过程:
1.下载gas-preprocessor
gas-preprocessor是我们需要编译的ffmpeg的所需要的脚本文件。

1)下载好的gas-preprocessor解压后文件内容如下:

文件内容

2)将gas-preprocessor.pl文件复制粘贴到 /usr/sbin/ 目录下(按commd+G快捷键,复制此路径) ,若是根本就不能将这个文件复制到这个路径,我们需要换一个路径,/usr/local/bin/ 目录下,然后为文件开启可执行权限,打开终端输入以下命令行。

chmod 777 /usr/sbin/gas-preprocessor.pl

或者

chmod 777 /usr/local/bin/gas-preprocessor.pl
2.下载安装yasm。
yasm是一个完全重写的 NASM 汇编。目前,它支持x86和AMD64指令集,接受NASM和气体汇编语法,产出二进制,ELF32 , ELF64 , COFF , Mach - O的( 32和64 ),RDOFF2 ,的Win32和Win64对象的格式,并生成STABS 调试信息的来源,DWARF 2 ,CodeView 8格式。

1)下载yasm
由于上一篇文章:Mac配置FFmpeg环境已经安装了homebrew,因此我们直接使用终端进行安装。

brew install yasm

出现以下样式:

表明已经安装成功

若是已经安装了会出现下面的情况:

已经安装

2)检测是否安装yasm:

brew search yasm

若是安装成功了,如下样式:

已经存在

否则会出现如下:

没有安装
3.编译FFmpeg-iOS-build-script,得到我们需要的iOS能够用的ffmpeg库
FFmpeg-iOS-build-script这个脚本,可以直接转为iOS编译可用的ffmpeg库,我们不用下载ffmpeg,脚本会帮我们下载最新版本的ffmpeg,并且打包成一个iOS可用的ffmpeg库。

1)下载FFmpeg-iOS-build-script并解压,如下文件夹内容:

文件夹内容

2)编译脚本
执行以下的终端命令(目的是讲编译出来的文件放到文件夹里面):

cd FFmpeg-iOS-build-script文件夹路径

举例:(我的文件放到了桌面上)

cd /Users/lixiangyang/Desktop/FFmpeg-iOS-build-script-master

执行编辑命令(编辑的脚本):

./build-ffmpeg.sh

官方说明如下:

官方说明

下面是编译过程中的截图(最终生成 .a文件库):

Snip20160411_11.png

生成的.a文件

接下来我们就可以吃饭去了,等的时间比较长,等编译完成后。在你的文件夹里面有这些文件出现:

出现新的文件夹
4.添加FFmpeg-iOS文件到工程里面:

注意:此处一定要把FFmpeg-iOS文件放到自己创建工程下面的文件夹里面,路径一定要正确。我就是因为直接把文件拖到工程里面,并没有注意FFmpeg-iOS文件放到哪一层文件里面,因此一直找不到头文件。

举例说明:

1)创建一个工程FFmpegDemo

FFmpegDemo

2)添加FFmpeg-iOS文件

FFmpeg-iOS文件添加过程

3)打开工程,在工程中找到FFmpeg-iOS并且添加文件进去:

第一小步.png

第二小步.png

4)文件目录如下:

文件目录.png
5.下载kxmovie并且添加类库kxmovie到FFmpegDemo里面。(ps:这里有一个demo也不错LOFFmpegSample,我是用LOFFmpegSample文件里面的kxmovie)。

kxmovie拖到FFmpegDemo里面.png

并且需要添加三个类库:(ps:至于如何添加类库,自己上网Google去)

libiconv.tbd
libbz2.tbd
libz.tbd

文件目录如下:

文件目录

总结遇到的错误信息:

此时编译会报错:

错误信息

1>错误信息:

'libavformat/avformat.h' file not found

改正错误的方法:
错误是由于文件路径不对,需要在Build Settings -> Header Search Paths 添加文件路径。

$(SRCROOT)/FFmpegDemo/FFmpeg-iOS/include

如下图:

更改路径

2>更改完路径之后,又出现错误:

Undefined symbols for architecture armv7:
"_VTDecompressionSessionDecodeFrame", referenced from:
_videotoolbox_common_end_frame in libavcodec.a(videotoolbox.o)
"_VTDecompressionSessionWaitForAsynchronousFrames", referenced from:
_videotoolbox_common_end_frame in libavcodec.a(videotoolbox.o)
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

这是因为缺少VideoToolbox.framework库,添加这个库即可。(ps:至于如何添加类库,自己上网Google去)。

3>还会出现以下错误信息:

Use of undeclared identifier 'PIX_FMT_RGB24'; did you mean 'AV_PIX_FMT_RGB24'?

此处直接按照它的提示,将 'PIX_FMT_RGB24'改变成'AV_PIX_FMT_RGB24'即可。

4>出现以下错误信息:
在KxMovieDecoder.h 与KxMovieDecoder.m文件

1.Expected a type
2.Use of undeclared identifier 'UIImage'

由于KxMovieDecoder.h缺少头文件#import <UIKit/UIKit.h>,添加上去就好。

5>因为是FFmpeg 3.0还会出现以下错误信息:(ps:此处的错误信息与下面的错误信息的原因都是一个原因引起的)

Undefined symbols for architecture armv7:
"_avpicture_deinterlace", referenced from:
-[KxMovieDecoder decodeFrames:] in KxMovieDecoder.o
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

大概的意思是说在KxMovieDecoder文件里面,有一个方法“decodeFrames: ”,在这个方法里面的"_avpicture_deinterlace"这个方法不能用,armv7结构里面没有这种方法。因此需要找到这个方法直接注释掉即可。

//                        avpicture_deinterlace((AVPicture*)_videoFrame,
// (AVPicture*)_videoFrame,
// _videoCodecCtx->pix_fmt,
// _videoCodecCtx->width,
// _videoCodecCtx->height);

6>由于是最新的FFmpeg 3.0版本,会出现以下问题:

Implicit declaration of function 'avpicture_deinterlace' is invalid in C99

将报红的地方直接注释掉即可

//                        avpicture_deinterlace((AVPicture*)_videoFrame,
// (AVPicture*)_videoFrame,
// _videoCodecCtx->pix_fmt,
// _videoCodecCtx->width,
// _videoCodecCtx->height);

此处问题总结,见论坛。kxmovie论坛

6.添加代码,实现播放服务器里面的视频代码。
#import "KxMovieViewController.h"
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
NSString *path = @"http://192.168.2.13/test/1avi.avi";
NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; // increase buffering for .wmv, it solves problem with delaying audio frames
if ([path.pathExtension isEqualToString:@"wmv"])
parameters[KxMovieParameterMinBufferedDuration] = @(5.0); // disable deinterlacing for iPhone, because it's complex operation can cause stuttering
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
parameters[KxMovieParameterDisableDeinterlacing] = @(YES); KxMovieViewController *vc = [KxMovieViewController movieViewControllerWithContentPath:path
parameters:parameters];
[self presentViewController:vc animated:YES completion:nil];
}
7.最后一点,如果你是在FFmpeg-iOS-build-script官网下载的话,编译出来的是ffmpeg 3.0,出现的问题比较多。如果是在LOFFmpegSample这个里面下载的话,直接用FFmpeg-iOS,是ffmpeg 2.8 版本。目前来说3.0版本问题比较多,解决问题的方法如上。如果是2.8版本,直接下载LOFFmpegSample的demo,比较简单。

参考资源:
1.最新FFmpeg 3.0
2.http://www.jianshu.com/p/ec432a8f5729
3.http://www.jianshu.com/p/147c03553e63
4.http://my.oschina.net/u/1757926/blog?disp=2&p=1&catalog=533528

文/依然那么爱你forever(简书作者)
原文链接:http://www.jianshu.com/p/c33f4c96074e
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

iOS编译FFmpeg、kxmovie实现视频播放 (转载)的更多相关文章

  1. 为iOS编译FFmpeg静态库

    为iOS编译FFmpeg静态库 
 环境:OS X Yosemite (版本10.10.5) Xcode (Version 7.1.1 (7B1005)) 
 
 一.资料准备: (1)ffmpeg源 ...

  2. iOS下编译ffmpeg

    网络上搜索“ios ffmpeg 编译”,文章一大把,但我编译还是费了很大的功夫才编译成功.很多文章只是把步骤列了出来,但是每个人的系统环境,或者程序版本都不一样,结果出现各种的错误.我把自己编译过程 ...

  3. iOS开发ffmpeg SDK 编译和集成

    FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.它提供了录制.转换以及流化音视频的完整解决方案.同时,FFmpeg是一套跨平台的方案,所以我们可以在iOS开发中使 ...

  4. iOS 使用 FFmpeg

    iOS 使用 FFmpeg 字数486 阅读288 评论7 喜欢5 集成 下载FFmpeg For iOS编译脚本: 打开 terminal 执行sh build-ffmpeg.sh: 步骤2执行完成 ...

  5. 100行代码实现最简单的基于FFMPEG+SDL的视频播放器(SDL1.x)【转】

    转自:http://blog.csdn.net/leixiaohua1020/article/details/8652605 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] ...

  6. Xcode编译ffmpeg(2)

    iOS: FFmpeg编译和使用问题总结 折磨了我近一周多时间的FFmpeg库编译问题终于解决了,必须得把这一段时间来遇到过的坑全写出来.如果急着解决问题,编译最新版本的FFmpeg库请直接看第二部分 ...

  7. 开源项目:windows下使用MinGW+msys编译ffmpeg

    本文参考了网络上的不少文章,但由于版本环境的问题参考文章并不能直接指导编译,本文吸收多方经验,并在自己多次编译实验的基础上写成,欢迎转载,请注名出处.    FFmpeg是在Linux平台下开发的,但 ...

  8. windows 下使用 MinGW + msys 编译 ffmpeg

    本文参考了网络上的不少文章,但由于版本环境的问题参考文章并不能直接指导编译,本文吸收多方经验,并在自己多次编译实验的基础上写成,欢迎转载,请注名出处.    FFmpeg是在Linux平台下开发的,但 ...

  9. 在Windows下编译FFmpeg详细说明

    MinGW:一个可自由使用和自由发布的Windows特定头文件和使用GNC工具集导入库的集合,允许你生成本地的Windows程序而不需要第三方C运行时 MinGW,即 Minimalist GNU F ...

随机推荐

  1. 深入理解javascript系列(4):立即调用的函数表达式

    本文来自汤姆大叔 前言 大家学JavaScript的时候,经常遇到自执行匿名函数的代码,今天我们主要就来想想说一下自执行. 在详细了解这个之前,我们来谈了解一下“自执行”这个叫法,本文对这个功能的叫法 ...

  2. mark

    *求数根公式:a的数根b = (a-1) % 9 + 1; *约瑟环问题:f1 = 0; 第i个(i>1),f = (f+m) %i;

  3. CentOS7 编译安装LVS 互为主备 (实测 笔记 Centos 7.0 + ipvsadm 1.27 + keepalived 1.2.15 )

    环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G,双网卡) LVS服务器(两台): 系统:Centos7.0 64位(LVS+keepalived) LvsMaster:1 ...

  4. 【转】你所不知道的Android Studio调试技巧

    这篇写Android studio debug技巧个人觉得写得不错,转自:http://www.jianshu.com/p/011eb88f4e0d# Android Studio目前已经成为开发An ...

  5. 后台post get请求

    /// <summary> /// 执行HTTP POST请求. /// </summary> /// <param name="url">请求 ...

  6. 浅析PHP中for与foreach两个循环结构遍历数组的区别

    遍历一个数组是编程中最常见不过的了,这里跟大家讨论下for和foreach两种方法.用这两种方法执行遍历的场景太多太多了,这里我们只针对以下两个数组作为例子来讨论.所谓管中窥豹,多少能理清一点两者的区 ...

  7. 一鼓作气 博客--第二篇 note2

    1.循环正常结束是指没有中间截断,即没有执行break; for i in range(10) print(i) else: print("循环正常结束") 2.嵌套循环 for ...

  8. asp.net中的<%%> <%#%> <%=%>形式的详细用法 (转载)

    博客分类: ASP.NET   一. <%%>这种格式实际上就是和asp的用法一样的,只是asp中里面是vbscript或者javascript代码,而在asp.net中是.net平台下支 ...

  9. 解读ASP.NET 5 & MVC6系列(1):ASP.NET 5简介

    ASP.NET 5简介 ASP.NET 5是一个跨时代的改写,所有的功能和模块都进行了独立拆分,做到了彻底解耦.为了这些改写,微软也是蛮 拼的,几乎把.NET Framwrok全部改写了一遍,形成了一 ...

  10. .net core中使用openssl的公钥私钥进行加解密

    这篇博文分享的是 C#中使用OpenSSL的公钥加密/私钥解密 一文中的解决方法在 .net core 中的改进.之前的博文针对的是 .NET Framework ,加解密用的是 RSACryptoS ...