FFmpeg Filtering Guide
2016-05-20 17:19
666 查看
FFmpeg Filtering Guide
Contents
DocumentationExamples
Scaling
Speed
up your video
Filtergraph,Chain,Filter
relationship
multiple
input overlay in 2x2 grid
Escaping
characters
Burnt
in Timecode
Scripting
your command line parameters
Synthetic
Input
Other
Filter Examples
Developing
your own Filters
FFmpeg has access to many filters and more are added on a regular basis. To see what filters are available with your build see ffmpeg -filters.
Documentation
Refer to the FFmpegfilters documentation for more information and examples for each filter. This wiki page is for user contributed examples and tips, and contributions to this page are encouraged.
Examples
Scaling
Starting with something simple. Resize a 640x480 input to a 320x240 output.ffmpeg -i input -vf scale=iw/2:-1 output
iw is input width. In this example the input width is 640. 640/2 = 320. The -1 tells
the scale filter to preserve the aspect ratio of the output, so in this example the scale filter will choose a value of 240. See the FFmpeg
documentation for additional information.
Speed up your video
See Howto speed up / slow down a video for examples.
Filtergraph,Chain,Filter relationship
What follows the -vf in an ffmpeg command line is a filtergraph description.This filtergraph may contain a number of chains, each of which may contain a number of filters.
Whilst a full filtergraph description can be complicated, it is possible to simplify it for simpler graphs provided ambiguity is avoided.
Remembering that filters in a chain are separated by commas "," chains by a semicolon ";" and that if an input or output is not specified it is assumed to come from the preceding or sent to the following item in the chain.
The following are equivalent:
ffmpeg -i input -vf [in]scale=iw/2:-1[out] output ffmpeg -i input -vf scale=iw/2:-1 output # the input and output are implied without ambiguity
As are:
ffmpeg -i input -vf [in]yadif=0:0:0[middle];[middle]scale=iw/2:-1[out] output # 2 chains form, one filter per chain, chains linked by the [middle] pad ffmpeg -i input -vf [in]yadif=0:0:0,scale=iw/2:-1[out] output # 1 chain form, with 2 filters in the chain, linking implied ffmpeg -i input -vf yadif=0:0:0,scale=iw/2:-1 output # the input and output are implied without ambiguity
multiple input overlay in 2x2 grid
Here four inputs are filtered together using the -filter_complex option. In this case all of the inputs are the -flavfi -i testsrc (the testsrc
source filter) but could be other inputs.
Within the filtergraph the first input is padded to the right and bottom by double its height, and the other three inputs are individually filtered using hflip, negate,
and edgedetect.
The overlay video filter is then used
multiple times for placement of each input. The offsets used in the overlay filter arrange the inputs into a grid shape.
![](http://trac.ffmpeg.org/raw-attachment/wiki/FilteringGuide/multiple_input_overlay.jpg)
ffmpeg -f lavfi -i testsrc -f lavfi -i testsrc -f lavfi -i testsrc -f lavfi -i testsrc -filter_complex \ "[0:v]pad=iw*2:ih*2[a]; \ [1:v]negate[b]; \ [2:v]hflip[c]; \ [3:v]edgedetect[d]; \ [a][b]overlay=w[x]; \ [x][c]overlay=0:h[y]; \ [y][d]overlay=w:h[out]" -map "[out]" -c:v ffv1 -t 5 multiple_input_grid.avi
Be aware that frames are taken from each input video in timestamp order, so it is a good idea to pass all overlay inputs through a setpts=PTS-STARTPTS filter
to have them begin in the same zero timestamp, such as [0:v]hflip,setpts=PTS-STARTPTS[a];[1:v]setpts=PTS-STARTPTS[b];[a][b]overlay.
Escaping characters
As described in the documentation, it can be necessary to escape commas "," that need to appear in some arguments, for example the select filter:ffmpeg -i input -vf select='eq(pict_type\,PICT_TYPE_I)' output # to select only I frames
However an alternative, which also allows for white space within the filtergraph, and which may assist in clarity of reading complex graphs, is to enclose the whole filtergraph within double quotes " " thus:
ffmpeg -i input -vf "select=eq(pict_type,PICT_TYPE_I)" output # to select only I frames ffmpeg -i input -vf "yadif=0:-1:0, scale=iw/2:-1" output # deinterlace then resize
Note that the examples given in the documentation mix and match the use of "full quoting" and "\" escaping, and that use of unusual shells may upset escaping. See Notes
on filtergraph escaping for more information.
Burnt in Timecode
Using the drawtext videofilter.
PAL 25 fps non drop frame:
ffmpeg -i in.mp4 -vf "drawtext=fontfile=/usr/share/fonts/truetype/DroidSans.ttf: timecode='09\:57\:00\:00': r=25: \ x=(w-tw)/2: y=h-(2*lh): fontcolor=white: box=1: boxcolor=0x00000000@1" -an -y out.mp4
NTSC 30 fps drop frame
(change the : to a ; before the frame count)_________________________________________________________ \ ffmpeg -i in.mp4 -vf "drawtext=fontfile=/usr/share/fonts/truetype/DroidSans.ttf: timecode='09\:57\:00\;00': r=30: \ x=(w-tw)/2: y=h-(2*lh): fontcolor=white: box=1: boxcolor=0x00000000@1" -an -y out.mp4
Scripting your command line parameters
If building complex filtergraphs the command line can get very messy so it can help to break things down into manageable pieces. However one needs to be careful when joining them all together to avoid issues due to your shell and escaped characters.The following example shows a sample bash script containing a filtergraph of one chain with three filters; yadif, scale and drawtext.
#!/bin/bash # ffmpeg test script path="/path/to/file/" in_file="in.mp4" out_file="out.mp4" cd $path filter="yadif=0:-1:0, scale=400:226, drawtext=fontfile=/usr/share/fonts/truetype/DroidSans.ttf: \ text='tod- %X':x=(w-text_w)/2:y=H-60 :fontcolor=white :box=1:boxcolor=0x00000000@1" codec="-vcodec libx264 -pix_fmt yuv420p -b:v 700k -r 25 -maxrate 700k -bufsize 5097k" command_line=(ffmpeg -i "$in_file" -vf "$filter" "$codec" -an $out_file") echo "${command_line[@]}" "${command_line[@]}" exit
Note that the filtergraph spans more than one line. The echo command shows the full command as it is executed. Useful for debugging.
The array in the $command_line variable helps avoid loss of the quotes which occurs otherwise. Other shells may behave differently.
Synthetic Input
The testsrcsource filter generates a test video pattern showing a color pattern, a scrolling gradient, and a timestamp. This is useful for testing purposes.
This example will create a 10 second output, 30 fps (300 frames total), with a frame size of 1280x720:
ffmpeg -f lavfi -i testsrc=duration=10:size=1280x720:rate=30 output.mpg
ffplay can also be used to view the resulting filtergraph:
ffplay -f lavfi -i "testsrc=duration=10:size=1280x720:rate=30"
You can also specify testsrc as a filter:
ffmpeg -filter_complex testsrc OUTPUT
Another type of testsrc is using the smptebars
source filter:
ffmpeg -f lavfi -i "smptebars=duration=5:size=1280x720:rate=30" output.mp4
Or a color
./ffmpeg -f lavfi -i color=c=red:size=100x100
There are other options for generating synthetic video input, see here and here ("generic
equation" filter).
Other Filter Examples
Fancy Filtering Examples –Examples for various psychedelic effects and other weird filtering.
Null describes the nullsink filter.
Developing your own Filters
See FFmpegfilter HOWTO
相关文章推荐
- Tensorflow source build on MAC EI Capitain
- .NET UIAutomation实现Word文档加密暴力破解
- Parquet的timestamp类型转为long
- ugui制作弧形血条
- iOS开发 UITableView 常用细节
- UIScrollView的基本设置
- Vue.js-----轻量高效的MVVM框架(五、计算属性)
- Angular2 and Electron - The definitive guide
- ios学习--UIStepper
- iOS UIScrollView的使用
- UE4 ‘Unrecognized type 'TMap'’问题
- iOS学习之—— UICollectionViewFlowLayout
- AndroidStudio导入项目一直卡在Building gradle project info最快速解决方案
- 一套完整的前台页面增删改查以及js(easyui)
- 01.手把手教你 .Net EasyUI DataGrid(创建数据表格)
- ElasticSearch : IN equivalent operator in ElasticSearch
- easyui 在日期不满足要求的情况下,让修改链接不可点,或者修改消失
- 键盘只能输入数字(或其它特定的规定字符)
- UITableView不掉用tableView: cellForRowAtIndexPath方法
- 高质量的UI组件下载地址暂存