windows下编译ffmpeg+segmenter(HLS)

熬了三天夜终于编译好了orz过程有多曲折就不说了,记录一下以免下次方便自己找

现在的成果只是编译完成,能不能正确将ts文件进行分割产生相应m3u8还未知

 

首先是mingw+msys的安装

因为现在的版本可以将两者一起安装,而不需要分别装了。可以下载一个几百k的安装文件,然后在线下载安装;或者直接下载离线安装。

之前试过的是下载离线安装文件mingw-msys-0.6-x86.zip (103.8 MB) 不知道是不是我编译的问题还是怎样,编译完成后不能将我的测试文件转为ts,敲好ffmpeg的命令:ffmpeg -f h264 -i test.264 -acodec copy -vcodec copy test.ts 后,就直接出现应用程序崩溃了

后来再用的mingw-get-inst-20120426.exe 安装的时候会有这么几个选项

MinGW Compiler Suite C Compiler optional (*) C++ Compiler optional Fortran Compiler optional ObjC Compiler optional Ada Compiler optional MSYS Basic System optional MinGW Developer Toolkit optional

忘记哪里看到的了,反正我就全部勾上了,C跟C++肯定要的,msys我猜也是要勾上的吧,否则怎么叫mingw跟msys一起安装呢

 

然后就是ffmpeg的版本问题

之前编译好后不能用,我以为是ffmpeg版本的问题,然后就问瑞瑞要了她的版本,现在看来应该不是版本问题了。不过我之后用的都是瑞瑞给的版本ffmpeg-0.6,其他的就没试过了。不过这个版本是可以用的

另外,在编译的时候把编译要用的源代码统一放到:MinGW安装路径\msys\1.0\home\用户名\(这是msys的home目录即~) 下,因为后面还可能要编译一些库,统一放到这个目录下看起来比较清楚。(虽然我觉得不放到这下面应该也没有关系)

 

ffmpeg编译

这个花了相当多的时间。虽然换了mingw+msys的安装方法后,默认configure参数编译没有出现什么问题,编译得到的ffmpeg.exe也能将我们的测试文件转换成ts了。这时我尝试去编译segmenter,发现要包含的头文件找不到(后来发现是要指定lib和include的路径),我还尝试改了ffmpeg的源文件中头文件的路径,后来发现真是太二了= =

但是当时还发现编译segmenter的时候,教程里需要用到的那些第三方库(ffmpeg不提供)faac、faad2、lame、x264找不到,一时也搞不懂到底是些什么东西,过于混乱,就先放弃了这边,继续研究ffmpeg编译第三方库。

首先是编译faac,sourceforge上直接下就好了。现在的版本是1.28.下下来之后照我开始说的那样copy解压到:MinGW安装路径\msys\1.0\home\用户名\ ,然后分别执行:

./bootstrap

./configure --without-mp4v2 

make&make install

说一下configure的问题,因为直接下载的源码编译会出错,尽管我试过按照这篇教程修改了源码,但还是有错。所以按照这篇教程说的去掉mp4v2.好在我们的项目里是不需要mp4相关的(也好像看到有说mp4可以不由faac负责,其他的库可以提供支持之类的),于是我就按照这种方法来编译,顺利通过。

然后是faad2,sourceforge上下载的faad2-2.7版本,解压路径什么的跟上面说的一样,还是这篇教程里说注释掉faad2-2.7/frontend/main.c的第34行:

/*#define off_t __int64*/

虽然我没试过不住试过对不对,不过注释掉以后,也是直接

./bootstrap

./configure 

make&make install

就行了

然后是lame,下载lame-3.98.4版本,解压,大概也是configure&make&make install的节奏

最后x264有点麻烦。因为x264的代码现在是git在管理,所以先要下载windows下的git工具:Git-1.5.6.1-preview20080701,这是我下载的版本,安装后打开git bash(好像),命令:git clone git://git.videolan.org/x264.git 下载完成后在git安装目录bin下会出现一个x264的文件夹,这就是下载的源码

编译x264要yasm,同样下载源码configure&make&make install

然后还是把x264 copy到~目录下,然后configure&make&make install

这样4个库就准备好了,接下来要把他们链接到ffmpeg中

如果之前编译过ffmpeg先make uninstall,make clean(或者还有rm config.*)等,为了保证干净都可以试一遍。然后configure的参数很重要

