FFmpeg 编译, 转码
ffmpeg
本文的运行环境为全新安装的 centos 7.4
安装/编译依赖
编译和下载源码包, 需要一些依赖工具, 执行以下命令安装
yum install autoconf automake bzip2 cmake freetype-devel gcc gcc-c++ git libtool make mercurial pkgconfig zlib-devel
除此之外, 还需要一些其他工具, 需要手动编译
在此之前, 可以在家目录下新建一个文件夹用于存放所有源代码
mkdir ~/ffmpeg_sources
NASM
一个汇编编译器, 安装方法
cd ~/ffmpeg_sources
curl -O -L http://www.nasm.us/pub/nasm/releasebuilds/2.13.01/nasm-2.13.01.tar.bz2
tar xjvf nasm-2.13.01.tar.bz2
cd nasm-2.13.01
./autogen.sh
./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin"
make
make install
Yasm
另一个汇编编译器, 安装方法
cd ~/ffmpeg_sources
curl -O -L http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
tar xzvf yasm-1.3.0.tar.gz
cd yasm-1.3.0
./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin"
make
make install
libx264
H.264 的视频编码器, 如果需要使用的话, 在编译 ffmpeg 中需要添加参数 --enable-gpl
--enable-libx264
安装方法
cd ~/ffmpeg_sources
git clone --depth 1 http://git.videolan.org/git/x264
cd x264
PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-static
make
make install
注意, 如果出现类似Found no assembler. Minimum version is nasm-2.13
的错误, 可能是由于系统内置了nasm, 需要卸载, 卸载方法yum remove nasm && hash -r
libx265
H.265/HEVC 的视频编码器, 如果需要使用的话, 在编译 ffmpeg 中需要添加参数 --enable-gpl
--enable-libx265
安装方法
cd ~/ffmpeg_sources
hg clone https://bitbucket.org/multicoreware/x265
cd ~/ffmpeg_sources/x265/build/linux
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" -DENABLE_SHARED:bool=off ../../source
make
make install
libfdk_aac
AAC 音频解码器, 如果需要使用的话, 在编译 ffmpeg 中需要添加参数 --enable-libfdk_aac
, 如果添加了 --enable-gpl
参数, 还需要同时使用 --enable-nonfree
参数
安装方法
cd ~/ffmpeg_sources
git clone --depth 1 https://github.com/mstorsjo/fdk-aac
cd fdk-aac
autoreconf -fiv
./configure --prefix="$HOME/ffmpeg_build" --disable-shared
make
make install
libmp3lame
MP3 音频解码器, 如果需要使用的话, 在编译 ffmpeg 中需要添加参数 --enable-libmp3lame
安装方法
cd ~/ffmpeg_sources
curl -O -L http://downloads.sourceforge.net/project/lame/lame/3.100/lame-3.100.tar.gz
tar xzvf lame-3.100.tar.gz
cd lame-3.100
./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --disable-shared --enable-nasm
make
make install
libopus
Opus 音频编解码器, 如果需要使用的话, 在编译 ffmpeg 中需要添加参数 --enable-libopus
安装方法
cd ~/ffmpeg_sources
curl -O -L https://archive.mozilla.org/pub/opus/opus-1.2.tar.gz
tar xzvf opus-1.2.tar.gz
cd opus-1.2
./configure --prefix="$HOME/ffmpeg_build" --disable-shared
make
make install
libogg
Oog 数据流库, 是libtheora
和 libvorbis
的依赖
安装方法
cd ~/ffmpeg_sources
curl -O -L http://downloads.xiph.org/releases/ogg/libogg-1.3.2.tar.gz
tar xzvf libogg-1.3.2.tar.gz
cd libogg-1.3.2
./configure --prefix="$HOME/ffmpeg_build" --disable-shared
make
make install
libvorbis
Vorbis 音频解码器, 依赖 libogg
, 如果需要使用的话, 在编译 ffmpeg 中需要添加参数 --enable-libvorbis
cd ~/ffmpeg_sources
curl -O -L http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.5.tar.gz
tar xzvf libvorbis-1.3.5.tar.gz
cd libvorbis-1.3.5
./configure --prefix="$HOME/ffmpeg_build" --with-ogg="$HOME/ffmpeg_build" --disable-shared
make
make install
libvpx
VP8/VP9 视频编解码器, 如果需要使用的话, 在编译 ffmpeg 中需要添加参数 --enable-libvpx
cd ~/ffmpeg_sources
git clone --depth 1 https://chromium.googlesource.com/webm/libvpx.git
cd libvpx
./configure --prefix="$HOME/ffmpeg_build" --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm
make
make install
编译 FFMpeg
cd ~/ffmpeg_sources
curl -O -L https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2
tar xjvf ffmpeg-snapshot.tar.bz2
cd ffmpeg
这里需要编辑 configure 文件
找到 enabled libmp3lame .... 这一行, 在后面添加 -lm
enabled libmp3lame && require "libmp3lame >= 3.98.3" lame/lame.h lame_set_VBR_quality -lmp3lame -lm
否则会出现ERROR: libmp3lame >= 3.98.3 not found
错误
参考资料Stack overflow: ERROR: libmp3lame >= 3.98.3 not found
之后继续编译
PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \
--prefix="$HOME/ffmpeg_build" \
--pkg-config-flags="--static" \
--extra-cflags="-I$HOME/ffmpeg_build/include" \
--extra-ldflags="-L$HOME/ffmpeg_build/lib" \
--extra-libs=-lpthread \
--bindir="$HOME/bin" \
--enable-gpl \
--enable-libfdk_aac \
--enable-libfreetype \
--enable-libmp3lame \
--enable-libopus \
--enable-libvorbis \
--enable-libvpx \
--enable-libx264 \
--enable-libx265 \
--enable-nonfree
make
make install
hash -r
编译完成后, 会生成ffmpeg
, ffprobe
, ffserver
三个程序, ffmpeg
是转码程序, ffprobe
可以用来分析视频文件, ffserver
可以实现流媒体服务器。
如果不需要 ffserver
, 可以添加 --disable-ffserver
常用命令
查看支持的格式
ffmpeg -formats
视频获取封面/截图/关键帧
ffmpeg -y -i "/root/test/haier.mp4" -f image2 -vframes 1 "/root/test/output/haier_cover.jpg"
指定尺寸
默认情况生成的封面为原视频尺寸, 如果需要修改生成的图片大小, 可以指定 scale 滤镜
拉伸缩放
如果要生成指定尺寸的, 如320*480 像素的图片, 可以用这个命令, 图片会被拉伸
ffmpeg -y -i "/root/test/haier.mp4" -vf "scale=w=320:h=480" -f image2 -frames:v 1 "/root/test/output/haier_cover.jpg"
比例缩放, 适应
如果需要不拉伸, 缩放方式为最大化保留图片, 如最终生成的图片为: 320 * 256, 则可以用这个命令
ffmpeg -y -i "/root/test/haier.mp4" -vf "scale=w=320:h=480:force_original_aspect_ratio=decrease" -f image2 -frames:v 1 "/root/test/output/haier_cover.jpg"
如果需要在空白地方加上黑边, 可以使用命令
ffmpeg -y -i "/root/test/haier.mp4" -vf "scale=w=320:h=480:force_original_aspect_ratio=decrease,pad=x=(ow-iw)/2:y=(oh-ih)/2:w=320:h=480" -f image2 -frames:v 1 "/root/test/output/haier_cover.jpg"
比例缩放, 裁剪
如果不需要拉伸, 缩放方式为最大化填充尺寸, 超出部分自动裁掉, 可以使用命令:
ffmpeg -y -i "/root/test/haier.mp4" -vf "scale=w=320:h=480:force_original_aspect_ratio=increase,crop=320:480" -f image2 -frames:v 1 "/root/test/output/haier_cover.jpg"
指定时间截图
ffmpeg -y -ss 50 -i "/root/test/haier.mp4" -f image2 -vframes 1 "/root/test/output/haier_cover.jpg"
命令中 -ss 50 表示在50秒位置截图, 时间格式为 hh:mm:ss[.xxx].
注意: -ss 参数要放在 -i 参数之前
截多张图(关键帧)
注意: 关键帧任务非常费时
按固定间隔时间
如隔35秒一次, 使用 fps 滤镜
ffmpeg -y -i "/root/test/haier.mp4" -vf "fps=1/35" "/root/test/output/haier_keyframe%04d.jpg"
关键帧
ffmpeg -i "/root/test/haier.mp4" -vf "select=eq(pict_type\,I)" -vsync vfr "/root/test/output/haier_keyframe%04d.jpg"
视频转码
x264
使用 libx264 编码视频轨道, 使用 aac 编码音频轨道
ffmpeg -i "/root/test/haier.mp4" -c:v libx264 -preset veryfast -crf 23.5 -c:a libfdk_aac -b:a 128k "/root/test/output/haier_veryfast_x264.mp4"
-preset
参数可选的有ultrafast, superfast, veryfast, faster, fast, medium(默认值), slow, slower, veryslow" 最后生成的文件依次变小, 但是耗时依次变大
-crf
值越小则输出画面越接近输入画面, 压缩率越低, 值越大则输出画面压缩越厉害, 压缩率越高, 不要超过28. 建议值23.5
x265
libx265 与libx264 参数类似, 压缩后, 视频体积更小, 相对的, 压缩时间也较x264 长很多. 此外 crf 参数建议为 28.
ffmpeg -i "/root/test/haier.mp4" -c:v libx265 -preset ultrafast -crf 28 -c:a libfdk_aac -b:a 128k "/root/test/output/haier_ultrafast_x265.mp4"
音频转码
AAC
固定码率
参数为 -b:a, 建议每个声道取值64kBit/s, 即单声道音频编码率取64k, 立体声取值128k....
ffmpeg -y -i "/root/test/sunshine.mp3" -c:a libfdk_aac -b:a 128k "/root/test/output/sunshine_libfdkacc_128k.m4a"
可变码率
VBR | kbps/channel |
---|---|
1 | 20-32 |
2 | 32-40 |
3 | 48-56 |
4 | 64-72 |
5 | 96-112 |
参数为 -vbr, 取值范围为 1 - 5, 值越小, 效果越差, 每个声道的码率对应如下所示
VBR | kbps/channel |
---|---|
1 | 20-32 |
2 | 32-40 |
3 | 48-56 |
4 | 64-72 |
5 | 96-112 |
ffmpeg -y -i "/root/test/sunshine.mp3" -c:a libfdk_aac -vbr 3 "/root/test/output/sunshine_libfdkacc_2.m4a"
MP3
可编码率
参数 -qscale:a 控制了转码后的音频质量, 取值范围 0 - 9, 值越低, 质量越好, 建议值为4, 此时文件尺寸和音质较为平衡, 最大值建议不超过6
ffmpeg -i "/root/test/sunshine.mp3" -codec:a libmp3lame -qscale:a 2 "/root/test/output/sunshine_libmp3lame_2.mp3"
固定码率
参数为 -b:a
mp3 也支持固定码率, 可使用的码率为 8, 16, 24, 32, 40, 48, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320
建议码率设置低于320k, 过高的值对音质提升不明显
ffmpeg -i "/root/test/sunshine.mp3" -codec:a libmp3lame -b:a 128k "/root/test/output/sunshine_libmp3lame_2.mp3"
媒体信息
以 json 方式输出文件信息
ffprobe -v quiet -print_format json -show_streams haier.mp4
参考资料
在Ubuntu Server上编译FFmpeg
官方编译指南
linux 源码编译指南
I‑frame & P‑frame & B‑frame
How to extract all key frames from a video clip?
Create a thumbnail image every X seconds of the video
【教程】x264常用参数科普+详解【教你压出高清画质】
FFMpeg H.264 编码
FFMpeg H.265 编码
FFMpeg AAC 编码
FFMpeg MP3 编码
ffprobe命令参数学习总结