土豆不好吃

自行编译ffmpeg并压制带字幕的视频、一键编译non-free ffmpeg

文章目录[显示]
这篇文章在 2017年09月29日10:09:47 更新了哦~

有点不好意思啊此文无图... 还有这个字体咋样呀  

一键编译脚本在第三页

话说很久之前,人人影视放出来了一个压片工具,总共有192M的样子,而且只能在Windows上运行。对于我等Linux党,这可怎么行呢?于是我就想到了ffmpeg这个万能的神器。当然了ffmpeg作为自由软件,你从包管理器里安装的、直接configure编译的,是不会带libx264

这类非自由软件,自然想要压制影片就不是那么好玩了……

那既然酱紫,我们就只好手动编译一个non-free的ffmpeg,然后再来使用嘛!

这种压片的方法是把字幕混到视频流中,也就是说视频最终是音频流+视频流,是没有字幕流的,字幕已经是视频的一部分了。这也可以极大程度上的避免盗字幕的行为。

懒虫们,假如你们真的懒得看这么长的文章,并且你确定你的发行版是比较新的发行版,那么请直接翻到本文最后看"一键式编译教程"吧!

准备特效字体

有很多字幕都是用了自定义字体,请记得给你的发行版安装对应的字体呀!桌面版直接双击安装即可。如果是服务器版,把字体复制到/usr/share/fonts/truetype和原来字体一样的位置,或者新建个winFonts目录便于区分也可以。

之后运行

sudo apt install fontconfig
sudo fc-cache –fv

运行fc-list可以看到已安装字体列表

查看中文字体,可以使用

sudo fc-list :lang=zh

并且请注意编码格式的问题,Linux一般使用UTF-8而Windows则是GB2312

 

编译安装ffmpeg

我使用的是Ubuntu,所以这里我就按照官网提供的教程编译啦!

安装必备依赖

sudo apt-get update
sudo apt-get -y install autoconf automake build-essential libass-dev libfreetype6-dev \
libsdl1.2-dev libtheora-dev libtool libva-dev libvdpau-dev libvorbis-dev libxcb1-dev libxcb-shm0-dev \
libxcb-xfixes0-dev pkg-config texinfo zlib1g-dev


注意,如果是服务器版Ubuntu,可以把第二步替换成如下(你装原来的也行,反正是ffplay和X11的依赖……)
sudo apt-get -y install autoconf automake build-essential libass-dev libfreetype6-dev \
libtheora-dev libtool libvorbis-dev pkg-config texinfo zlib1g-dev

创建一个用来下载源码的目录

mkdir ~/ffmpeg_sources

编译与安装

yasm

如果你的包管理器里的yasm版本号>=1.2.0,那就可以用包管理器安装

(使用sudo apt search yasm查看版本号,就想编译的,我也没意见)

sudo apt-get install yasm

否则请编译安装

cd ~/ffmpeg_sources
wget 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
make distclean

libx264

如果你的包管理器里的libx264版本号>=0.118,那就是用包管理器安装

sudo apt-get install libx264-dev

否则需要编译安装

cd ~/ffmpeg_sources
wget http://download.videolan.org/pub/x264/snapshots/last_x264.tar.bz2
tar xjvf last_x264.tar.bz2
cd x264-snapshot*
PATH="$HOME/bin:$PATH" ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-static --disable-opencl
PATH="$HOME/bin:$PATH" make
make install
make distclean

libx265

只能选择编译安装啦。

sudo apt-get install cmake mercurial
cd ~/ffmpeg_sources
hg clone https://bitbucket.org/multicoreware/x265
cd ~/ffmpeg_sources/x265/build/linux
PATH="$HOME/bin:$PATH" cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" -DENABLE_SHARED:bool=off ../../source
make
make install

libfdk-aac

如果你的包管理器中有libfdk-aac-dev,那就可以使用包管理器安装(没有版本需求)

sudo apt-get install libfdk-aac-dev

否则需要编译安装

cd ~/ffmpeg_sources
wget -O fdk-aac.tar.gz https://github.com/mstorsjo/fdk-aac/tarball/master
tar xzvf fdk-aac.tar.gz
cd mstorsjo-fdk-aac*
autoreconf -fiv
./configure --prefix="$HOME/ffmpeg_build" --disable-shared
make
make install
make distclean

ibmp3lame

如果你的包管理器中有ibmp3lame,版本号>=3.98.3,那么你可以使用包管理器安装