./configure --enable-gpl --enable-shared --enable-memalign-hack --enable-w32threads --enable-libfaac --enable-libfaad --enable-libmp3lame --enable-libx264 --extra-cflags=-I/usr/local/include --extra-ldflags=-L/usr/local/lib

以我能理解的程度解释一下。--enable-shared是生成动态链接库的,这个一定需要,会生成dll与.a文件,make install之后分别会copy到MinGW安装路径\msys\1.0\local\bin和MinGW安装路径\msys\1.0\local\lib下,需要的头文件会copy到MinGW安装路径\msys\1.0\local\include下(后来找到别人的编译环境之后试着用它来编译自己的ffmpeg,就是因为没加--enable-shared而导致segmenter编译失败)

--enable-w32threads是用多线程编译,这个是windows下提供的库,通用的应该是pthreads(这个需要自己另外装)感谢宅男的提醒,我之前看人家教程有写这个选项但不知道干啥的就无视了= =

--extra-cflags=-I/usr/local/include --extra-ldflags=-L/usr/local/lib 这个是指定我们之前编译的4个库的链接位置,否则会说找不到这些库。(这个也是折腾了好久,因为根本什么都不懂orz)

然后make&make install,检查一下MinGW安装路径\msys\1.0\local\bin,MinGW安装路径\msys\1.0\local\lib,MinGW安装路径\msys\1.0\local\include三个目录,应该有的东西都有了。再拿我们的测试文件测试转ts,ffmpeg就编译好了。

 

最后是编译segmenter。这篇教程给了代码下载地址,不过竟然被墙了= =这篇教程给了patch,也就是segmenter.cd的242行把guess_format修改成av_guess_format

放到ffmpeg目录下,编译命令为

gcc -Wall -g segmenter.c -o segmenter.exe -I/usr/local/include -L/usr/local/lib -lavformat -lavcodec -lavutil

上面两个目录就是我们编译ffmpeg后产生的那些.a以及头文件放的地方

然后就终于编译通过了!

 

其中编译到今天下午实在想放弃的时候发现了这篇文章,作者给了编译环境以及编译好的ffmpeg,还有segmenter的源码,只要敲一行segmenter的编译命令就行了。本来就打算这样交差的,最后还是想试试看自己到底是哪里出了问题。ffmpeg的版本?编译环境?或者segmenter的编译命令?

我先用他的编译环境make uninstall&make clean了之后进到自己的ffmpeg源码文件夹,按之前的方法configure(只有enable-memalign-hack选项),然后再make发现segmenter还是可以编译成功。后来发现因为他之前编译好的那些.a文件并没有在make uninstall时被删掉。我删掉用再用我之前的configure,编译好ffmpeg就发现segmenter编译报错了。

结果才发现ffmpeg编译没有加enable shared编译动态库的选项(在执行编译好的ffmpeg时会出现编译ffmpeg编译时的configure选项,我一个一个去对照了),加上之后发现那些.a文件都回来了,编译segmenter也就通过了

然后我就用自己的编译环境再用./configure --enable-gpl --enable-shared --enable-memalign-hack --enable-w32threads命令编译了一次(我没有试过加上那4个库),再用gcc -Wall -g segmenter.c -o segmenter.exe -I/usr/local/include -L/usr/local/lib -lavformat -lavcodec -lavutil编译segmenter,成功!

其实还没一个不明白的问题是人家给的命令gcc -Wall -g segmenter.c -o segmenter.exe -L /usr/local/lib -lavformat -lavcodec -lavutil就行了,并不需要-I链接头文件,难道是放在msys装在C盘默认目录的原因?

 

最后,还没有试过加上那几个库的编译怎么样。命令姑且记一下:

ffmpeg configure:

./configure --enable-gpl --enable-shared --enable-memalign-hack --enable-w32threads --enable-libfaac --enable-libfaad --enable-libmp3lame --enable-libx264 --extra-cflags=-I/usr/local/include --extra-ldflags=-L/usr/local/lib

编译segmenter:

gcc -Wall -g segmenter.c -o segmenter -lavformat -lavcodec -lavutil -I/usr/local/include -L/usr/local/lib -lbz2 -lm -lmp3lame -lx264 -lfaad -lfaac -lz

(对了,bz2好像也是要事先下载编译好的库,然后再链接进来)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值