IOS 编译FFmpeg视频播放

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它是在Linux平台下开发的,可跨平台编译运行,包括Windows、Mac OS X等,前面的"FF"代表"Fast Forward",它提供了录制、转换以及流化音视频的完整解决方案。

FFmpeg的项目组成:
libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构
和读取音视频帧等功能;
libavcodec:用于各种类型声音/图像编解码;
libavutil:包含一些公共的工具函数;
libswscale:用于视频场景比例缩放、色彩映射转换;
libpostproc:用于后期效果处理;
ffmpeg:该项目提供的一个工具,可用于格式转换、解码或电视卡即时编码等;
ffsever:一个 HTTP 多媒体即时广播串流服务器;
ffplay:是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示;

IOS编译FFmpeg

一、安装homebrew

什么是homebrew

 "homebrew"是Mac平台的一个包管理工具,提供了许多Mac下没有的Linux工具等,而且安装过程很简单。
安装过程
  1. 打开终端,运行以下命令,查看是否已安装brew:
brew 

查看结果:

  ![](http://upload-images.jianshu.io/upload_images/5369976-af4bd0ea8ca26f3b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

如果出现以上结果,恭喜你,说明你的mac已经安装好了homebrew, 如果不是,那木,你只能继续操作了

2.安装brew, 继续在终端输入命令:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

3.卸载homebrew:

brew cleanup

二、安编译FFmpeg

在此列举一些需要用到的工具:

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

1.下载gas-preprocessor

gas-preprocessor是我们需要编译的ffmpeg的所需要的脚本文件。

1)下载好gas-preprocessor后解压,找到gas-preprocessor.pl文件
2)将其拷贝到/usr/sbin/文件夹下,如果第一个文件夹不允许拷贝,可以拷贝到/usr/local/bin/文件夹下
3)打开文件可执行权限,在终端下执行以下命令

  • 如果在/usr/sbin/下
chmod 777 /usr/sbin/gas-preprocessor.pl
  • 如果在/usr/local/bin/下
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格式。

直接在终端下进行

brew install yasm

查看结果:

已经安装成功

3.编译 FFmpeg-iOS-build-script, 得到我们需要的iOS能够用的ffmpeg库

FFmpeg-iOS-build-script这个脚本,可以直接转为iOS编译可用的ffmpeg库,我们不用下载ffmpeg,脚本会帮我们下载最新版本的ffmpeg,并且打包成一个iOS可用的ffmpeg库。

1)下载并解压,我们需要的是红框中的文件:

IOS 编译FFmpeg视频播放_第1张图片

2)编译脚本, 在终端执行以下命令

cd FFmpeg-iOS-build-script文件夹路径
./build-ffmpeg.sh

官方的一些说明:

IOS 编译FFmpeg视频播放_第2张图片

以下是生成的一些.a文件:
IOS 编译FFmpeg视频播放_第3张图片


IOS 编译FFmpeg视频播放_第4张图片
5.png

4.最后下载kxmovie工程,创建自己的工程,FFmpeg-iOS和kxmovie拖入工程,编译一下。
需要引入三个系统的库:

libz.tbd
libbz2.tbd
libiconv.tbd
VideoToolbox.framework

并设置header_search_pathlibrary_search_path

5.处理bug:
A、KxMovieDecoder.h类出现以下错误, 是因为没有引入#import

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

B、KxMovieDecoder.m类出现以下错误, 直接按照提示修改即可:

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

C、出现以下错误是因为FFmpeg3.0是最新版本,直接注释掉这里的代码就行了

Implicit declaration of function 'avpicture_deinterlace' is invalid in C99
或
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)

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

ok,到此处,编译成功!

三、编写代码

#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];
}

你可能感兴趣的:(IOS 编译FFmpeg视频播放)