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 数据流库, 是libtheoralibvorbis 的依赖
安装方法

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命令参数学习总结

你可能感兴趣的:(FFmpeg 编译, 转码)