FFMPEG详解-(ffplay /ffmpeg指令用法)

FFMPEG简介

资料

FFmpeg官网: http://www.ffmpeg.org

FFmpeg doc : http://www.ffmpeg.org/documentation.html

FFmpeg wiki : https://trac.ffmpeg.org/wiki

FFmpeg基础: http://wenku.baidu.com/view/296eefcaf90f76c661371af1.html

Fmpeg Documentation http://ffmpeg.org/doxygen/trunk/index.html

  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中的数据结构

  • AVFormatContext 封装格式上下文结构体,也是统领全局的结构体,保存了视频文件封装 格式相关信息。

    • iformat:输入视频的AVInputFormat
    • nb_streams :输入视频的AVStream 个数
    • streams :输入视频的AVStream []数组
    • duration :输入视频的时长(以微秒为单位)
    • bit_rate :输入视频的码率
  • AVInputFormat 每种封装格式(例如FLV, MKV, MP4, AVI)对应一个该结构体。

    • name:封装格式名称
    • long_name:封装格式的长名称
    • extensions:封装格式的扩展名
    • id:封装格式ID
    • 一些封装格式处理的接口函数
  • AVStream 视频文件中每个视频(音频)流对应一个该结构体。

    • id:序号
    • codec:该流对应的AVCodecContext
    • time_base:该流的时基
    • r_frame_rate:该流的帧率
  • AVCodecContext编码器上下文结构体,保存了视频(音频)编解码相关信息。

    • codec:编解码器的AVCodec
    • width, height:图像的宽高(只针对视频)
    • pix_fmt:像素格式(只针对视频)
    • sample_rate:采样率(只针对音频)
    • channels:声道数(只针对音频)
    • sample_fmt:采样格式(只针对音频)
  • AVCodec 每种视频(音频)编解码器(例如H.264解码器)对应一个该结构体。

    • name:编解码器名称
    • long_name:编解码器长名称
    • type:编解码器类型
    • id:编解码器ID
    • 一些编解码的接口函数
  • AVPacket 存储一帧压缩编码数据。

    • pts:显示时间戳
    • dts :解码时间戳
    • data :压缩编码数据
    • size :压缩编码数据大小
    • stream_index :所属的AVStream
  • AVFrame存储一帧解码后像素(采样)数据。

    • data:解码后的图像像素数据(音频采样数据)。
    • linesize:对视频来说是图像中一行像素的大小;对音频来说是音频帧的大小。
    • width, height:图像的宽高(只针对视频)。
    • key_frame:是否为关键帧(只针对视频) 。
    • pict_type:帧类型(只针对视频) 。例如I,P,B。
    •  

FFMPEG常用指令

1.分离视频音频流 

ffmpeg -i input_file -vcodec copy -an output_file_video  //分离视频流
ffmpeg -i input_file -acodec copy -vn output_file_audio  //分离音频流

2.视频解复用

ffmpeg –i test.mp4 –vcodec copy –an –f m4v test.264
ffmpeg –i test.avi –vcodec copy –an –f m4v test.264

3.视频转码

ffmpeg –i test.mp4 –vcodec h264 –s 352*278 –an –f m4v test.264              //转码为码流原始文件
ffmpeg –i test.mp4 –vcodec h264 –bf 0 –g 25 –s 352*278 –an –f m4v test.264  //转码为码流原始文件
ffmpeg –i test.avi -vcodec mpeg4 –vtag xvid –qsame test_xvid.avi            //转码为封装文件
//-bf B帧数目控制,-g 关键帧间隔控制,-s 分辨率控制

4.视频封装

ffmpeg –i video_file –i audio_file –vcodec copy –acodec copy output_file

5.视频剪切

ffmpeg –i test.avi –r 1 –f image2 image-%3d.jpeg        //提取图片
ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec copy -acodec copy output.avi    //剪切视频
//-r 提取图像的频率,-ss 开始时间,-t 持续时间

6.视频录制

