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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容

  • 前言 如此强大的FFmpeg,能够实现视频采集、视频格式转化、视频截图、视频添加水印、视频切片、视频录制、视频推流...
    骚之哈塞給阅读 25,553评论 6 39
  • 前言 如此强大的FFmpeg,能够实现视频采集、视频格式转化、视频截图、视频添加水印、视频切片、视频录制、视频推流...
    sillen阅读 5,308评论 2 46
  • 1.分离视频音频流 ffmpeg -i input_file -vcodec copy -an output_fi...
    XLAccount阅读 3,017评论 0 8
  • 前言 如此强大的FFmpeg,能够实现视频采集、视频格式转化、视频截图、视频添加水印、视频切片、视频录制、视频推流...
    RichyLeo阅读 17,245评论 1 22
  • 本周李笑来在得到APP《通往财富自由之路》专栏中分享了为什么要学会写作的文章。针对留言区的讨论,李笑来每天选择部分...
    舍非阅读 431评论 0 0