Xvid在Linux/Unix下的编译(Cygwin/VMware)

来源:互联网 发布:欧美网络电视柠檬tv 编辑:程序博客网 时间:2024/05/01 08:01

### Date: 2017/4/1

### Advised at 2017/4/4

### Author: SoaringLee

      最近两天在学习MPEG4的开源实现——xvid。首先是对xvid源码进行编译,前一篇介绍了xvid源码在win32(VS2013)上的编译方法,本篇介绍一下Xvid在Linux/Unix下的编译过程。

      编译目录在build/generic下面,首先通过运行configure配置当前平台。类Unix环境可以采用mingw32或者cygwin。但是这里由于mingw32不能通过configure产生linux平台相应配置,所以这里在cygwin中进行编译。

      配置之后直接make,但是出现了下面的错误:


这里是链接器ld出现了错误,原因是汇编产生的目标文件obj不能识别,具体原因还不清楚?这个问题后面有空了慢慢解决吧!~

问题解决:

     在分析Xvid源码之前,这几天一直在思考这个导致这个问题的原因。目标文件格式不识别,应该是因为Windows和Linux中使用不同的目标文件格式,这里出现了不识别。在Stack overflow上找到问题:

If you are using a shared file system, you need to call make clean when switching between Windows and Linux.

Windows and Linux use different object file formats, and as such you can not use the object files of one OS on another. When using a shared file system, the make will not automatically guess that the object files should be recompiled and would use the old files compiled under a different OS. That would result in the error you observed.

但是具体原因是什么呢?

     通过比对虚拟机上configure生成的platform.inc和cygwin下生成的platform.inc,终于找到了原因。从下图中可以看出,两个platform中的架构配置是不一样的。左边是cygwin下生成的,架构为x86的,动态库为.dll,目标文件为.obj,这些是当前windows平台的配置;右边是虚拟机下生成的,架构为GENERIC,动态库为.so,目标文件为.o。因此Windows和Linux下的动态库文件和目标文件的格式都是不一样的。在这里,当前架构的设置不能识别目标文件。因此,问题是出在了配置上!


编译后的结果如下:


最后,对examples文件夹下面的编码器demo和解码器demo进行编译运行。成功运行!


另外,可以转战到虚拟机上面继续进行编译:

步骤同上,但是没有cygwin上出现的问题了,看来这个类Unix模拟环境的配置还是很容易出现问题的呢!

(1)./configure


(2)make


这里在=build文件夹下面生成的libxvidcore.a和libxvidcore.so.4.3就是我们需要生成的库了。

轻松加愉快的就完成了xvid库在linux平台上的编译了!

(3)make install

不过这里库的安装需要root权限。通过su -获取root权限,安装就好了。

(4)接下来对examples下面的编码器demo和解码器demo进行编译运行。

make之后生成相应的可执行文件。

对foreman_cif.yuv进行编码:


运行成功,编码后生成了mpeg4码流文件foreman.m4v。

对foreman.m4v码流进行解码:


运行成功,解码后得到了重建yuv文件dec.yuv。

但是发现了2个小问题:

(1)对原始yuv视频采用xvid mpeg4编码器进行编码后,出现编码后的码流解码后的视频色彩失真问题。   

(2)但是比较遗憾的是,yuvplayer这个软件只有windows版本的exe,没有linux下的,所以对解码后得到的dec.yuv不能进行播放和验证解码的正确性。一般情况下,这里的编码和解码应该都是正确的。

      为了解决Linux下不能播放yuv文件的问题,接下来准备对yuvplayer的源码进行学习并编写linux平台的makefile,然后在linux下进行编译,得到相应的可执行文件。

yuvplayer的源码地址:https://github.com/Tee0125/yuvplayer

                                      (https://sourceforge.net/p/raw-yuvplayer/code/HEAD/tree/)

                                        https://github.com/latelee/YUVPlayer

       未完待续~~~~

0 0
原创粉丝点击