话说很久之前,人人影视放出来了一个压片工具,总共有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中的,所以当你注销-登录或者 之后可以从任何目录运行~/bin中的程序的。再不济,咱把~/bin里的拷贝到/bin里总可以吧? 3.如果需要安装man page,请运行source ~/.profile
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
crf(Constant Rate Factor)
该方法在输出文件的大小不太重要的时候,可以使整个文件达到特定的视频质量。该编码模式在单遍编码模式下提供了最大的压缩效率,每一帧可以按照要求的视频质量去获取它需要的比特数。不好的一面是,你不能获取一个特定大小的视频文件,或者说将输出位率控制在特定的大小上。
crf的参数值中,其中0为无损模式,23为缺省值,51可能是最差的。该数字越小,图像质量越好。从主观上讲,18~28是一个合理的范围。18往往被认为从视觉上看是无损的,它的输出视频质量和输入视频一模一样或者说相差无几。但从技术的角度来讲,它依然是有损压缩。
以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
preset也看着办
ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo
越慢,压缩率越高。
后记
视频编码这是个长久的技术活啊,而且需要很多的经验!自己多编码多玩玩,自然就有懂啦!
下一页是给懒虫们留着的哦~~
附录
给懒虫们的一键式编译脚本。我不太会写脚本,所以这个还是有很大改善空间的....目前只支持Debian系
使用方法:
git clone仓库,给两个文件都加x权限,root身份运行onekey-ffmpeg.sh即可。
开源地址戳我