转载自:http://vistb.net/2012/02/turn-seedbox-into-ripping-machine/

 

首先声明,这篇文章里面我说的都是比较大概的过程,没有很多细节,最多只是依据自己的经验教训详谈了一些容易出问题的地方。如果你要实践,请确保你看得懂我在说什么,并且善于利用搜索引擎解决实践途中可能遇到的一些问题。更具体的说,你要熟悉Linux的操作,有一定的编程基础(或者至少有在Linux上编译、安装程序的基础),并且熟悉音频和视频处理的相关概念以及基本的转码技术。如果你不清楚的话,还是及时收手,出去亲近大自然吧。我之所以不谈细节,是因为大家的环境千差万别,尤其是在Seedbox绝大部分使用Linux系统的情况下,我没办法保证一个一定适用于所有人的方法。

背景

正如我在前一篇文章中提到的,很多使用Linux作为操作系统的Seedbox提供商会给用户提供SSH的登陆权限。有了这一个权限,其实我们就可以在远端的服务器上编译、运行一些软件。唯一可能遇到的麻烦,就是我们由于没有root权限(或者说sudo权限)而不能安装、继而方便的使用这些软件。但是,只要用合适的方法,这个麻烦我们是可以克服的。另外,对于一些使用VPS作为Seedbox的用户来说,其实这个麻烦都不存在,因为你们对自己的虚拟服务器是具有完全的控制权限的(也就是拥有root权限),安装软件自然也没有问题。

另一方面,使用Seedbox的用户大多是玩PT的,玩PT的过程中大家可能发现一部影片只有原盘,但又不愿意花几天的时间把这个几十G的怪物拖下来;抑或看上了某条特效字幕或某条音轨,但也不愿意为了这个几十MB的字幕和1-2G的音轨而把整部影片下载下来。这时候,如果你先把这些原始内容下载到自己的盒子中(这个过程是很快的),然后盒子中又有提取、转换或者压制相关的软件,你就可以很容易的“提取”或者“创造”出自己想要的那部分内容。此时,你只需要从盒子中把新生成的、自己想要的内容下载到电脑里,问题就迎刃而解了。

下面正式开始,未作特殊说明情况下,均假设操作系统为Linux。

软件的选择

以上提到的“提取、转换、压制”相关的软件,从广义上来说都是属于压片软件。从我个人的经验来看,玩高清的话,有以下几个工具是必不可缺的:

  • ffmpeg:一员老将,强悍的音频、视频工具,可以进行提取和转换。但是对一些新兴格式的支持并不是很好,例如提取sup字幕貌似就不行。我主要用来它压缩音频或者结合x264处理逐行扫描的视频(例如1080i视频)。
  • mkvtoolix:处理mkv文件的一系列工具,对ts和m2ts文件也有良好的支持。其中包含3个主要工具,mkvextract用于从mkv文件总提取内容(如音频和视频),mkvinfo用于查看mkv文件信息,mkvmerge用于将音频、视频及字幕等合并成mkv文件。其中mkvmerge功能最强大,不仅能混流,而且可以合并几个分段的mkv文件形成一个大文件。mkvmerge的另一个妙用是可以用来从ts和m2ts文件中提取特定的视频、音轨或字幕到mkv文件。然后,我们可以再用mkvextract从这些mkv文件中提取出原始的、我们想要的视频、音轨或字幕。mkvextract是无法直接从ts或m2ts中提取内容的,其只能处理mkv文件。
  • x264:用于进行h264视频编码的编码器。可以被ffmpeg调用,但我一般习惯直接使用x264,只有当处理隔行扫描这类文件需要进行反交错时,我才会结合使用x264和ffmpeg。
  • txmuxer:专业用来混流和解流ts及m2ts的软件,它的一个独家功能是能够处理mpls文件。可惜的是,这个软件很久没人维护了,而且是以32位二进制形式发布的(没有公布源码),因此在64位机上很容易出问题无法运行。这也就是我上面为什么要大费周章利用mkvtoolnix来处理ts和m2ts文件的原因。

