FFmpeg是一款功能强大的、开源的、多媒体转码工具,可以将各种多媒体文件进行转码、压制、提取、截取、合并和录屏等多种操作,满足不同场景下对音视频的需求。FFmpeg的核心是其领先的音/视频编码库,提供了丰富的编解码算法,能够高效地处理各种格式的音视频文件,并通过结合libavcodec实现高质量的音视频转码和处理。
尽管FFmpeg最初是在Linux环境下开发的,但它具有跨平台的能力,可以在包括Windows在内的大多数操作系统中编译运行,这使得FFmpeg成为了一个广泛使用的多媒体处理工具,无论是在个人用户还是企业级应用中都得到了广泛的认可。
ffmpeg安装使用教程
1、在本站下载并解压压缩包
2、进入程序根目录,并将bin目录路径配置至电脑环境变量中配置方法如下
①右键点击我的电脑/此电脑,在打开的右键菜单中选择属性选项
②来到下图所示界面后,点击高级系统设置选项
③接着点击环境变量选项
④然后在系统变量下找到Path变量,并将程序的bin目录路径复制进入即可,配置完成之后即可点击确定-确定再返回,不要直接叉掉
⑤配置完成之后我们按下WIN+R然后再输入cmd执行,来到命令行窗口后输入ffmpeg -version 如果出现下图信息,则说明配置成功
3、配置完成就可以正常使用啦
ffmpeg常用命令大全
1、获取视频信息,包括网络url
ffmpeg -i input.mp4
ffmpeg -i http://xxx.com/videofiles/xxxx.flv
2、分离音视频流
//视频流按原来的编码格式,禁用音频流。
ffmpeg -i input_file -vcodec copy -an output_file_video// 音频流按原来的编码格式,禁用视频流。
ffmpeg -i input_file -acodec copy -vn output_file_audio
如果你想改变被分离出来的码流部分,那-codec就要附带ffmpeg所支持的编码格式别名。
还有!具体输出的封装文件后缀名,需要与音频编码相符,譬如
flv封装格式 支持 h.264,flashvideo + aac/mp3/ac3,然后需要理解的是mp3是一种音频编码格式: mpeg1--audio(layer1,2,3)
mp4封装格式 支持 几乎所有的音视频码流的编码格式。
3、提取带有spspps的h264码流
//提取 264码流,只能用ffplay -i 播放
ffmpeg -i input.mp4 -vcodec copy -an -bsf: h264_mp4toannexb -f h264 output.264 //提取 264码流,只能用ffplay -i 播放
ffmpeg -i input.mp4 -vcodec copy -an -bsf: h264_mp4toannexb -f h264 output.264 // 注意 -bsf后面一定要带一个空格!
// h264格式是分为: VCL(avc1), NALU(annexb)
// VCL(avc1):MP4 文件,一个文件只有一个头部(sps, pps)
// NALU(annexb):一个nalu附带一个spspps头
4、mp4转换ts
//MP4转换ts
ffmpeg -i \XXFile\XX.mp4 -c copy -f mpegts \XXFile\XX.ts //h264视频转ts视频流
ffmpeg -i \XXFile\XX.h264 -vcodec copy -f mpegts output.ts //h264视频转mp4
ffmpeg -i \test\test.h264 -vcodec copy -f mp4 output.mp4
5、改变视频码率、帧率、gop、宽高;音频声道数、采样率
ffmpeg -i test.mp4 -b:v 640k output.flv ffmpeg -i test.mp4 -acodec copy -vcodec copy -f flv output.flv ffmpeg431 -i test.mp4 -s 176x144 -vcodec libx264 -r 25 -g 100 -acodec aac -b 200k -ac 1 -ab 32 -ar 8000 -f avi output.avi-s:指定宽高(widthxheight: 必须也必然是偶数,不是偶数也会变成偶数)
-r :帧率 25,30,50,60
-g:gop 图像组,多少帧有一个关键帧
-b:码率,bps(bits per second)
-ac:声道数
-ar:采样率,每秒采样多少次(44.1KHz=44100,48KHz=48000,80KHz)
-ab:采样位数
6、MP4格式的faststart转换
ffmpeg -i http://xxxx/154202543368.m3u8 -c copy -movflags +faststart output.mp4 //m3u8转mp4
/// mp4的封装格式,头信息默认在文件的尾部,这样在解析MP4的时候要先读取整个文件才能正常解析,严重影响效率。
/// -movflags +faststart,把mp4文件的头信息放在文件的头部,这样就不影响效率,而且还能在正常使用中把网络流转写到本地的MP4格式
7、生成视频缩略图
ffmpeg -i input_ test.mp4 -r 1 -f image2 output_ image-%03d.jpeg
ffmpeg -i \test\guide.mp4 -ss 8 -t 4 -s 320*240 \test\t1_image.gif-r:1秒1帧图,-f:输出格式为image2,output_ image-%03d.jpeg格式化输出图片-ss:从8s开始时间,-t:持续4s(把-t的时间值控制在每帧显示的时间内,就是静态图,如果是大于每帧的显示时间,就是动图图),-s:输出大小320*240
8、缩略图合并成视频
ffmpeg -f image2 -t 30 -r 1 -i \test\output_image-%03d.jpeg \test\out_compjpeg.mp4-r: 1秒1帧图,-t:30张图,共持续30s
9、滤镜水印,静态图层overlay
overlay技术又称视频叠加技术。overlay视频技术使用非常广泛,常见的例子有,电视屏幕右上角显示的电视台台标,以及画中画功能。画中画是指在一个大的视频播放窗口中还存在一个小播放窗口,两个窗口不同的视频内容同时播放。overlay技术中涉及两个窗口,通常把较大的窗口称作背景窗口,较小的窗口称作前景窗口,背景窗口或前景窗口里都可以播放视频或显示图片。FFmpeg中使用overlay滤镜可实现视频叠加效果。
/// -vf,video filter:简单过滤器
/// 注意1:overlay的第三个参数,默认是0,如果1强制颜色空间为rgb,但是容易出问题,最好省略第三个参数
/// 注意2: -vf,codec不能使用copy,需要重新指定编码格式
//右上角
ffmpeg -i guide.mp4 -vf "movie=logo.png[logo]; [in][logo] overlay=W-w:10:0 [out]" output.mp4
//中间
ffmpeg -i guide.mp4 -vf "movie=logo.png[logo]; [in][logo]overlay=W/2-w/2:H/2-h/2[out]" -vcodec libx264 -acodec aac output.mp4
//右下角
ffmpeg -i guide.mp4 -vf "movie=logo.png[logo]; [in][logo]overlay=W-w:H-h[out]" -vcodec libx264 -acodec aac output.mp4 -y// [logo]是输入logo.png的标签名,[in]是输入guide.mp4的标签名。语法: overlay[=x:[[:rgb={0, 1}]]
参数x和y是可选的,默认为0。
参数rgb 参数也是可选的,其值为0(YUV)或1(RGB),默认为原输入的颜色格式。
参数说明:
X 从左上角的水平坐标,默认值为0
y 从左。上角的垂直坐标,默认值为0
rgb 值为0表示输入颜色空间不改变,默认为0;值为1表示将输入的颜色空间设置为RGB
变量说明:如下变量可用在x和y的表达式中
main_w或W 主输入(背景窗口)宽度
main_h或H 主输入(背景窗口)高度
overlay_ w或w overlay输入(前景窗口)宽度
overlay_ h或h overlay输入(前景窗口)高度///也可以使用另外一种方式 -filter_complex overlay=参数
ffmpeg -i guide.mp4 -i logo.png -filter_complex overlay=W/2-w/2:H/2-h/2 test1.mp4
10、滤镜水印,输入文字/当前时间
ffmpeg -i guide.mp4 -vf "drawtext=fontfile=simhei.ttf:text='xsfdsx':x=100:y=10:fontsize=24:fontcolor=yellow:shadowy=2" drawtext.mp4//添加文字水印命令 drawtext=key=value:key=value:key=value● line_h, Ih
the height of each text line 文本行的高度
● main_h, h, H
the input height 输入视频的高度:像素
● main_w, w, W
the input width 输入视频的宽度:像素
● n
the number of input frame, starting from 0 第几帧开始
● rand(min, max)
return a random number included between min and max 随机数
● mod(a, b)
求余,a%b,5%2== 1
● sar
The input sample aspect ratio. 输入采样的宽高比,yuv像素的宽高比。
● t
timestamp expressed in seconds, NAN if the input timestamp is unknown 时间戳,单位:秒
● text_h, th
the height of the rendered text 文本的高度:像素
● text_w, tw
the width of the rendered text 文本的宽度:像素
● fontfile 字体样式
● fontsize 字体大小
● fontcolor 字体颜色,支持#336699/ 在右上角显示当前时间,为了辨析,参数的冒号用了中文字符显示ffmpeg guide.mp4 -vf drawtext="fontfile=D\\:/test/font/font.ttf:x=W-tw:y=10:fontcolor=black:fontsize=30:text='%{localtime\:%H\\\:%M\\\:%S}" -y output.mp4// 在命令行当中,drawtext输入的k:v的v里面如果有“:”需要转义“\:”
// 如果fontfile使用了绝对路径D:\test\font\font.ttf,需要转义成fontfile=D\\:/test/font/font.ttf,路径的斜杠 \ 需要变成反斜杠 /
// 在写代码的时候就必须注意双斜杠\\的转义操作。
// localtime的输出格式,斜杠一个都不能少!!!
// java代码,注意转义
String strCmdLine = " …ext='%{localtimne\\:%H\\\\\\:%M\\\\\\:%S}'… ";
// cpp,注意转义
char strCmdLine[1024]= {0};
strcpy(strCmdLine, " …xt='%{localtime\\:%H\\\\\\:%M\\\\\\:%S}'… " );
11、视频旋转
旋转有种做法,第一种是在配置元数据上添加属性,视频原始内容不产生任何的改变,转换效率高,但是解码渲染效率有所降低。// -90 顺时针
ffmpeg -i \test\guide.mp4 -metadata:s:v rotate="-90" -codec copy \test\meta_rotate_-90.mp4// 90 逆时针
ffmpeg -i \test\guide.mp4 -metadata:s:v rotate="90" -codec copy \test\meta_rotate_90.mp4第二种,直接改变输入视频的显示内容,转换过程较慢;转换后的解码渲染效率没有任何变化。// 0: 逆时针旋转90度并垂直翻转
ffmpeg -i \test\guide.mp4 -vf "transpose=0" \test\transpose_0.mp4// 1: 顺时针旋转90度
ffmpeg -i \test\guide.mp4 -vf "transpose=1" \test\transpose_1.mp4// 2: 逆时针旋转90度
ffmpeg -i \test\guide.mp4 -vf "transpose=2" \test\transpose_2.mp4// 3: 顺时针旋转90度后并垂直翻转
ffmpeg -i \test\guide.mp4 -vf "transpose=3" \test\transpose_3.mp4// 4: 水平翻转视频画面
ffmpeg -i \test\guide.mp4 -vf hflip guide_hflip.mp4// 5: 垂直翻转视频画面
ffmpeg -i \test\guide.mp4 -vf vflip guide_vflip.mp4
12.视频提取图片注意事项
ffmpeg -i test.avi -r 1 -f image2 image- %3d.jpeg
// -r 1 每秒一帧,提取视频图像。
ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec copy -acodec copy output.avi
// -ss 开始时间,-t 持续时间
// 从10s 处开始剪切,持续15秒(此方法有时候会遇到视频第一帧黑屏, 就是未播放时候的封面是黑色的,原因是未定位到关键帧1帧)
ffmpeg -i test.mp4 -ss 10 -t 15 -codec copy cut.mp4
// 从10s处开始剪切,持续15秒(此方法为优化后的方法,此剪切视频的方法可以解决第一帧黑屏问题,但是可能切割的时间落点稍稍的有一丢丢的不准确,但是应该可以落在误差范围之内)
ffmpeg -ss 10 -t 15 -i test.mp4 -codec copy cut.mp4
// 注意事项:如果 视频文件很大,2GB, duration: 02:00:00
前: -i xxx.mp4 -ss 01:10:05 -t 00:15:20,大视频会很慢,因为需要解码整个视频,然后定位时间点
后: -ss 01:10:05 -t 00:15:20 -i xxx.mp4,较快,因为是seekto
13.音视频倒放,加速减速播放
// 视频倒放 音频不变
ffmpeg -i \test\guide.mp4 -vf reverse \test\guide_v_reverse.mp4// 音频倒放 视频不变
ffmpeg -i \test\guide.mp4 -c:v copy -af areverse \test\guide_a_reverse.mp4// 音视频同时倒放 -preset superfast 快速编码,视频质量有所下降
ffmpeg -i \test\guide.mp4 -vf reverse -af areverse -preset superfast \test\guide_av_reverse.mp4// 减速播放,pts增加为原来的2倍,声音为原来的0.5倍速
ffmpeg -i \test\guide.mp4 -vf setpts=PTS*2 -af atempo=0.5 \test\guide_speed0.5.mp4// 加速播放,pts缩短为原来的1/2,声音为原来的2倍速
ffmpeg -i \test\guide.mp4 -vf setpts=PTS*0.5 -af atempo=2 \test\guide_speed2.mp4
14.视频拼接
以ts流为媒介,因为ts流是可以concate的,先把mp4封装成ts,然后再用concate指令合并ts流,最后再把ts流拼接为mp4。
// 内容复习,-vbsf h264_mp4toannexb,在I帧前都带上sps和ppsffmpeg -i 10s.mp4 -vcodec libx264 -acodec aac -vbsf h264_mp4toannexb 10s.tsffmpeg -i guide.mp4 -vcodec libx264 -acodec aac -vbsf h264_mp4toannexb guide.tsffmpeg -i "concat:\test\10s.ts|\test\guide.ts" -acodec copy -vcodec copy -absf aac_adtstoasc \test\concat_10s_guide.mp4将AAC码流转换成一些其他格式时,需要特殊配置码流滤波器(-absf aac_adtstoasc)将AAC编码器编码后的原始码流(ADTS头 + ES流)封装为MP4或者FLV或者MOV等格式时,需要先将ADTS头转换为MPEG-4 AudioSpecficConfig (将音频相关编解码参数提取出来),并将原始码流中的ADTS头去掉(只剩下ES流)
15.视音频合并
两个视频的合并(注意参数hstack 代表是横向合并,也就是左右合并,横向合并的形象类比为“川”; 如果是竖向合并,也就是上下合并,用参数vstack,竖向或者纵向合并的形象类比为“三”)
注意:经过此命令处理后的视频output.mp4只会保留第一个视频input1.mp4的音频
ffmpeg -i input1.mp4 -i input2.mp4 -lavfi hstack output.mp4
ffmpeg -i input1.mp4 -i input2.mp4 -lavfi vstack output.mp4
把音频文件mp3 合并到视频文件mp4中去(就是为原视频加背景音乐)
ffmpeg -i video.mp4 -i bg_music.mp3 -c:v copy -c:a aac -strict experimental merge.mp4
15、视频区域裁剪
ffmpeg -i \test\guide.mp4 -vf crop=400:400:0:0 -y \test\guide_crop.mp4
指令crop的参数格式为w:h:x:y;w、h为输出视频的宽和高,x、y标记输入视频中的某点,将该点作为基准点,向右下进行裁剪得到输出视频。如果xy不写的话,默认居中剪切。
16、视频缩放
// 将视频宽高度放大一倍
ffmpeg -i \test\guide.mp4 -vf scale=iw*2:ih*2 \test\guide_scale2.mp4
// 将视频宽高缩小一半
ffmpeg -i \test\guide.mp4 -vf scale=iw*0.5:ih*0.5 \test\guide_scale0.5.mp4
游戏特色
1、视频采集功能
- 该软件是在Linux下开发出来的,但它可以在包括Windows在内的大多数操作系统中编译。这个项目是由Fabrice Bellard发起的,现在由Michael Niedermayer主持。
- 视频采集功能非常强大,不仅可以采集视频采集卡或USB摄像头的图像,还可以进行屏幕录制,同时还支持以RTP方式将视频流传送给支持RTSP的流媒体服务器,支持直播应用。
2、在Linux下的视频采集
- 在Linux平台上,该软件对V4L2的视频设备提高了很好的支持,如:./ffmpeg -t 10 -f video4linux2 -s 176*144 -r 8 -i /dev/video0 -vcodec h263 -f rtp rtp://192.168.1.105:5060 > /tmp/ffmpeg.sdp
- 以上命令表示:采集10秒钟视频,对video4linux2视频设备进行采集,采集QCIF(176*144)的视频,每秒8帧,视频设备为/dev/video0,视频编码为h263,输出格式为RTP,后面定义了IP地址及端口,将该码流所对应的SDP文件重定向到/tmp/ffmpeg.sdp中,将此SDP文件上传到流媒体服务器就可以实现直播了。
3、在windows下的视频采集
- 在windows下关于视频采集的资料非常少,但是它还是支持windows下视频采集的。支持windows下video for windows(VFW)设备的视频采集,不过VFW设备已经过时,正在被WDM的视频设备所取代,但是该软件还没有支持WDM的计划,不过好像有将WDM转为VFW的工具,因此还是可以在windows下进行视频采集的。
4、视频格式转换功能
- 视频格式转换,比如可以将多种视频格式转换为flv格式,可不是视频信号转换 。
- 该软件可以轻易地实现多种视频格式之间的相互转换(wma,rm,avi,mod等),例如可以将摄录下的视频avi等转成现在视频网站所采用的flv格式。
5、视频截图功能
- 对于选定的视频,截取指定时间的缩略图。视频抓图,获取静态图和动态图,不提倡抓gif文件;因为抓出的gif文件大而播放不流畅
6、给视频加水印功能
- 使用ffmpeg 视频添加水印(logo)。