sudo apt-get install libmp3lame-dev

否则需要编译安装

sudo apt-get install nasm
cd ~/ffmpeg_sources
wget http://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz
tar xzvf lame-3.99.5.tar.gz
cd lame-3.99.5
./configure --prefix="$HOME/ffmpeg_build" --enable-nasm --disable-shared
make
make install
make distclean

libopus

如果你的包管理中有libopus,版本号>=1.1,那你可以使用包管理器安装

sudo apt-get install libopus-dev

否则需要编译安装。

cd ~/ffmpeg_sources
wget http://downloads.xiph.org/releases/opus/opus-1.1.2.tar.gz
tar xzvf opus-1.1.2.tar.gz
cd opus-1.1.2
./configure --prefix="$HOME/ffmpeg_build" --disable-shared
make
make install
make clean

libvpx

只能编译安装(注意,这个链接是在Google的服务器上,如果服务器在国内下载不回来,就自己翻墙下载然后上传到服务器吧)

cd ~/ffmpeg_sources
wget http://storage.googleapis.com/downloads.webmproject.org/releases/webm/libvpx-1.5.0.tar.bz2
tar xjvf libvpx-1.5.0.tar.bz2
cd libvpx-1.5.0
PATH="$HOME/bin:$PATH" ./configure --prefix="$HOME/ffmpeg_build" --disable-examples --disable-unit-tests
PATH="$HOME/bin:$PATH" make
make install
make clean

编译ffmpeg

耗时可能会比较长

cd ~/ffmpeg_sources
wget http://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2
tar xjvf ffmpeg-snapshot.tar.bz2
cd ffmpeg
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" \
--bindir="$HOME/bin" \
--enable-gpl \
--enable-libass \
--enable-libfdk-aac \
--enable-libfreetype \
--enable-libmp3lame \
--enable-libopus \
--enable-libtheora \
--enable-libvorbis \
--enable-libvpx \
--enable-libx264 \
--enable-libx265 \
--enable-nonfree
PATH="$HOME/bin:$PATH" make
make install
make distclean
hash –r

注意:

1.如果你直接运行configure,将会是没有non-free软件的ffmpeg;官方的configure配置会在~下生成一个bin(编译之后安装就会在~/bin下)、ffmpeg_build目录;如果不喜欢,那就照猫画虎的改掉$HOME(记得都要改哦),make install的时候就到/bin啦!

2.在Ubuntu中,~/bin默认是被包含到PATH中的,所以当你注销-登录或者

source ~/.profile

之后可以从任何目录运行~/bin中的程序的。再不济,咱把~/bin里的拷贝到/bin里总可以吧?

3.如果需要安装man page,请运行

echo "MANPATH_MAP $HOME/bin $HOME/ffmpeg_build/share/man" >> ~/.manpath


我假设你已经编译好了ffmpeg,并且准备好了你的视频和字幕。

前面提过了,如果你的字幕中使用了自定义字体,请记得同时安装对应的字体!

并且,请注意字幕文件的编码格式,Linux通常会使用UTF-8无BOM,而Windows则是GB2312这类。为了避免出乱码,还是老老实实转换成UTF-8吧!

下一页我会介绍一些压片的方法,关于ffmpeg的更多方法,大家伙就自己搜索、看官方的文档、man page啦!

注意,压制过程中可能会出现这样的警告

Glyph 0x36C not found, selecting one more font for (YouYuan, 700, 0)

不要管他啦……只要是UTF-8编码的,会压出来的!
该看下一页啦~~

不改变视频、音频编码格式及参数,将字幕压制

ffmpeg –i Lantern.mp4-vf "ass=Lantern.ass" out.mp4

使用H264(AVC)重新编码视频、不改变其他参数,不改变音频编码格式

ffmpeg -i Lantern.mp4 -vcodec libx264 -preset fast -crf 20 -vf "ass=Lantern.ass" out.mp4

关于preset参数:

预设是一系列参数的集合,这个集合能够在编码速度和压缩率之间做出一个权衡。一个编码速度稍慢的预设会提供更高的压缩效率(压缩效率是以文件大小来衡量的)。这就是说,假如你想得到一个指定大小的文件或者采用恒定比特率编码模式,你可以采用一个较慢的预设来获得更好的质量。同样的,对于恒定质量编码模式,你可以通过选择一个较慢的预设轻松地节省比特率。

如果你很有耐心,通常的建议是使用最慢的预设。目前所有的预设按照编码速度降序排列为:
ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo默认为medium