以下几个软件可以选择性使用:

  • ffms:可以用来给x264做解流器,有其一些独到的优势,参见我的这个帖子
  • mediainfo:可以用来查看各种媒体文件的信息,这个其实ffmpeg也能做到,但mediainfo的长处是信息更加完善,输出更加美观。另外,其还具有一定的处理mpls文件的能力,在tsmuxer不行时可以应急。这里说的“一定”的能力是指它能显示出mpls文件所包含的文件的播放总时长。但悲剧的是其好像不能正确输出每个mpls文件内部究竟包含了哪几个m2ts文件。不过,这个缺憾可以通过直接查看mpls文件的方法来解决。

下面几个软件可能必须首先安装,然后上面的软件才能正常编译:

  • gcc4.6:mkvtoolnix的编译需要c++0x的一些特性,因而需要gcc4.6或更高版本的支持。如果你的盒子里面有gcc而且gcc的版本号(通过“gcc -v”查看)高于4.6。那么你就不需要自己重新编译gcc了。
  • yasm:这是Linux下的汇编器,x264和ffmpeg为了追求性能,代码中包括一些汇编代码。为了顺利编译x264和ffmpeg,yasm必不可缺。同样,如果你的机器上已经有了yasm,那就不必再自己编译一次了。

最后,还要遗憾的说,在Linux系统上,还缺乏一些很好的工具:

  • 制作SUP字幕的软件:这个比较好的是Windows上的avs2bdnxml和BDSup2Sub。
  • 无损转换音轨的软件:这个比较好的是Windows上的eac3to。

软件编译与安装(VPS用户)

因为是VPS,所以你应该对自己的虚拟服务器拥有完全控制权限。大部分情况下,你可以直接安装别人已经编译好的对应的软件包,不需要自己动手编译。如果确实碰上了没有打包好的软件,需要自己动手,请参看下一小节。

软件编译与安装(非VPS用户)

这里先说几个编译与安装过程中的技巧和注意事项:

  • make的“-j”选项:有的软件编译起来比较耗时(例如gcc和ffmpeg),我们make的时候可以附带一个“-j”选项,后面跟一个数字,代表用几个线程同时进行编译。这样可以大大提高编译的速度。一般来说,考虑到Seedbox的性能都较好,我们可以使用“make -j4”甚至“make -j8”。
  • screen命令的使用:用过SSH的人都知道,你打开一个SSH连接后,如果关闭,那么那个终端当前运行的程序也会宗旨。这就意味着我们进行视频编码或者编译大型软件(如gcc)时,在本机也要一直开一个窗口,这显然很麻烦。但有了screen这个命令,我们就可以从中解放了。screen命令的基本用法可以参见这个帖子这个帖子
  • 文件的组织:为了使用的方便,我建议在自己的HOME目录下先新建一个build目录,用来安装最后编译好的各个程序的可执行文件和链接库、头文件等等。然后再在HOME目录下新建一个src目录,针对每个工具或者库再到src目录下建立一个子文件夹,例如src/gcc,src/x264等等。下面编译软件进行configure的时候记得加入“–prefix=$HOME/build”就是了(VPS用户就不用设置prefix了,直接用“sudo make install”安装在默认位置就行)。
  • LDFLAGS和CPPFLAGS:这是两个环境变量(如果你不知道什么是环境变量,参看这个帖子)。LDFLAGS用来指定编译时链接器会到哪些位置寻找库文件,我们可以使用“export LDFLAGS=”-L/path/to/first/lib -L/path/to/second/lib””这种形式的命令来设置LDFLAGS。CPPFLAGS用于指定编译时编译器会到哪里寻找头文件,类似的,我们可以使用“export CPPFLAGS=”-I/path/to/first/include -I/path/to/second/include””这种形式的命令来设置CPPFLAGS。由于我们编译的软件往往都依赖于其他一些第三方库,因此正确设置这两个环境变量是成功编译的一个重要因素。