ffmpeg –i rtsp://192.168.3.205:5555/test –vcodec copy out.avi

7.YUV序列播放

ffplay -f rawvideo -video_size 1920x1080 input.yuv

8.YUV序列转AVI

ffmpeg –s w*h –pix_fmt yuv420p –i input.yuv –vcodec mpeg4 output.avi

常用参数说明:

主要参数:
-i 设定输入流
-f 设定输出格式
-ss 开始时间
视频参数:
-b 设定视频流量,默认为200Kbit/s
-r 设定帧速率,默认为25
-s 设定画面的宽与高
-aspect 设定画面的比例
-vn 不处理视频
-vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器
音频参数:
-ar 设定采样率
-ac 设定声音的Channel数
-acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器
-an 不处理音频

ffplay 命令使用

ffplay [选项] ['输入文件']

1. 主要选项

'-x width'        强制以 "width" 宽度显示
'-y height'       强制以 "height" 高度显示
'-an'             禁止音频
'-vn'             禁止视频
'-ss pos'         跳转到指定的位置(秒)
'-t duration'     播放 "duration" 秒音/视频
'-bytes'          按字节跳转
'-nodisp'         禁止图像显示(只输出音频)
'-f fmt'          强制使用 "fmt" 格式
'-window_title title'  设置窗口标题(默认为输入文件名)
'-loop number'    循环播放 "number" 次(0将一直循环)
'-showmode mode'  设置显示模式
可选的 mode :
'0, video'    显示视频
'1, waves'    显示音频波形
'2, rdft'     显示音频频带
默认值为 'video',你可以在播放进行时,按 "w" 键在这几种模式间切换
'-i input_file'   指定输入文件

2. 一些高级选项

'-sync type'          设置主时钟为音频、视频、或者外部。默认为音频。主时钟用来进行音视频同步
'-threads count'      设置线程个数
'-autoexit'           播放完成后自动退出
'-exitonkeydown'      任意键按下时退出
'-exitonmousedown'    任意鼠标按键按下时退出
'-acodec codec_name'  强制指定音频解码器为 "codec_name"
'-vcodec codec_name'  强制指定视频解码器为 "codec_name"
'-scodec codec_name'  强制指定字幕解码器为 "codec_name"

3. 一些快捷键

'q, ESC'            退出
'f'                 全屏
'p, SPC'            暂停
'w'                 切换显示模式(视频/音频波形/音频频带)
's'                 步进到下一帧
'left/right'        快退/快进 10 秒
'down/up'           快退/快进 1 分钟
'page down/page up' 跳转到前一章/下一章(如果没有章节,快退/快进 10 分钟)
'mouse click'       跳转到鼠标点击的位置(根据鼠标在显示窗口点击的位置计算百分比)

ffplay 高级使用方式

1. 循环播放

ffplay pm.mp4 -loop 10

上述命令代表播放视频结束之后会从头再次播放,共循环播放10次。

2. 播放 pm.mp4 ,播放完成后自动退出

ffplay -autoexit pm.mp4

3. 以 320 x 240 的大小播放 test.mp4

ffplay -x 320 -y 240 pm.mp4

4. 将窗口标题设置为 "myplayer",循环播放 2 次

ffplay -window_title myplayer -loop 2 pm.mp4

5. 播放 双通道 32K 的 PCM 音频数据

ffplay -f s16le -ar 32000 -ac 2 test.pcm

ffplay音画同步

ffplay也是一个视频播放器,所以不得不提出来的一个问题是:音画同步。ffplay的音画同步的实现方式其实有三种,分别是:以音频为主时间轴作为同步源,以视频为主时间轴作为同步源,以外部时钟为主时间轴作为同步源。

下面就以音频为主时间轴来作为同步源来作为案例进行讲解,而且ffplay默认也是以音频为基准进行对齐的,那么以音频作为对齐基准是如何实现的呢?