如果你蒙圈了,那就这么说的,ultrafast处理的最快,但是文件大;placebo处理的慢,但是文件小;建议medium或者fast就可以了……有耐心的话,veryslow也够了。

crf(Constant Rate Factor)

该方法在输出文件的大小不太重要的时候,可以使整个文件达到特定的视频质量。该编码模式在单遍编码模式下提供了最大的压缩效率,每一帧可以按照要求的视频质量去获取它需要的比特数。不好的一面是,你不能获取一个特定大小的视频文件,或者说将输出位率控制在特定的大小上。

crf的参数值中,其中0为无损模式,23为缺省值,51可能是最差的。该数字越小,图像质量越好。从主观上讲,18~28是一个合理的范围。18往往被认为从视觉上看是无损的,它的输出视频质量和输入视频一模一样或者说相差无几。但从技术的角度来讲,它依然是有损压缩。

我觉得选择20就差不多啦~~

以H.264、Lame自定义参数重新编码、压制

ffmpeg -i Lantern.mp4 -vcodec libx264 -preset fast -crf 20 -vf "ass=Lantern.ass" -acodec libmp3lame -ab 128k lame.mp4

如果想压制AAC的音频,就在最后把acodec libmp3lame改成acodec aac

其中-ab 128k指的是平均码率为128k

以H.264自定义分辨率、AAC自定义参数缩放压制视频

ffmpeg -i Lantern.mp4 -vcodec libx264 -preset fast -crf 20 -vf "ass=Lantern.ass,scale=800:-1" -acodec aac -ab 128k aac.mp4

其中的scale=800:-1指的是输出800:对应比例的视频。假如你要压制720P的,那就把800改成1280;假如你要1080的,那就改成1920。通常来说,分辨率高的压分辨率低的好办,低的压高的就麻烦了……

两遍模式

如果你的目标是一个确定大小的文件而且帧与帧之间的视频质量并不重要,这个方法很适用。这通过一个例子可以得到很好地解释。你的视频有10分钟(600秒)的时长同时要求输出为50MB,因为比特率=文件大小/时长,

50MB*8192(MB转kilobits)/600秒=683 kbps(全局比特率)

683kbps-128kbps(音频比特率)=555kbps(视频比特率),

两遍编码的例子:

ffmpeg -y -i input -c:v libx264 -preset medium -b:v 555k -pass 1 -an -f mp4 /dev/null &&
ffmpeg -i input -c:v libx264 -preset medium -b:v 555k -pass 2 -c:a libfdkaac -b:a 128k mp4 output.mp4

分割视频(拷贝视频和音频流,速度比较快)

ffmpeg -ss 01:00:00 -i input_file_h264.mp4 -vcodec copy -acodec copy -t 00:06:00 output_file.mp4

总结

我这上面这几个小标题写的乱乱糟糟的,在这里统一做一个总结吧:

需要原封不动的把字幕压进去

ffmpeg –i Lantern.mp4-vf "ass=Lantern.ass" out.mp4

需要快速的压制质量较好的H264视频

ffmpeg -i Lantern.mp4 -vcodec libx264 -preset fast -crf 20 -vf "ass=Lantern.ass" out.mp4

需要快速压制质量较好的H264、720P视频

ffmpeg -i Lantern.mp4 -vcodec libx264 -preset fast -crf 23 -vf "ass=Lantern.ass,scale=1280:-1" out.mp4

需要压制超高质量的、缓慢的压制H264视频

ffmpeg -i Lantern.mp4 -vcodec libx264 -preset veryslow -crf 18 -vf "ass=Lantern.ass" out.mp4
这个……crf的质量大家自己掂量着办!0最好,53最差,默认23,合理范围18~28
preset也看着办
ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo
越慢,压缩率越高。

后记

视频编码这是个长久的技术活啊,而且需要很多的经验!自己多编码多玩玩,自然就有懂啦!

下一页是给懒虫们留着的哦~~

附录

给懒虫们的一键式编译脚本。我不太会写脚本,所以这个还是有很大改善空间的....目前只支持Debian系
使用方法:
git clone仓库,给两个文件都加x权限,root身份运行onekey-ffmpeg.sh即可。
开源地址戳我


文章版权归原作者所有丨本站默认采用CC-BY-NC-SA 4.0协议进行授权|
转载必须包含本声明,并以超链接形式注明原作者和本文原始地址:
https://dmesg.app/ffmpeg.html
退出移动版