下面说说怎么编译各个软件:

  1. 首先使用“export LD_LIBRARY_PATH=$HOME/build/lib”和“export PATH=$HOME/build/bin”指定环境变量,方便编译过程中寻找所依赖的库的位置。另外一个需要指定的环境变量是PKG_CONFIG_PATH,进行设置的命令行为“export PKG_CONFIG_PATH=$HOME/build/lib/pkgconfig”。
  2. 编译每个软件时都要注意LDFLAGS和CPPFLAGS是否进行了设置,是否设置的正确。
  3. yasm:下载源码包,解压。首先运行configure,注意添加“–prefix”选项指定安装路径。也就是完整的configure命令应该是“./configure –prefix=$HOME/build”。然后再“make”和“make install”就行了。
  4. gcc:gcc的编译过程比较诡异,有一些需要注意的地方。首先下载源码包,解压。比如说解压到了$HOME/src/gcc/下面,然后我们需要gcc所依赖的mpc、mpfr和gmp三个库的源码,解压后把它们放到$HOME/src/gcc/下对应的子文件夹中,如$HOME/src/gcc/mpc。接着,我们在$HOME/src/下再创建一个gcc-obj文件夹,在这个文件夹中运行“$HOME/src/gcc/configure –prefix=$HOME/build –enable-languages=c,c++ –disable-multilib”。然后“make -j8”和“make install”即可。make的过程会很比较长,可以考虑使用screen命令。
  5. x264:x264要编译两次,第一次编译只是为了给ffmpeg提供库文件。在编译完了ffmpeg和ffms以后,我们再进行第二次x264的编译时(这样第二次编译的x264就有了lavf和ffms这两个解流器),建议重新下一份源代码,放在一个新的文件夹中,如“x264-final”。重新进行configure并编译和安装。需要说明的是,第二次编译时,我们只是需要x264的可执行文件,为了不生成新的库文件与第一次编译安装的库文件冲突, 我们可以在第二次编译的configure时加上“–enable-static=no –enable-shared=no”参数。但是,在configure那些是为了满足依赖性而编译的库(或软件)时,我们最好都添加上“–enable-static=yes –enable-shared=yea”选项。
  6. ffmpeg:注意configure时多加入“–enable-libx264”选项,其他没什么特别的。如果想要一些其他的常见编码器,可以再自行添加,例如“–enable-libfaac –enable-libmp3lame –enable-libxvid”等等,但就需要自己先编译这些库。
  7. mkvtoolnix:依赖很多东西……慢慢编译安装满足依赖性先。最后注意编译时要用4.6或更高版本的gcc才行(可以通过设置CC及CXX环境变量来指定编译器的位置)。另外一点特殊的是其使用的构建系统并不是make,而是rake。具体的编译过程可以参见官方说明
  8. ffms:用于给第二次编译的x264提供解流器。依赖于ffmpeg,没什么特别的。
  9. mediainfo:这个软件编译起来也挺麻烦,先编译ZenLib,然后是MediaInfoLib,最后是MediaInfo。对于ZenLib和MediaInfoLib,都是先进到源码下的Project/GNU/Library目录,运行autogen,然后再运行configure,最后“make”和“make install”。对于MediaInfo,则是进入Project/GNU/CLI目录,运行autogen,然后再运行configure,最后“make”和“make install”。
  10. txmuxer直接是以二进制形式发布的,把可执行文件放到$HOME/build/bin下面就是了。

软件的使用

编译好软件以后我们就可以使用了,为了使用的方便,我们可以在HOME目录下修改(没有就新建).bashrc文件,设置LD_LIBRARY_PATH和PATH环境变量。这样,以后就不用每次登陆后还手动进行LD_LIBRARY_PATH和PATH环境变量的设置了。注意,这一步VPS用户不必要进行,因为你们的文件安装在系统能够找到的位置,不必设置环境变量。

mkvtoolnix和mediainfo的使用可以参见他们官方的教程。有关使用ffmpeg和x264进行压片,我写了这个帖子这个帖子,大家可以参看。

最后,希望大家都能顺利的把自己的Seedbox变成无所不能的变形金刚!