首先需要说明的是,播放器接收到的视频帧或者音频帧,内部都是会有时间戳(PTS时钟)来标识它实际应该在什么时刻展示,实际的对齐策略如下:比较视频当前的播放时间和音频当前的播放时间,如果视频播放过快,则通过加大延迟或者重复播放来降低视频播放速度,如果视频播放满了,则通过减小延迟或者丢帧来追赶音频播放的时间点。关键就在于音视频时间的比较和延迟的计算,当前在比较的过程中会设置一个阈值,如果超过预设的阈值就应该作出调整(丢帧或者重复渲染),这就是整个对齐策略。

在使用ffplay的时候,我们可以明确的指定使用那种对齐方式,比如:

ffplay pm.mp4 -sync audio

上面这个命令显式的指定了使用以音频为基准进行音视频同步的方式播放视频文件,当然这也是ffplay的默认播放设置。

ffplay pm.mp4 -sync video

上面这个命令显式的指定了使用以视频为基准进行音视频同步的方式播放视频文件。

ffplay pm.mp4 -sync ext

上面这个命令显式的指定了使用外部时钟为基准进行音视频同步的方式播放视频文件。

大家可以分别使用这三种方式进行播放,尝试听一听,做一些快进或者seek的操作,看看不同的对齐策略对最终的播放会产生什么样的影响。

ffprobe命令使用

ffprobe是ffmpeg命令行工具中相对简单的,此命令是用来查看媒体文件格式的工具。

ffprobe pm.mp4 

 

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'pm.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 1
    compatible_brands: isomavc1
    creation_time   : 2016-12-17T16:02:05.000000Z
    album           : Yinyuetai
    artist          : yinyuetai.com
    comment         : Yinyuetai-1TR1151
    date            : 12/18/16 00:02:05
  Duration: 00:04:33.51, start: 0.000000, bitrate: 1104 kb/s
    Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 960x540, 1008 kb/s, 25 fps, 25 tbr, 25k tbn, 50 tbc (default)
    Metadata:
      creation_time   : 2016-12-17T16:02:05.000000Z
      handler_name    : 264@GPAC0.5.1-DEV-rev5472
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 92 kb/s (default)
    Metadata:
      creation_time   : 2016-12-17T15:50:54.000000Z
      handler_name    : Sound Media Handler

首先我们看以下这行信息:

Duration: 00:04:33.51, start: 0.000000, bitrate: 1104 kb/s

这行信息表示,该视频文件的时长是4分33秒510毫秒,开始播放时间是0,整个文件的比特率是1104Kbit/s,然后我们看下一行信息:

Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 960x540, 1008 kb/s, 25 fps, 25 tbr, 25k tbn, 50 tbc (default)

这行信息表示,第一个流是视频流,编码格式是H264格式(封装格式为AVC1),每一帧的数据表示为yuv420p,分辨率为960x540,这路流的比特率为1108Kbit/s,帧率为每秒钟25帧。

接下来我们看下一行:

Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 92 kb/s (default)

这行信息表示第二个流是音频流,编码方式为ACC(封装格式为MP4A),并且采用的Profile是LC规格,采样率是44.1KHz,声道是立体声,这路流的比特率92Kbit/s。

到此为止,我们就掌握了使用ffprobe提取媒体的头文件信息的方式,并了解了提取出来的信息的含义

 

FFMPEG命令使用

ffmpeg是一个非常强大的工具,它可以转换任何格式的媒体文件,并且还可以用自己的AudioFilter以及VideoFilter进行处理和编辑。有了它,我们就可以对媒体文件做很多我们想做的事情了。

1. 通用参数

-f fmt : 指定格式

-i filename:指定输入文件名
-y:覆盖已有文件
-t duration:指定时长
-fs limit_size:设置文件大小的上限
-ss time_off: 从指定的时间开始
-re:代表按照真绿发送,尤其在作为推流工具的时候一定要加上该参数,否则ffpmeg会按照最高速率向流媒体不停的发送数据。
-map:指定输出文件的流映射关系。例如:“-map 1:0 -map 1:1”要求按照第二个输入的文件的第一个流和第二个流写入输出文件。如果没有设置此项,则ffpmeg采用默认的映射关系。

