ffmpeg下载安装
源码下载地址: 源码下载
下载后解压,执行编译命令:
./configure --enable-shared --prefix=/monchickey/ffmpeg --disable-yasm
make
make install
由于缺少其他库导致安装失败,用apt-get install安装需要的插件即可。
ffmpeg基础
ffmpeg -version //版本
ffmpeg -hide_banner //只显示有用信息
容器:
视频文件本身其实是一个容器(container),里面包括了视频和音频,也可能有字幕等其他内容。一般来说,视频文件的后缀名反映了它的容器格式。
常见的容器格式有以下几种:mp3,mp4,aac,ac3,eac3,avi,wav等
指令:ffmpeg -formats -hide_banner
$ ffmpeg -formats -hide_banner
File formats:
D. = Demuxing supported
.E = Muxing supported
muxer 是合并将视频文件、音频文件和字幕文件合并为某一个视频格式。
demuxer 解封装用的
编码格式:
视频和音频都需要经过编码,才能保存成文件。不同的编码格式(CODEC),有不同的压缩率,会导致文件大小和清晰度的差异。
常见的编码格式:H.264,H.265,aac,mp3,
指令:ffmpeg -hide_banner -codecs
$ ffmpeg -hide_banner -codecs
Codecs:
D..... = Decoding supported
.E.... = Encoding supported
..V... = Video codec
..A... = Audio codec
..S... = Subtitle codec
...I.. = Intra frame-only codec
....L. = Lossy compression
.....S = Lossless compression
编码器:
encoders是实现某种编码格式的库文件。只有安装了某种格式的编码器,才能实现该格式视频/音频的编码和解码。
指令:ffmpeg -hide_banner -encoders
$ ffmpeg -hide_banner -encoders
Encoders:
V..... = Video
A..... = Audio
S..... = Subtitle
.F.... = Frame-level multithreading
..S... = Slice-level multithreading
...X.. = Codec is experimental
....B. = Supports draw_horiz_band
.....D = Supports direct rendering method 1
同样的,既然有encoders,就有decoders
FFmpeg 的使用格式:
$ ffmpeg {1} {2} -i {3} {4} {5}
上面命令中,五个部分的参数依次如下:
全局参数
输入文件参数
输入文件
输出文件参数
输出文件
参数太多的时候,为了便于查看,ffmpeg 命令可以写成多行
$ ffmpeg \
[全局参数] \
[输入文件参数] \
-i [输入文件] \
[输出文件参数] \
[输出文件]
常用命令行参数:
-c:指定编码器
-c copy:直接复制,不经过重新编码(这样比较快)
-c:v:指定视频编码器
-c:a:指定音频编码器
-i:指定输入文件
-an:去除音频流
-vn: 去除视频流
-preset:指定输出的视频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。
-y:不经过确认,输出时直接覆盖同名文件。
ffmpeg常见操作
查看文件信息
$ ffmpeg.exe -hide_banner -i Horizon_UHD_TrueHD_DD+.mp4
Metadata:
major_brand : mp42
minor_version : 1
compatible_brands: mp42dby1isom
creation_time : 2016-11-19T01:52:12.000000Z
Duration: 00:02:08.32, start: 0.000000, bitrate: 40920 kb/s
Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 3840x2160, 37740 kb/s, 24 fps, 24 tbr, 24 tbn, 48 tbc (default)
Metadata:
creation_time : 2016-11-19T01:52:12.000000Z
handler_name : video handler
Stream #0:1(und): Audio: truehd (mlpa / 0x61706C6D), 48000 Hz, 7.1, s32 (24 bit), 6641 kb/s (default)
Metadata:
creation_time : 2016-11-19T01:52:12.000000Z
handler_name : sound handler
Stream #0:2(und): Audio: eac3 (ec-3 / 0x332D6365), 48000 Hz, 5.1(side), fltp, 640 kb/s
Metadata:
creation_time : 2016-11-19T01:52:12.000000Z
handler_name : sound handler
Side data:
audio service type: main
Metadata: (容器格式)
一共三个stream,一个Video,两个Audio
Video格式: h264 YUV格式存储 分辨率3840x2160 帧率24fps
Audio 1格式: truehd 48K采样率 7.1声道 24bit
Audio 2格式: eac3 48K采样率 5.1声道
转换编码格式
$ ffmpeg -i [input.file] -c:v libx265 output.mp4
转换视频编码格式为H265
转换容器格式
ffmpeg -i input.mp4 -c copy output.avi
转换容器为avi格式,音频和视频编码格式不变
调整码率
调整码率(transrating)指的是,改变编码的比特率,一般用来将视频文件的体积变小。
下面的例子指定码率最小为964K,最大为3856K,缓冲区大小为 2000K。
$ ffmpeg \
-i input.mp4 \
-minrate 964K -maxrate 3856K -bufsize 2000K \
output.mp4
改变分辨率(transsizing)
将文件视频分辨率从 1080p 转为 480p
$ ffmpeg \
-i input.mp4 \
-vf scale=480:-1 \
output.mp4
提取音频
文件音频编码格式为aac,提取出来
$ ffmpeg \
-i input.mp4 \
-vn -c:a copy \
output.aac
添加音轨
添加音轨(muxing)指的是,将外部音频加入视频,比如添加背景音乐或旁白。
$ ffmpeg \
-i input.aac -i input.mp4 \
output.mp4
裁剪
裁剪(cutting)指的是,截取原始视频里面的一个片段,输出为一个新视频。可以指定开始时间(start)和持续时间(duration),也可以指定结束时间(end)。
$ ffmpeg -ss [start] -i [input] -t [duration] -c copy [output]
$ ffmpeg -ss [start] -i [input] -to [end] -c copy [output]
为音频添加封面
有些视频网站只允许上传视频文件。如果要上传音频文件,必须为音频添加封面,将其转为视频,然后上传。
下面命令可以将音频文件,转为带封面的视频文件。
$ ffmpeg \
-loop 1 \
-i cover.jpg -i input.mp3 \
-c:v libx264 -c:a aac -b:a 192k -shortest \
output.mp4