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工具等,而且安装过程很简单。
安装过程
- 打开终端,运行以下命令,查看是否已安装brew:
brew
查看结果:
![](https://img.haomeiwen.com/i5369976/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)下载并解压,我们需要的是红框中的文件:
2)编译脚本, 在终端执行以下命令
cd FFmpeg-iOS-build-script文件夹路径
./build-ffmpeg.sh
官方的一些说明:
以下是生成的一些.a文件:
5.png
4.最后下载kxmovie工程,创建自己的工程,FFmpeg-iOS和kxmovie拖入工程,编译一下。
需要引入三个系统的库:
libz.tbd
libbz2.tbd
libiconv.tbd
VideoToolbox.framework
并设置header_search_path
和library_search_path
5.处理bug:
A、KxMovieDecoder.h
类出现以下错误, 是因为没有引入#import <UIKit/UIKit.h>
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];
}
网友评论