一、编译FFmpeg静态库
方法一:
1、要安装xcode命令行工具
1).xcode5安装命令行工具方法:
在终端执行命令Using xcode-select --install
2).xcode5之前安装命令行工具方法:
2、xcode5以前都是gcc编译的,在xcode5以后都是clang编译,在脚本中有所体现
3、xcode5以前还要下载gas-preprocessor.pl脚本包,然后使用cp命令拷贝到usr/bin下面,
在xcode5以后不需要下载这个gas-preprocessor.pl脚本
4、下载ffmpeg源码,然后放放置源码至/usr/bin/build/src/文件下
在终端执行 cd /usr/bin/build/src/ffmpeg-2.2.3进入ffmpeg文件夹
5、arm7脚本(生成arm7下.a文件)
1) sudo ./configure --disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-ffserver --enable-cross-compile --sysroot="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk" --target-os=darwin --cc="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" --extra-cflags="-arch armv7" --extra-ldflags="-arch armv7" --extra-ldflags=-L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk/usr/lib/system --arch=arm --cpu=cortex-a8 --enable-pic --disable-asm --disable-everything --enable-decoder=h264 --enable-decoder=rv40 --enable-decoder=aac
2) make clean
3) make
4) make install 如果执行失败,执行 sudo make install
5) make clean
6) 将执行所得.a文件剪切到桌面ffmpeg文件夹下arm7子文件夹下
6、arm7s脚本(生成arm7s下.a文件)
1) sudo ./configure --disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-ffserver --enable-cross-compile --sysroot="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk" --target-os=darwin --cc="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" --extra-cflags="-arch armv7s -mfpu=neon -miphoneos-version-min=7.1” --extra-ldflags="-arch armv7s -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk -miphoneos-version-min=7.1" --arch=arm --cpu=cortex-a9 --enable-pic --disable-asm --disable-everything --enable-decoder=h264 --enable-decoder=rv40 --enable-decoder=aac
2) make clean
3) make
4) make install 如果执行失败,执行 sudo make install
5) make clean
6) 执行所得.a文件剪切到桌面ffmpeg文件夹下arm7s子文件夹下
7、i386的编译:(生成i386下.a文件)
1) sudo ./configure --disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-ffserver --enable-avresample --enable-cross-compile --sysroot="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.1.sdk" --target-os=darwin --cc="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" --extra-cflags="-arch i386 -mfpu=neon -miphoneos-version-min=7.0" --extra-ldflags="-arch i386 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.1.sdk -miphoneos-version-min=7.0" --arch=i386 --cpu=i386 --enable-decoder=h264 --enable-decoder=rv40
2) make clean
3) make
4) make install 如果执行失败,执行 sudo make install
5) make clean
6) 执行所得.a文件剪切到桌面ffmpeg文件夹下sim子文件夹下
注:不用配置这个--enable-pic --disable-asm
--enable-pic //build position-independent code
--disable-asm //disable all assembler optimizations
脚本中的黄色字体显示编译器的路径,这个和xcode5以前是不一样的
8、i386,arm7,arm7s文件夹下的相同名字文件合并到ios文件下一个文件
1)、三个libswscale.a文件合成一个文件libswscale.a
lipo -create /Users/chang/Desktop/ffmpeg/sim/libswscale.a /Users/chang/Desktop/ffmpeg/arm7/libswscale.a /Users/chang/Desktop/ffmpeg/arm7s/libswscale.a -output /Users/chang/Desktop/ffmpeg/ios/libswscale.a
2)、三个libswresample.a文件合成一个文件libswresample.a
lipo -create /Users/chang/Desktop/ffmpeg/sim/libswresample.a /Users/chang/Desktop/ffmpeg/arm7/libswresample.a /Users/chang/Desktop/ffmpeg/arm7s/libswresample.a -output /Users/chang/Desktop/ffmpeg/ios/libswresample.a
3)、三个libavutil.a文件合成一个文件libavutil.a
lipo -create /Users/chang/Desktop/ffmpeg/sim/libavutil.a /Users/chang/Desktop/ffmpeg/arm7/libavutil.a /Users/chang/Desktop/ffmpeg/arm7s/libavutil.a -output /Users/chang/Desktop/ffmpeg/ios/libavutil.a
4)、三个libavformat.a文件合成一个文件libavformat.a
lipo -create /Users/chang/Desktop/ffmpeg/sim/libavformat.a /Users/chang/Desktop/ffmpeg/arm7/libavformat.a /Users/chang/Desktop/ffmpeg/arm7s/libavformat.a -output /Users/chang/Desktop/ffmpeg/ios/libavformat.a
5)、三个libavfilter.a文件合成一个文件libavfilter.a
lipo -create /Users/chang/Desktop/ffmpeg/sim/libavfilter.a /Users/chang/Desktop/ffmpeg/arm7/libavfilter.a /Users/chang/Desktop/ffmpeg/arm7s/libavfilter.a -output /Users/chang/Desktop/ffmpeg/ios/libavfilter.a
6)、三个libavdevice.a文件合成一个文件libavdevice.a
lipo -create /Users/chang/Desktop/ffmpeg/sim/libavdevice.a /Users/chang/Desktop/ffmpeg/arm7/libavdevice.a /Users/chang/Desktop/ffmpeg/arm7s/libavdevice.a -output /Users/chang/Desktop/ffmpeg/ios/libavdevice.a
7)、三个libavcodec.a文件合成一个文件libavcodec.a
lipo -create /Users/chang/Desktop/ffmpeg/sim/libavcodec.a /Users/chang/Desktop/ffmpeg/arm7/libavcodec.a /Users/chang/Desktop/ffmpeg/arm7s/libavcodec.a -output /Users/chang/Desktop/ffmpeg/ios/libavcodec.a
注:i386,arm7文件夹下各有8个.a文件,arm7s文件夹下却只有7个,不明原理。
测试中,我在桌面建了一个文件夹ffmpeg,下面有三个子文件夹sim(即i386编译所得.a文件,用于模拟器调试)、arm7(即arm7环境下编译所得文件)、arm7s(即arm7s环境下编译所得文件)。经过上面命令操作后,在ios文件夹下会得到合成后的.a文件,这样就可以在真机及模拟器下正常使用了。
方法二:
1. 命令⾏安装FFmpeg:git clone git:// source.ffmpeg.org/ffmpeg.git ffmpeg(或:到https://
github.com/ gabriel/ffmpeg-iphone-build下载 ffmpeg-iphone-build)
- 安装命令⾏⼯具(Command Line Tools) 打开终端,输⼊命令:xcode-select -- install选择“安装”,然后同意安装协议。
- 下载gas-preprocessor:https:// github.com/mansr/gas-preprocessor, 先 将gas-preprocessor.pl拷⻉贝到/usr/bin/⽬录中。 然后修改gas-preprocessor.pl文件的权 限。注:需要有读,写和执⾏行的权限。具体操 作为,⾸先在命令行下进入/usr/bin目录, 然后执⾏行chmod命令: 1).cd /usr/bin/ 2). chmod a+rwx gas-preprocessor.pl
- 注:在⽹上搜索gas-preprocessor.pl,会有很多版本,学习中,我下载了一个较旧的版本,然后虽然编译成功了静态库文件,但是.a⽂文件嵌入到⼯程后却不能正常播放视频。这个困扰我好长时间,后来换成最新代码,然后,ok,编译成功!
- 4.下载FFmpeg源代码库,放置在/usr/bin/build/src目录下
- 5.运行build-ffmpeg.sh文件
- 1).终端下cd 至build-ffmpeg.sh脚本所在目录下
- 2).执行 sh build-ftmpeg.sh
6. 把/build/built/universal目录下的 lib 和 include 文件导⼊工程,然后在header search path ,library search path配置include⽂件路径。
二、Mac OS X下安装FFmpeg
This post is going to be to show you how to install FFmpeg on Mac OS X as easy as possible. For that, i will use a software called “Homebrew”. It is a linux like package manager with a lot of useful tools easy to install from it. It is quite similar to MacPorts, but in this special case you will get a more recent FFmpeg using Homebrew thanMacPorts. Once you are familiar with Homebrew, i am sure you will use it a lot more afterwards if you are not using already.
Install/Update Xcode
To be able to use Homebrew you need the Xcode Command Line Tools. Follow these steps to install it:
1. Open “Mac App Store” and install Xcode. If you have XCode already installed, update to the latest version available if necesary.
2. After Xcode has been successfully installed, open the Xcode Preferences-Pane.
3. Select the “Downloads”-Tab and click on “Install” next to the “Command Line Tools” entry.
The time i am writing this Tutorial i have already installed the Xcode Command Line Tools, even if not in the latest version, which i will correct later on my system. But, this is also good for you as you can see what to install if i tell you that on your system will be an “Install”-Button where is an “Update”-Button on the provided screenshot.
Install Homebrew
Installing Homebrew is quite simple. Everything you need to do is to open up a Terminal window, paste and execute the following command and follow the instructions during the installation process.
ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
After successful installation you should execute:
brew doctor
This checks if your Homebrew installation was successful and installation of Formulas (Packages) will work. If you have any trouble please drop me a note in the comments section.
Install FFmpeg
Now we are nearly done as all prerequisites are now installed and we can start installing FFmpeg. As there are many options when installing FFmpeg, a command you should know about is brew options <Formula> . This will show you all available options for the fromula you are going to install which will be in this case “ffmpeg”. So in our case, brew options ffmpeg will print the following information to your screen:
1 2 3 4 5 6 7 8 | reneVolution$ brew options ffmpeg
--with-fdk-aac Enable the Fraunhofer FDK AAC library --with-ffplay Enable FFplay media player --with-freetype Build with freetype support |
To finally install FFmpeg on your system you should follow these steps:
1. Check if your Homebrew installation is up to date and working with brew doctor
2. Check all available options for ffmpeg with brew options ffmpeg
3. Install ffmpeg with all desired options with brew install ffmpeg [all your options]
Example:
To install FFmpeg with all available options without disabling anything execute:
1 | brew install ffmpeg --with-fdk-aac --with-ffplay --with-freetype --with-frei0r --with-libass --with-libvo-aacenc --with-libvorbis --with-libvpx --with-opencore-amr --with-openjpeg --with-opus --with-rtmpdump --with-schroedinger --with-speex --with-theora --with-tools |
If you are running into any troubles during installation please leave a message in the comments section.
Afterwards FFmpeg should be installed and you can start enjoy to use it.
If you prefer to work with FFmpeg on your Windows machine, read my article How to get the latest FFmpeg binaries for Windows.
安装完成后,即可在mac 终端即可使用ffmpeg命令操作视音频。ffmpeg功能强大得令人匪夷所思。
三、FFmpeg 基本用法
本课要解决的问题
1.FFmpeg的转码流程是什么?
2.常见的视频格式包含哪些内容吗?
3.如何把这些内容从视频文件中抽取出来?
4.如何从一种格式转换为另一种格式?
5.如何放大和缩小视频?
6.如何旋转,翻转,填充,裁剪,模糊,锐化视频?
7.如何给视频加logo,删除logo?
8.如何给视频加文本,动态文本?
9.如何处理图片?
10.如何录像,添加动态logo,截图,马赛克视频?
第一部分
基础
术语
容器(Container)
容器就是一种文件格式,比如flv,mkv等。包含下面5种流以及文件头信息。
流(Stream)
是一种视频数据信息的传输方式,5种流:音频,视频,字幕,附件,数据。
帧(Frame)
帧代表一幅静止的图像,分为I帧,P帧,B帧。
编解码器(Codec)
是对视频进行压缩或者解压缩,CODEC =COde (编码) +DECode(解码)
复用/解复用(mux/demux)
把不同的流按照某种容器的规则放入容器,这种行为叫做复用(mux)
把不同的流从某种容器中解析出来,这种行为叫做解复用(demux)
简介
FFmpeg的名称来自MPEG视频编码标准,前面的“FF”代表“Fast Forward”,FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。可以轻易地实现多种视频格式之间的相互转换。
FFmpeg的用户有Google,Facebook,Youtube,优酷,爱奇艺,土豆等。
组成
1、libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能,包含demuxers和muxer库;
2、libavcodec:用于各种类型声音/图像编解码;
3、libavutil:包含一些公共的工具函数;
4、libswscale:用于视频场景比例缩放、色彩映射转换;
5、libpostproc:用于后期效果处理;
6、ffmpeg:是一个命令行工具,用来对视频文件转换格式,也支持对电视卡实时编码;
7、ffsever:是一个HTTP多媒体实时广播流服务器,支持时光平移;
8、ffplay:是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示;
FFmpeg处理流程
过滤器(Filter)
在多媒体处理中,filter的意思是被编码到输出文件之前用来修改输入文件内容的一个软件工具。如:视频翻转,旋转,缩放等。
语法:[input_link_label1][input_link_label2]… filter_name=parameters [output_link_label1][output_link_label2]…
过滤器图link label :是标记过滤器的输入或输出的名称
1.视频过滤器 -vf
如testsrc视频按顺时针方向旋转90度
ffplay -f lavfi -i testsrc -vf transpose=1
如testsrc视频水平翻转(左右翻转)
ffplay -f lavfi -i testsrc -vf hflip
2.音频过滤器 -af
实现慢速播放,声音速度是原始速度的50%
ffplay p629100.mp3 -af atempo=0.5
如何实现顺时针旋转90度并水平翻转?
过滤器链(Filterchain)
基本语法
Filterchain = 逗号分隔的一组filter
语法:“filter1,filter2,filter3,…filterN-2,filterN-1,filterN”
顺时针旋转90度并水平翻转
ffplay -f lavfi -i testsrc -vf transpose=1,hflip
如何实现水平翻转视频和源视频进行比较? 看过滤器链是如何实现的。
过滤器链(Filterchain)
第一步: 源视频宽度扩大两倍。
ffmpeg -i jidu.mp4 -t 10 -vf pad=2*iw output.mp4
第二步:源视频水平翻转
ffmpeg -i jidu.mp4 -t 10 -vf hflip output2.mp4
第三步:水平翻转视频覆盖output.mp4
ffmpeg -i output.mp4 -i output2.mp4 -filter_complex overlay=w compare.mp4
是不是很复杂?
用带有链接标记的过滤器图(Filtergraph)只需一条命令。
过滤器图(Filtergraph)
基本语法
Filtergraph = 分号分隔的一组filterchain
“filterchain1;filterchain2;…filterchainN-1;filterchainN”
Filtergraph的分类
1、简单(simple) 一对一
2、复杂(complex)多对一, 多对多
过滤器图(Filtergraph)
简单过滤器图处理流程:
复杂过滤器图处理流程:
从图中可以发现复杂过滤器图比简单过滤器图少2个步骤,效率比简单高,ffmpeg建议尽量使用复杂过滤器图。
回答上面提的问题,实现水平翻转视频和源视频进行比较
过滤器图(Filtergraph)
用ffplay直接观看结果:
ffplay -f lavfi -i testsrc -vf split[a][b];[a]pad=2*iw[1];[b]hflip[2];[1][2]overlay=w
F1: split过滤器创建两个输入文件的拷贝并标记为[a],[b]
F2: [a]作为pad过滤器的输入,pad过滤器产生2倍宽度并输出到[1].
F3: [b]作为hflip过滤器的输入,vflip过滤器水平翻转视频并输出到[2].
F4: 用overlay过滤器把 [2]覆盖到[1]的旁边.
选择媒体流
一些多媒体容器比如AVI,mkv,mp4等,可以包含不同种类的多个流,如何从容器中抽取各种流呢?
语法:
-map file_number:stream_type[:stream_number]
这有一些特别流符号的说明:
1、-map 0 选择第一个文件的所有流
2、-map i:v 从文件序号i(index)中获取所有视频流, -map i:a 获取所有音频流,-map i:s 获取所有字幕流等等。
3、特殊参数-an,-vn,-sn分别排除所有的音频,视频,字幕流。
注意:文件序号和流序号从0开始计数。
选择媒体流
第二部分
查看帮助
帮助
FFmpeg工具有一个巨大的控制台帮助。下表描述了可用的一些选项,斜体字表示要被替换的项,ffplay和ffprobe也有一些类似的选项。
帮助
可用的bit流 :ffmpeg –bsfs
可用的编解码器:ffmpeg –codecs
可用的解码器:ffmpeg –decoders
可用的编码器:ffmpeg –encoders
可用的过滤器:ffmpeg –filters
可用的视频格式:ffmpeg –formats
可用的声道布局:ffmpeg –layouts
可用的license:ffmpeg –L
可用的像素格式:ffmpeg –pix_fmts
可用的协议:ffmpeg -protocals
第三部分
码率、帧率和文件大小
概述
码率和帧率是视频文件的最重要的基本特征,对于他们的特有设置会决定视频质量。如果我们知道码率和时长那么可以很容易计算出输出文件的大小。
帧率:帧率也叫帧频率,帧率是视频文件中每一秒的帧数,肉眼想看到连续移动图像至少需要15帧。
码率:比特率(也叫码率,数据率)是一个确定整体视频/音频质量的参数,为秒单位处理的字节数,码率和视频质量成正比,在视频文件中中比特率用bps来表达。
帧率
1、用 -r 参数设置帧率
ffmpeg –i input –r fps output
2、用fps filter设置帧率
ffmpeg -i clip.mpg -vf fps=fps=25 clip.webm
帧率的预定义值:
例如设置码率为29.97fps,下面三种方式具有相同的结果:
ffmpeg -i input.avi -r 29.97 output.mpg
ffmpeg -i input.avi -r 30000/1001 output.mpg
ffmpeg -i input.avi -r netsc output.mpg
码率、文件大小
设置码率 –b 参数
-b
ffmpeg -i film.avi -b 1.5M film.mp4
音频:-b:a 视频: - b:v
设置视频码率为1500kbps
ffmpeg -i input.avi -b:v 1500k output.mp4
控制输出文件大小
-fs (file size首字母缩写)
ffmpeg -i input.avi -fs 1024K output.mp4
计算输出文件大小
(视频码率+音频码率) * 时长 /8 = 文件大小K
第四部分
调整视频分辨率
1、用-s参数设置视频分辨率,参数值wxh,w宽度单位是像素,h高度单位是像素
ffmpeg -i input_file -s 320x240 output_file
2、预定义的视频尺寸
下面两条命令有相同效果
ffmpeg -i input.avi -s 640x480 output.avi
ffmpeg -i input.avi -s vga output.avi
Scale filter调整分辨率
Scale filter的优点是可以使用一些额外的参数
语法:
Scale=width:height[:interl={1|-1}]
下表列出了常用的额外参数
举例
下面两条命令有相同效果
ffmpeg -i input.mpg -s 320x240 output.mp4
ffmpeg -i input.mpg -vf scale=320:240 output.mp4
对输入视频成比例缩放
改变为源视频一半大小
ffmpeg -i input.mpg -vf scale=iw/2:ih/2 output.mp4
改变为原视频的90%大小:
ffmpeg -i input.mpg -vf scale=iw*0.9:ih*0.9 output.mp4
举例
在未知视频的分辨率时,保证调整的分辨率与源视频有相同的横纵比。
宽度固定400,高度成比例:
ffmpeg -i input.avi -vf scale=400:400/a
ffmpeg -i input.avi -vf scale=400:-1
相反地,高度固定300,宽度成比例:
ffmpeg -i input.avi -vf scale=-1:300
ffmpeg -i input.avi -vf scale=300*a:300
第五部分
裁剪/填充视频
裁剪视频crop filter
从输入文件中选取你想要的矩形区域到输出文件中,常见用来去视频黑边。
语法:crop:ow[:oh[:x[:y:[:keep_aspect]]]]
举例
裁剪输入视频的左三分之一,中间三分之一,右三分之一:
ffmpeg -i input -vf crop=iw/3:ih :0:0 output
ffmpeg -i input -vf crop=iw/3:ih :iw/3:0 output
ffmpeg -i input -vf crop=iw/3:ih :iw/3*2:0 output
裁剪帧的中心
当我们想裁剪区域在帧的中间时,裁剪filter可以跳过输入x和y值,他们的默认值是
Xdefault = ( input width - output width)/2
Ydefault = ( input height - output height)/2
ffmpeg -i input_file -v crop=w:h output_file
裁剪中间一半区域:
ffmpeg -i input.avi -vf crop=iw/2:ih/2 output.avi
举例
比较裁剪后的视频和源视频比较
ffplay -i jidu.mp4 -vf split[a][b];[a]drawbox=x=(iw-300)/2:(ih-300)/2:w=300:h=300:c=yellow[A];[A]pad=2*iw[C];[b]crop=300:300:(iw-300)/2:(ih-300)/2[B];[C][B]overlay=w*2.4:40
自动检测裁剪区域
cropdetect filter 自动检测黑边区域
ffplay jidu.mp4 -vf cropdetect
然后用检测到的值来裁剪视频
ffplay jidu.mp4 –vf crop=672:272:0:54
填充视频(pad)
在视频帧上增加一快额外额区域,经常用在播放的时候显示不同的横纵比
语法:pad=width[:height:[:x[:y:[:color]]]]
举例
创建一个30个像素的粉色宽度来包围一个SVGA尺寸的图片:
ffmpeg -i photo.jpg -vf pad=860:660:30:30:pink framed_photo.jpg
同理可以制作testsrc视频用30个像素粉色包围视频
ffplay -f lavfi -i testsrc -vf pad=iw+60:ih+60:30:30:pink
4:3到16:9
一些设备只能播放16:9的横纵比,4:3的横纵比必须在水平方向的两边填充成16:9,
高度被保持,宽度等于高度乘以16/9,x(输入文件水平位移)值由表达式(output_width - input_width)/2来计算。
4:3到16:9的通用命令是:
ffmpeg -i input -vf pad=ih*16/9:ih :(ow-iw)/2:0:color output
举例
ffplay -f lavfi -i testsrc -vf pad=ih*16/9:ih:(ow-iw)/2:0:pink
16:9到4:3
为了用4:3的横纵比来显示16:9的横纵比,填充输入文件的垂直两边,宽度保持不变,高度是宽度的3/4,y值(输入文件的垂直偏移量)是由一个表达式(output_height-input_height)/2计算出来的。
16:9到4:3的通用命令:
ffmpeg -i input -vf pad=iw :iw*3/4:0:(oh-ih)/2:color output
举例
ffplay -f lavfi -i testsrc=size=320x180 -vf pad=iw:iw*3/4:0:(oh-ih)/2:pink
第六部分
翻转和旋转
翻转
水平翻转语法: -vf hflip
ffplay -f lavfi -i testsrc -vf hflip
垂直翻转语法:-vf vflip
ffplay -f lavfi -i testsrc -vf vflip
旋转
语法:transpose={0,1,2,3}
0:逆时针旋转90°然后垂直翻转
1:顺时针旋转90°
2:逆时针旋转90°
3:顺时针旋转90°然后水平翻转
第七部分
模糊,锐化
模糊
语法:boxblur=luma_r:luma_p[:chroma_r:chram_p[:alpha_r:alpha_p]]
ffplay -f lavfi -i testsrc -vf boxblur=1:10:4:10
注意:luma_r和alpha_r半径取值范围是0~min(w,h)/2, chroma_r半径的取值范围是0~min(cw/ch)/2
锐化
语法:-vf unsharp=l_msize_x:l_msize_y:l_amount:c_msize_x:c_msize_y:c_amount
所有的参数是可选的,默认值是5:5:1.0:5:5:0.0
l_msize_x:水平亮度矩阵,取值范围3-13,默认值为5
l_msize_y:垂直亮度矩阵,取值范围3-13,默认值为5
l_amount:亮度强度,取值范围-2.0-5.0,负数为模糊效果,默认值1.0
c_msize_x:水平色彩矩阵,取值范围3-13,默认值5
c_msize_y:垂直色彩矩阵,取值范围3-13,默认值5
c_amount:色彩强度,取值范围-2.0-5.0,负数为模糊效果,默认值0.0
举例
使用默认值,亮度矩阵为5x5和亮度值为1.0
ffmpeg -i input -vf unsharp output.mp4
高斯模糊效果(比较强的模糊):
ffplay -f lavfi -i testsrc -vf unsharp=13:13:-2
第八部分
覆盖(画中画)
覆盖
语法:overlay[=x[:y]
所有的参数都是可选,默认值都是0
举例
Logo在左上角
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay pair1.mp4
举例
右上角:
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w pair2.mp4
左下角:
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=0:H-h pair2.mp4
右下角:
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w:H-h pair2.mp4
删除logo
语法:-vf delogo=x:y:w:h[:t[:show]]
x:y 离左上角的坐标
w:h logo的宽和高
t: 矩形边缘的厚度默认值4
show:若设置为1有一个绿色的矩形,默认值0.
ffplay -i jidu.mp4 -vf delogo=50:51:60:60:100:0
第九部分
添加文本
添加文本
语法:
drawtext=fontfile=font_f:text=text1[:p3=v3[:p4=v4[…]]]
常用的参数值
x:离左上角的横坐标
y: 离左上角的纵坐标
fontcolor:字体颜色
fontsize:字体大小
text:文本内容
textfile:文本文件
t:时间戳,单位秒
n:帧数开始位置为0
draw/enable:控制文件显示,若值为0不显示,1显示,可以使用函数
简单用法
1、在左上角添加Welcome文字
ffplay -f lavfi -i color=c=white -vf drawtext=fontfile=arial.ttf:text=Welcom
2、在中央添加Good day
ffplay -f lavfi -i color=c=white -vf drawtext="fontfile=arial.ttf:text='Goodday':x=(w-tw)/2:y=(h-th)/2"
3、设置字体颜色和大小
ffplay -f lavfi -i color=c=white -vf drawtext="fontfile=arial.ttf:text='Happy Holidays':x=(w-tw)/2:y=(h-th)/2:fontcolor=green:fontsize=30"
动态文本
用 t (时间秒)变量实现动态文本
1、顶部水平滚动
ffplay -i jidu.mp4 -vf drawtext="fontfile=arial.ttf:text='Dynamic RTL text':x=w-t*50:fontcolor=darkorange:fontsize=30"
2、底部水平滚动
ffplay -i jidu.mp4 -vf drawtext="fontfile=arial.ttf:textfile=textfile.txt:x=w-t*50:y=h-th:fontcolor=darkorange:fontsize=30"
3、垂直从下往上滚动
ffplay jidu.mp4 -vf drawtext="textfile=textfile:fontfile=arial.ttf:x=(w-tw)/2:y=h-t*100:fontcolor=white:fontsize=30“
想实现右上角显示当前时间?
动态文本
在右上角显示当前时间 localtime
ffplay jidu.mp4 -vf drawtext="fontfile=arial.ttf:x=w-tw:fontcolor=white:fontsize=30:text='%{localtime\:%H\\\:%M\\\:%S}'“
每隔3秒显示一次当前时间
ffplay jidu.mp4 -vf drawtext="fontfile=arial.ttf:x=w-tw:fontcolor=white:fontsize=30:text='%{localtime\:%H\\\:%M\\\:%S}':enable=lt(mod(t\,3)\,1)"
第十部分
图片处理
图片支持
FFmpeg支持绝大多数图片处理, 除LJPEG(无损JPEG)之外,其他都能被解码,除了EXR,PIC,PTX之外,所有的都能被编码。
截取一张图片使用 –ss(seek from start)参数.
ffmpeg -ss 01:23:45 -i jidu.mp4 image.jpg
从视频中生成GIF图片
ffmpeg -i jidu.mp4 -t 10 -pix_fmt rgb24 jidu.gif
转换视频为图片(每帧一张图)
ffmpeg -i clip.avi frame%4d.jpg
图片转换为视频
ffmpeg -f image2 -i img%4d.jpg -r 25 video.mp4
裁剪、填充
和视频一样,图片也可以被裁剪和填充
裁剪
ffmpeg -f lavfi -i rgbtestsrc -vf crop=150:150 crop_rg.png
填充
ffmpeg -f lavfi -i smptebars -vf pad=360:280:20:20:orange pad_smpte.jpg
翻转,旋转,覆盖
和视频一样图片同样能翻转,旋转和覆盖
翻转
ffmpeg -i orange.jpg -vf hflip orange_hfilp.jpg
ffmpeg -i orange.jpg -vf vflip orange_vfilp.jpg
旋转
ffmpeg -i image.png -vf transpose=1 image_rotated.png
覆盖
ffmpeg -f lavfi -i rgbtestsrc -s 400x300 rgb .png
ffmpeg -f lavfi -i smptebars smpte.png
ffmpeg -i rgb .png -i smpte.png -filter_complex overlay= (W-w)/2:(H-h)/2 rgb_smpte.png
第十一部分
其他高级技巧
屏幕录像
显示设备名称
ffmpeg -list_devices 1 -f dshow -i dummy
调用摄像头
ffplay -f dshow -i video="Integrated Camera"
保存为文件
ffmpeg -y -f dshow -s 320x240 -r 25 -i video="Integrated Camera" -b:v 800K -vcodec mpeg4 new.mp4
添加字幕subtitles
语法 –vf subtitles=file
ffmpeg -i jidu.mp4 -vf subtitles=rgb.srt output.mp4
视频颤抖、色彩平衡
视频颤抖
ffplay –i jidu.mp4 -vf crop=in_w/2:in_h/2:(in_w-out_w)/2+((in_w-out_w)/2)*sin(n/10):(in_h-out_h)/2 +((in_h-out_h)/2)*sin(n/7)
色彩平衡
ffplay -i jidu.mp4 -vf curves=vintage
色彩变幻
ffplay -i jidu.mp4 -vf hue="H=2*PI*t: s=sin(2*PI*t)+1“
彩色转换黑白
ffplay -i jidu.mp4 -vf lutyuv="u=128:v=128"
设置音频视频播放速度
3倍视频播放视频
ffplay -i jidu.mp4 -vf setpts=PTS/3
?速度播放视频
ffplay -i jidu.mp4 -vf setpts=PTS/(3/4)
2倍速度播放音频
ffplay -i speech.mp3 -af atempo=2
问题:视频和音频同时3/4慢速播放
截图
每隔一秒截一张图
ffmpeg -i input.flv -f image2 -vf fps=fps=1 out%d.png
每隔20秒截一张图
ffmpeg -i input.flv -f image2 -vf fps=fps=1/20 out%d.png
注意:ffmpeg version N-57961-gec8e68c版本最多可以每隔20s截一张图。
多张截图合并到一个文件里(2x3) ?每隔一千帧(秒数=1000/fps25)即40s截一张图
ffmpeg? -i jidu.mp4 -frames 3 -vf "select=not(mod(n\,1000)),scale=320:240,tile=2x3" out.png
马赛克视频
马赛克视频
用多个输入文件创建一个马赛克视频:
ffmpeg -i jidu.mp4 -i jidu.flv -i "Day By Day SBS.mp4" -i "Dangerous.mp4" -filter_complex "nullsrc=size=640x480 [base]; [0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft]; [1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright]; [2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft]; [3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright]; [base][upperleft] overlay=shortest=1 [tmp1]; [tmp1][upperright] overlay=shortest=1:x=320 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3]; [tmp3][lowerright] overlay=shortest=1:x=320:y=240" -c:v libx264 output.mkv
Logo动态移动
1、2秒后logo从左到右移动:
ffplay -i jidu.mp4 -vf movie=logo.png[logo];[in][logo]overlay=x='if(gte(t\,2)\,((t-2)*80)-w\,NAN)':y=0
2、2秒后logo从左到右移动后停止在左上角
ffplay -i jidu.mp4 -vf movie=logo.png[logo];[in][logo]overlay=x='if(gte(((t-2)*80)-w\,W)\,0\,((t-2)*80)-w)':y=0
3、每隔10秒交替出现logo。
ffmpeg -y -t 60 -i jidu.mp4 -i logo.png -i logo2.png -filter_complex "overlay=x=if(lt(mod(t\,20)\,10)\,10\,NAN ):y=10,overlay=x=if(gt(mod(t\,20)\,10)\,W-w-10\,NAN ) :y=10" overlay.mp4
资料
FFmpeg官网: http://www.ffmpeg.org
FFmpeg doc : http://www.ffmpeg.org/documentation.html
FFmpeg wiki : https://trac.ffmpeg.org/wiki
FAQ
Thanks!
FFmpeg基础: http://wenku.baidu.com/view/296eefcaf90f76c661371af1.html
四、FFmpeg优劣对比
1、FFMPEG 与ios自带的播放控件(MPMoviePlayerController) 各自的优势是什么?
1).MPMoviePlayerController 只支持能在iPhone或者iPod上直接播放(不借助其他播放器)的格式
.mov, .mp4,.mpv, and .3gp
反过来就是说, rmvb mkv 等一些比较常用的是不支持的,只能靠别的(如ffmpeg等)
2). ffmpeg是优化过的,你要用在嵌入式上面的话必须找到相应平台的工程,移植很困难,而且生成文件大!
ffmpeg使用的许多优化汇编指令你这个平台也不一定支持。
ffmpeg的优势在于支持格式全面。 速度没有什么优势的。
2、FFmpeg支持
FFmpeg 对编码解码器的支持
ffmpeg 支持的编解码器种类共有 280 多种,涵盖了几乎所有常见音视频编码格式,
能解码几乎所有的音视频,每种音视频编解码器的实现都在 libavcodec 目录下有具体的 C 语言实现
FFmpeg 对容器格式的支持
ffmpeg 支持对绝大多数的容器格式的读写操作,共计 190 多种,涵盖了互联网上各 种常见媒体格式及日常生活中及专业应用中的各种媒体格式。
FFmpeg 对图像颜色空间的支持ffmpeg 支持常见的图像颜色空间,并且在 libavswcale 中定义了颜色空间转换的相关
函数实现各种颜色模式的互转。
3、音频
音频:使用audiocore播放音频只能播放iOS支持的音频格式,使用SDL播放音频没有限制。
FFMPEG功能相当强大,在完整的FFMPEG包中就包含了ffserver, ffplay, ffmpeg, avcodec, avdevice, avformat, avutil, swscale等;其中ffserver, ffplay, ffmpeg为应用程序,对与我们这些从事软件开发的人来说基本上没什么用;而avcodec为加解码库、avformat为格式库,avutil则为基础库(但平常我们很少用到), swscale则为图象处理库;所以我们所要的就是移值avcodec, avformat, avutil, swscale这四个库。
目前几乎所有的主流多媒体播放器都是基于开源多媒体框架ffmpeg来做的,可见ffmpeg的强大。FFmpeg在Chrome, MPlayer, VLC, xine中都有应用
4、ffmpeg缺点
ffmpeg编译起来太麻烦了……各种神烦……摆脱xcode之后先编译.a库然后再添加进项目应该会好些,我反正是懒得再试了……
AVPlayer比较残,MP4方面吊拽酷炫,无人能敌,其他的就差强人意了(不能播好不好)
五、在Windows、Mac OS 下搭建Apache文件服务器
1、windows下配置Apache做文件服务器
以下是在windows 8下配置Apache作为文件服务器的步骤,并且配置了 webdav 能支持put 上传,已在linux下使⽤用curl命令测试成功!
Apache2.4.7 win版下载地址:http://www.apachelounge.com/download/
1.下载回来的是解压文件,解压好放到要安装的位置。(我这⾥里以D: \Acpache24为例)2.打开Apache24\conf下httpd.conf ⽂件,⽤记事本打开即可。 (1):把c:/Apache24 改为 ServerRoot "D:/Apache24" (2):ServerAdmin 改不改⽆所谓
(3):Listen 80 默认为80,如80端⼝已被占用,请使用其他端口号, 如:Listen 8181(4):ServerName www.example.com:80 把#号去掉,改为⾃己的域名,如 果没有则使⽤用IP地址,如:ServerName192.168.20.18:8181 (5):把DocumentRoot "c:/Apache24/htdocs" 改为 DocumentRoot "D:/ Apache24/htdocs" 这⾥里使⽤用的是默认的⽂件夹,你也可以⾃己新建,然 后修改路径就好了
(6):把<Directory "c:/Apache24/htdocs"> 改为 <Directory "D:/Apache24/ htdocs">(7):把ScriptAlias /cgi-bin/ "c:/Apache24/cgi-bin/" 改为 ScriptAlias /cgi-bin/ "D:/Apache24/cgi-bin/"
(8):把<Directory "c:/Apache24/cgi-bin"> 改为 <Directory "D:/Apache24/ cgi-bin">
3.上⾯面设置完成后,保存文档。下⾯就是启动Apache:
开始 --- 运⾏,输入cmd,打开命令提⽰示符。接着输入1.d: 回车 2.cd Apache24\bin 回车 3.httpd 回车
如果httpd.conf配置正确的话,输入httpd回车后是没有任何提示的,这个 时候就是启动了Apache。 注意:不能关掉这个命令窗口,否则apache会关闭的。
4.测试,⽤浏览器访问会出现“It works”那么就说明apache已经正确安装 了。
5.加⼊入为windows的系统服务,让Apache⾃启动。 (1)关闭3的那个httpd命令窗口,不然会报错的。(2)开始 --- 运⾏,输⼊cmd,再打开一个命令提示符。输入d:回车cd Apache24\bin回车 (注意:windows8的要以管理员来运行)
这⾥加入服务的命令为:httpd.exe -k install -n "servicename"。 servicename为Apache在windows的服务中的名字。例如:httpd.exe -k install -n "Apache24"。输入httpd.exe -k install -n "Apache24"后,会有成功安装的提示,“服 务”也会有Apache24这个服务项。这个时候可以选择启动,启动Apache 服务。 如果要卸载这个服务的话,先要停止这个服务,然后输入httpd.exe -k uninstall -n "Apache24"卸载这个服务。 以后可以通过Apache24\bin文件夹下的ApacheMonitor.exe来控制这个
Apache。任务栏也会有显示这个软件的很方便的管理Apache的运行。
接着就是配置下载目录:download及上传目录upload了,其中上传目录需 要配置成webdav,以便于接收put 的上传⽅式。
⼀、配置下载目录download: 1.在Apache目录下创建下载目录download 路径为"D:/Apache24/
download"2.在Apache24\conf 下打开httpd.conf⽂文件,添加以下内容:
Alias /download "D:/Apache24/download" <Directory "D:/Apache24/download">
Options Indexes AllowOverride None Order allow,deny Allow from all Require all granted
</Directory>
3.保存文档,重启服务,在linux下使用curl进行测试, curl -o test.txt http://192.168.20.18:8181/download/test.txt
⼆二、配置上传目录upload:1.在Apache目录下创建下载目录upload 路径为"D:/Apache24/upload" 2.在Apache24\conf 下打开httpd.conf⽂文件
#LoadModule dav_module modules/mod_dav.so #LoadModule dav_fs_module modules/mod_dav_fs.so
#Include conf/extra/httpd-dav.conf 找到以上3行,把"#"去掉 3.打开Apache24\conf\extra下httpd-dav.conf⽂文件 DavLockDB "c:/Apache24/var/DavLock"
Alias /uploads "c:/Apache24/uploads"
<Directory "c:/Apache24/uploads"> Dav On
AuthType DigestAuthName DAV-uploadAuthUserFile "c:/Apache24/user.passwd" AuthDigestProvider file<RequireAny>
Require method GET POST OPTIONS
Require user admin </RequireAny>
</Directory> 把以上代码替换成以下代码:
DavLockDB "D:/Apache24/var/DavLock" Alias /upload "D:/Apache24/upload" <Directory "D:/Apache24/upload">
Dav On
Options IndexesAllowOverride NoneOrder allow,denyAllow from allAuthType BasicAuthName DAV-uploadAuthUserFile "D:/Apache24/user.passwd" AuthBasicProvider file
Require valid-user </Directory>
4.按照 DavLockDB "D:/Apache24/var/DavLock",创建文件夹与文件。 (1).在Apache24目录下创建⽂件夹var (2).在⽂件夹var中创建文件DavLock5.创建密码⽂件
(1).开始 --- 运⾏,输⼊cmd,打开命令提⽰示符。接着输入d: 回车 cd Apache24\bin 回车
输入htpasswd.exe -c "D:\Apache24\user.passwd" admin 回车 "D:\Apache24\user.passwd"⽣成密码文件要存放的路径,admin是用户名,然后输入2次密码,这样就OK了,然后重启服务。 6.在linux下使⽤用curl进⾏行测试, curl -T dtwpc.dat -u admin:123456
http://192.168.20.18:8181/upload/
配置时遇到的错误及解决方法:error.log:[Fri Jan 30 13:38:40 2009] [error] [client 192.168.123.123] The locks could not be queried for verification against a possible "If:" header. [500, #0][Fri Jan 30 13:38:40 2009] [error] [client 192.168.123.123] Could not open the lock database. [500, #400][Fri Jan 30 13:38:40 2009] [error] [client 192.168.123.123] (17)File exists: Could not open property database. [500, #1]
问题原因:在配置WebDav时,在配置httpd-dav.conf文件时,追加了下面 的内容,却没有创建此⽂件,并修改其权限DavLockDB "/usr/local/apache2/var/DavLock" 解决办法:按照以上DavLockDB的目录,创建⽂件夹与文件。 1.在路径:/usr/local/apache2/ 创建文件夹 var 2.在文件夹var中创建文件DavLock
出现错误信息:301 Moved Permanently 问题原因:如果你访问的服务器的主机名和在Apache配置⽂件⾥面定义 的ServerName不一样,那么当产⽣一个引用自身的URL请求的时候, Apache会根据UseCanonicalName属性的设置来把你的请求重定向到⼀个新的主机名,⽐如你访问⼀个目录却没有加上尾部的斜杠,这样的 话,Apache⾸先会在原始⻚面上要求验证,然后执⾏重定向,因为主机 名变了,所以Apache在新主机名上的⻚面再要求验证,就出现了两次要求验证。解决办法:1.每次访问目录的时候都要加上尾部的斜杠; 2.使用Apache配置⽂件⾥面定义的ServerName来访问,或者在Apache 配置⽂件⾥面设置UseCanonicalName off。
启动Apache时出现错误error.log:AH00558: httpd: Could not reliably determine the server's fully qualified domain
name, using fe80::d9c3:303e:7b2b:4e34. Set the 'ServerName' directive globallyto suppress this message问题原因:这是由于没有设置ServerName 解决办法:打开httpd.conf⽂文件,找到ServerName,把"#"去掉就好了
Apache中⽂文⼿手册2.2版本:http://lamp.linux.gov.cn/Apache/ApacheMenu/ index.html
2、Mac OS 下配置Apache做文件服务器
Mac自带了Apache环境。
开启apache命令:sudo apachectl start
关闭apache命令:sudo apachectl stop
重启apache命令:sudo apachectl restart
启动Apache
打开“终端(terminal)”,输入 sudo apachectl -v,(可能需要输入机器秘密)。如下显示Apache的版本
接着输入 sudo apachectl start,这样Apache就启动了。打开Safari浏览器地址栏输入 “http://localhost”,可以看到内容为“It works!”的页面。其位于“/Library(资源库)/WebServer/Documents/”下,这就是Apache的默认根目录。
Apache的安装目录在:/etc/apache2/,etc默认是隐藏的。有三种方式查看:
dock下右键Finder,选择"前往文件夹",输入"/etc"
在finder下----》前往---》前往文件夹,然后输入/etc
可以在terminal 输入 "open /etc"
设置虚拟主机
在终端运行“sudo vi /etc/apache2/httpd.conf”,打开Apche的配置文件
在httpd.conf中找到“#Include /private/etc/apache2/extra/httpd-vhosts.conf”,去掉前面的“#”,保存并退出。
运行“sudo apachectl restart”,重启Apache后就开启了虚拟主机配置功能。
运行“sudo vi /etc/apache2/extra/httpd-vhosts.conf”,就打开了配置虚拟主机文件httpd-vhost.conf,配置虚拟主机了。需要注意的是该文件默认开启了两个作为例子的虚拟主机:
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "/usr/docs/dummy-host.example.com"
ServerName dummy-host.example.com
ErrorLog "/private/var/log/apache2/dummy-host.example.com-error_log"
CustomLog "/private/var/log/apache2/dummy-host.example.com-access_log" common
</VirtualHost>
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host2.example.com
DocumentRoot "/usr/docs/dummy-host2.example.com"
ServerName dummy-host2.example.com
ErrorLog "/private/var/log/apache2/dummy-host2.example.com-error_log"
CustomLog "/private/var/log/apache2/dummy-host2.example.com-access_log" common
</VirtualHost>
而实际上,这两个虚拟主机是不存在的,在没有配置任何其他虚拟主机时,可能会导致访问localhost时出现如下提示:
Forbidden
You don't have permission to access /index.php on this server
最简单的办法就是在它们每行前面加上#,注释掉就好了,这样既能参考又不导致其他问题。
增加如下配置
<VirtualHost *:80>
DocumentRoot "/Library/WebServer/Documents"
ServerName localhost
ErrorLog "/private/var/log/apache2/localhost-error_log"
CustomLog "/private/var/log/apache2/localhost-access_log" common
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "/Users/snandy/work"
ServerName mysites
ErrorLog "/private/var/log/apache2/sites-error_log"
CustomLog "/private/var/log/apache2/sites-access_log" common
<Directory />
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
保存退出,并重启Apache。
运行“sudo vi /etc/hosts”,打开hosts配置文件,加入"127.0.0.1 mysites",这样就可以配置完成sites虚拟主机了,可以访问“http://mysites”了,在10.8之前Mac OS X版本其内容和“http://localhost/~[用户名]”完全一致。
注意,记录log的“ErrorLog "/private/var/log/apache2/sites-error_log"”也可以删掉,但记录日志其实是一个好习惯,在出现问题时可以帮助我们判断。如果保留这些log代码,一定log文件路径都是存在的,如果随便修改一个不存在的,会导致Apache无法服务而没有错误提示,这个比较恶心。
配置好以上信息,进入/Library/WebServer/Documents目录,新建video文件夹,放若干视频到video文件夹下。在浏览器输入http://localhost/video/huidaoguoqu.mp4或者http://本机ip/video/huidaoguoqu.mp4,这时就可以正常访问或者下载该视频了。