2. 视频参数

-b:指定比特率(bit/s),ffmpeg默认采用的是VBR的,若指定的该参数,则使用平均比特率。
-bitexact:使用标准比特率。
-vb:指定视频比特率(bit/s)
-r rate:帧速率(fps)
-s size:指定分辨率(320x240)
-aspect aspect:设置视频长宽比(4:3、16:9或1.33333、1.77777)
-croptop size:设置顶部切除尺寸(in pixels)
-cropleft size:设置左切除尺寸(in pixels)
-cropbottom size:设置地步切除尺寸(in pixels)
-cropright size:设置右切除尺寸(in pixels)
-padtop size:设置顶部补齐尺寸(in pixels)
-padleft size:设置左补齐尺寸(in pixels)
-padbottom size:设置地步补齐尺寸(in pixels)
-padright size:设置右补齐尺寸(in pixels)
-padcolor color:设置补齐颜色
-vn:取消视频的输出
-vcodec codec:强制使用codec编码方式

3. 音频参数

-ab:设置比特率(bit/s),对于MP3的格式,想要听到较高品质的声音,建议设置160Kbit/s(单声道80Kbit/s)以上。
-aq quality:设置音频质量
-ar ratre:设置音频采样率(Hz)
-ac channels:设置声道数,1就是单声道,2就是立体声
-an:取消音频输出
-acodec codec:强制使用codec编码方式
-vol volume:设置录制音量大小

以上就是在日常开发中经常用到的音视频参数及通用参数。下面会针对常见的开发场景进行实践和说明。

1. 列出ffmpeg支持的所有格式

相关命令:

ffmpeg -formats

2. 剪切一段媒体文件,可以是音频或者视频文件

相关命令:

ffmpeg -i pm.mp4 -ss 00:00:50.0 -codec copy -t 20 output.mp4
命令说明:

表示将文件pm.mp4从第50s开始剪切20s的时间,输出到output.mp4中,其中-ss指定偏移时间(time Offset),-t指定的时长(duration)。

但是直接这样执行命令,固然我们能截取出来音视频的文件,但是当我们播放的时候,我们会发现虽然ffmepg剪切视频,很方便,但是也有很大缺陷:

(1). 剪切时间点不精确 
(2). 有时剪切的视频开头有黑屏

造成这些问题的原因是ffmpeg无法seek到非关键帧上。

命令层面定位的话就是如果把-ss, -t参数放在-i参数之后,是对输出文件执行的seek操作 
输入文件会逐帧解码,直到-ss设置的时间点为止,这么操作会很慢,虽然时间点是准确的,但是很容易出现黑屏问题。

所以:我们优化了一下上面的那个命令,让视频的剪切更加精确:

ffmpeg -ss 10 -t 15 -accurate_seek -i pm.mp4 -codec copy output.mp4 
注意:accurate_seek必须放在-i参数之前

3. 提取一个视频文件中的音频,并保存为文件

ffmpeg -i pm.mp4 -vn -acodec copy output.m4a
4. 将视频中的音频静音,只保留视频
ffmpeg -i pm.mp4 -an -vcodec copy output.mp4 
5. 从mp4文件中抽取视频流导出为裸H264数据:
ffmpeg -i pm.mp4 -an -vcodec copy -bsf:v h264_mp4toannexb output.h264
验证播放的话,可以使用ffplay命令。说明一下上面的命令:

在指令中,我们舍弃了音频数据(-an),视频数据使用mp4toannexb这个bitstreasm filter来转换为原始的H264数据。注:同一编码也会有不同的封装格式。

6. 将一段视频推送到流媒体服务器上:

