FFmpeg是目前最牛逼的开源跨平台音视频处理工具。html
我不是音视频编解码出身的,对于这一块很是的不了解,致使在学习FFmpeg的时候云里雾里的,因此学习以前最好看些资料对音视频编解码有点认识。html5
Windows和MacOS用户能够从Builds - Zeranoe FFmpeg下载编译好的FFmpeg,解压加入环境变量PATH便可使用。git
同时安装包我上传到百度云中,还有一些测试用的视频:连接: https://pan.baidu.com/s/1nwLh4hF 密码: v7ytgithub
学习FFmpeg免不了要看效果,而windows的自带播放器又垃圾得一匹,并且咱们会须要看视频的元数据,看他的编码,用通常的这播放器,能看可是不是很方便。其实FFmpeg自带了一个播放器FFplay!web
FFplay是结合FFmpeg和SDL实现的一个简易的跨平台播放器。使用起来特别简单:json
ffplay [选项] ['输入文件']复制代码
并且控制台会打印出视频的各类信息,对于咱们查看视频转换结果很是有帮助。c#
FFplay具体文档:windows
FFplay命令中会打印出视频的元数据,那若是咱们只是想获取这些数据而不想播放视频呢?好比在程序中咱们想获取视频的时长,要用什么命令?用FFprobe命令。网络
ffprobe [选项] ['输入文件']复制代码
看输出必定以为很熟悉,由于和FFplay打印出的信息如出一辙:ide
咱们还可使用一些参数:
-v quiet
:不打印日志,这样默认的输出就不会显示了,就不会干扰咱们想要输出的信息 -print_format json
:用JSON格式打印出信息。还支持xml,csv,flat,ini格式 -show_format
:打印出输入的格式信息 -show_streams
:打印出每一个流的信息 默认的输出是比较简略的,咱们可使用-show_format
和-show_streams
打印出咱们想要的详细信息,好比:
ffprobe -v quiet -show_format -print_format json res\BCSPA039_pre.mp4复制代码
而后咱们程序读取解析json,获取duration字段就是视频的时长。
ffmpeg命令的语法:
ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...复制代码
ffmepg支持多个输入源(文件,管道,网络流,采集设备),经过-i
指定输入。ffmpeg支持多个输出,命令行中全部没法被解析为参数的字段都会被做为输出的url。
参数通常做用于且只做用于下一个指定的文件,因此参数的位置是很是重要的。因此全局生效的参数要在最前面。
ffmpeg命令完整的说明参考:
ffmpeg的参数太多了,咱们仍是经过经常使用命令来学习会比较好。
ffmpeg -i input_file -vcodec copy -an output_file_video //只输出视频
ffmpeg -i input_file -acodec copy -vn output_file_audio //分输出音频复制代码
参数解释:
-i
:指定输入文件 -vcodec
:指定视频编码器,这里指定copy是一个特殊值,表示复制输入的视频流到输出不作更改 -an
:关闭音频输出 -vn
:关闭视频输出 ffmpeg -i input_file output_file复制代码
这是最简单的视频转码命令,ffmpeg会从input的内容推测格式,从output_file的后缀名推测格式,而后进行转码输出。
来看一个我在工做中接触的比较复杂的视频转码命令:
ffmpeg -i "#src#" -y -s 1920x1080 -vcodec libx264 -c:a libvo_aacenc -b:a 48k -ar 44100 -ac 2 -qscale 4 -f #targetFmt# -movflags faststart -map 0:v:0 -map 0:a? "#destDir#/1080p/#fileNameNoEx#.mp4"复制代码
参数解释:
-y
:覆盖输出文件 -s 1920x1080
:设置帧的大小,也就是视频分辨率,格式为WxH
-vcodec libx264
:设置视频编码器,-codec:v libx264
是另一种写法 -c:a libvo_aacenc
:设置音频编码器 -b:a 48k
:设置音频的比特率 -ar 44100
:设置音频采样率为44100 -ac 2
:设置声道数 -f #targetFmt#
:设定输出的格式。若是不指定,则会输入文件从内容中推测,输出文件经过后缀名推测。 -movflags faststart
:把MOV/MP4文件的索引信息放到文件前面以支持边下边播 -map 0:v:0
:选择输入文件的第一个视频流输出 -map 0:a?
:选择输入文件的音频流输出,若是没有不报错 qscale <数值>
以 <数值> 质量为基础的VBR,取值0.01-255,越小质量越好
在mp4转ogv的时候,若是没有指定-qscale 4
,转出来的视频画面比较差,有不少噪点,并且有卡顿。
指定时间截取一帧做为输出:
ffmpeg -i input.flv -ss 00:00:14.435 -vframes 1 out.png复制代码
参数解释:
-ss
:若是做用于输入文件表示seek输入文件到这个位置,可是不少格式不支持seek的,因此只能作个大概。若是做用于输出文件,则输入会被解码,可是指定时间以前的数据都会被忽略。这里是做用于输出文件,因此至关于00:00:14.435以前的内容都被忽略了 -vframes 1
:指定输出多少帧,这里就输出一帧。-vframes
是-frames:v
的别名。 每隔一段时间截一张图:
# 每一秒输出一帧图像为图片, 图片命名为 out1.png, out2.png, out3.png,依次顺序输出:
ffmpeg -i input.flv -vf fps=1 out%d.png
# 每一分钟截一次图, 命名 img001.jpg, img002.jpg, img003.jpg, 依次顺序递增:
ffmpeg -i myvideo.avi -vf fps=1/60 img%03d.jpg
# 每十分钟输出一张图片:
ffmpeg -i test.flv -vf fps=1/600 thumb%04d.bmp复制代码
参数解释:
-vf fps=1
:设置视频的filter为fps。后面参数表示一秒几帧。这里设置为1,表示一秒一帧。-vf
是-filter:v
的别名 out%d.png
:输出多个图片,%d
占位符表示数字,从1开始。还可使用%2d
指定固定两位 fps过滤器的文档:fps Documentation
在学习ffmpeg的过程当中,阅读了几篇很是好的博客,而后发现做者都是雷霄骅。没想到他居然在2016年的时候去世了。唉,又是一个业内悲剧,并且他居然是在大学里猝死的,真的是太拼了。努力虽好,也得注意身体啊。
这里引用如何看待雷霄骅之死?里的一句话
天妒英才,不夸张的说,若是不知道雷霄骅,可能你音视频还没入门
的确,他的文章对我入门使用ffmpeg起了很大的帮助。谢谢雷神,一路走好。
网上随便找的能下载到小容量视频而且多种格式的网站:
本文独立博客地址:FFmpeg笔记-基本使用 | 木杉的博客