ffmpeg -re -i pm.mp4 -acodec copy -vcodec copy -f flv rtmp://127.0.0.1/rh/mylive 
7. 将流媒体服务器上的流dump到本地:
ffmpeg -i rtmp://127.0.0.1/rh/mylive -acodec copy -vcodec copy -f flv test.flv
8. 给视频添加水印
ffmpeg -i pm.mp4 -i xxx.png -filter_complex "overlay=5:5"  out.mp4
9. 倒放音视频
// 1.视频倒放,无音频
ffmpeg.exe -i inputfile.mp4 -filter_complex [0:v]reverse[v] -map [v] -preset superfast reversed.mp4
// 2.视频倒放,音频不变
ffmpeg.exe -i inputfile.mp4 -vf reverse reversed.mp4
// 3.音频倒放,视频不变
ffmpeg.exe -i inputfile.mp4 -map 0 -c:v copy -af "areverse" reversed_audio.mp4
// 4.音视频同时倒放
ffmpeg.exe -i inputfile.mp4 -vf reverse -af areverse -preset superfast reversed.mp4

过滤器(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

(3)如何实现顺时针旋转90度并水平翻转? 

  过滤器链(Filterchain)

    基本语法   Filterchain = 逗号分隔的一组filter

         语法:“filter1,filter2,filter3,…filterN-2,filterN-1,filterN”

    顺时针旋转90度并水平翻转       ffplay -f lavfi -i testsrc -vf transpose=1,hflip

(4)如何实现水平翻转视频和源视频进行比较? 

方法一:    过滤器链(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 = 分号分隔的一组filterchain

  “filterchain1;filterchain2;…filterchainN-1;filterchainN”

  用ffplay直接观看结果:  fplay -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开始计数。

查看帮助

可用的bit流 :ffmpeg –bsfs

可用的编解码器:ffmpeg –codecs

可用的解码器:ffmpeg –decoders

可用的编码器:ffmpeg –encoders

可用的过滤器:ffmpeg –filters

可用的视频格式:ffmpeg –formats

可用的声道布局:ffmpeg –layouts

可用的license:ffmpeg –L

可用的像素格式:ffmpeg –pix_fmts

可用的协议:ffmpeg -protocals

码率、帧率和文件大小

        码率和帧率是视频文件的最重要的基本特征,对于他们的特有设置会决定视频质量。如果我们知道码率和时长那么可以很容易计算出输出文件的大小。

帧率:帧率也叫帧频率,帧率是视频文件中每一秒的帧数,肉眼想看到连续移动图像至少需要15帧。     fps

码率:比特率(也叫码率,数据率)是一个确定整体视频/音频质量的参数,秒为单位处理的字节数,码率和视频质量成正比,在视频文件中中比特率用bps来表达

帧率

1、用 -r 参数设置帧率 (fps    每秒传输帧数(Frames Per Second))

ffmpeg –i input –r fps output

用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 参数  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

调整视频分辨率

调整视频分辨率

  用-s参数设置视频分辨率,参数值wxh,w宽度单位是像素,h高度单位是像素    ffmpeg -i input_file -s 320x240 output_file

预定义的视频尺寸

  下面两条命令有相同效果

    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]] ,       fplay -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显示,可以使用函数

简单用法

在左上角添加Welcome文字

ffplay -f lavfi -i color=c=white -vf drawtext=fontfile=arial.ttf:text=Welcom

在中央添加Good day

ffplay -f lavfi -i color=c=white -vf drawtext="fontfile=arial.ttf:text='Goodday':x=(w-tw)/2:y=(h-th)/2"

设置字体颜色和大小

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 (时间秒)变量实现动态文本

顶部水平滚动

ffplay -i jidu.mp4 -vf drawtext="fontfile=arial.ttf:text='Dynamic RTL text':x=w-t*50:fontcolor=darkorange:fontsize=30"

底部水平滚动

ffplay -i jidu.mp4 -vf drawtext="fontfile=arial.ttf:textfile=textfile.txt:x=w-t*50:y=h-th:fontcolor=darkorange:fontsize=30"

垂直从下往上滚动

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

色彩变幻:  fplay -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

截图

  每隔一秒截一张图:  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

多张截图合并到一个文件里(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动态移动

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秒后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

每隔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

  • 6
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值