zoukankan      html  css  js  c++  java
  • 移动视频监控(2)原型开发(音视频编解码多平台移植(for window/wince))ffmpeg 自由之路即是曲折之路。

          终于完成了了第二个Client side原型(for Wince),其中花掉我最多时间的就是ffmpeg的对WINCE的移植。其中有大半时间是由于网上的一些不完整及不正确信息所误导,但是没有这些零星的信息,我可能花费更多的时间。现在我把自己的移植过程分享给大家,我尽量做到事无巨细,也好让大家少走弯路,省去我们程序员们的时间。那可是大把的银子与信心浪费。呵呵,书归正传。

         一,第一个想法,仍像从前移植平台代码一样,先找到这种跨平台代码的自己的特定平台的make文件或工程:

     可惜没有发现ffmpeg 有for windows 及 for wince的make 及工程。再细读 ffmpeg的官方网站,让人仰天大笑,其中说到,由于VC/Visual studio 开发环境的编译器,对C99支持不好,而ffmpeg又是follow这些C语言规范写的,因此,不支持VC/VS的编译器。这比一些跨平台项目说windows OS is silly OS, not popular POSIX 从而不支持的说法更有趣。其实,从IT行业而言,这些理由都不是那么的合逻辑,也不够严谨。但代码是别人写的。我们又能如何呢?呵呵。

        二,曲径通幽,既然ffmpeg不支持windows的编译器,那我们还有一个曲折的办法,它不是支持POSIX嘛 ,也就是支持linux/unix嘛 ,那我们就有了我们的办法,我们的windows平台上的linux编译器(算一种交叉编译吧,呵呵)于是大家想到了Cyxwin及 Mingw+Msys,其它,Cyxwin中编译出windows的平台上可用的库,还是调用了Mingw的编译器,于是我们就直接研究Mingw +Msys吧,但是这个东东有一个致命的弱点,就是要安装,分别要更新一堆组件,更新到什么版本呢,天知道,都用最新的吧。去相关的网站去下载他们(http://)不过Mingw的 sourceforge 网站真不是人去的,里面乱放,而且目录没有一个明确的索引,网站又慢,我是花了一天时间才找齐,后来发现ffmpeg有一个说明网页,可以明确下载。请参看(http://ffmpeg.arrozcru.org/wiki/index.php?title=MSys_MinGW)其中下载地址我再列一下,以方便大家:

    Mingw: http://sourceforge.net/project/showfiles.php?group_id=2435&package_id=240780&release_id=595197

    Mingw插件更新:

              http://prdownloads.sourceforge.net/mingw/binutils-2.18.50-20080109-2.tar.gz?download

              http://prdownloads.sourceforge.net/mingw/mingwrt-3.15.1-mingw32-dll.tar.gz?download

              http://prdownloads.sourceforge.net/mingw

              http://prdownloads.sourceforge.net/mingw/w32api-3.13-mingw32-dev.tar.gz?download

    最稳定的gcc编译器for mingw插件:

             http://prdownloads.sourceforge.net/mingw/gcc-core-3.4.5-20060117-1.tar.gz?download

             http://prdownloads.sourceforge.net/mingw/gcc-g++-3.4.5-20060117-1.tar.gz?download

    至于安装过程,网上搜一下,不会有问题can't miss it

          MSys:http://prdownloads.sourceforge.net/mingw/MSYS-1.0.11-2004.04.30-1.exe?download

    相关插件更新:

           http://prdownloads.sourceforge.net/mingw/MSYS-1.0.11-20080821-dll.tar.gz?download

          http://prdownloads.sourceforge.net/mingw/bash-3.1-MSYS-1.0.11-snapshot.tar.bz2?download

          http://prdownloads.sourceforge.net/mingw/coreutils-5.97-MSYS-1.0.11-snapshot.tar.bz2?download

          http://prdownloads.sourceforge.net/mingw/make-3.81-MSYS-1.0.11-2.tar.bz2

          至一Msys的安装及与Mingw整合在一起,网上查一下,can't miss it,

    三 , 开始for windows的ffmpeg编译。这个ffmpeg论坛上倒有相关的指导。请参照:

    http://ffmpeg.arrozcru.org/wiki/index.php?title=Static

    这里有一个静态库的编译。按向导完成编译成静态lib库,可以址接进行编译链接到 windows项目中(only for windows平台,not for wince),好放到一个新的window项目中,编译成功,链接,一堆的库找不到,哈哈,仰天大笑,用工具一查相关引用,原来这些找不到函数,还在mingw的库中,也就是说要在项目中用ffmpeg的静态库,你还要搭上一堆mingw的库,就像现在市场上的搭配销售。再笑,我先找个地方睡半天,缓解我的想扁人的冲动。

    睡醒之后,换种用法,我编动态库,这下你不会不把我的所有函数给我加到我的DLL里吧,再换了一些ffmpeg的./configure参数。搞定。生成了动态库,及lib.用到项目里,编译通过。不过,这只是万里长征第一步,我还要最痛苦的for wince的库。

    四,for wince 的ffmpeg:

          从linux的代码用mingw编成 for windows那是人家mingw的任务,我们也只绕了一道弯,for wince的mingw不存在呀,怎么办,忽然想到linux上的交叉编译,人家可以在linux用定制的gcc交叉编译器弄出for wince的库,那我们何不在Mingw上搞出for wince的库,一查,网上果然仅有的解决方案,也就是交叉编译成for wince 的ffmpeg,所用交叉编译器,大家可以看仔细了,

    网上有绝大多数的相关贴子给的交叉编译器是不正确的(下载的地址不正确)真搞不懂网上一堆人转载别人的文章,也不去验证一下,转载干嘛?,我就是由于用了网上这些人转载地址去下载编不正确的编译器,浪费了3天的时间,无功而返。记住,下载的交叉编译器是 cegccmingw 下载地址是:()

    进行编译。编译最新的库,会有一些汇编通不过。自己对汇编不熟悉,不过要是在linux上交叉编译应该没问题,有兴趣的话,可以自己试那个环境,那样的话,用的交叉编译器就应该是cegcc.

    没办法,为了节省我的时间,我可是要在两周内完成三个平台的原型开发的。就拿了2007年的ffmpeg来编。其中也改了不少东西才编译能通过,首先,./configure 之后,在生成的config.mak中,要修改“SLIB_EXTRA_CMD=-lib /machine:i386 /def:$(@:.dll=.def)”为“SLIB_EXTRA_CMD=-lib /machine:arm /def:$(@:.dll=.def)”,及 “EXTRALIBS=  -lm”改为“EXTRALIBS=  -lm -lws2.lib”,其中编译过程中采取了perror禁用,有seek函数禁用与替换(由于没有用zlib,linux平台估计会没有问题).细节,可以有时间再写,有兴趣的话,可以加我MSN。

    编译成功后。用在C++环境中。测试普通函数通过,不过在视频编换时,效率不高。

    换了一下网上的别人编译的ffmpeg库,(网上有一个下载,不过此SDK在wince上用时,用在C++项目中有问题。头文件中有重复定义,解决办法是放在.c文件中,由Cpp文件来调用,这样可以规避这些问题,但这样就存在了一些全局变量.这样的头文件是不能用在Sybmian平台的。

    另外一种思路就是不用ffmpeg.用Xvid解 mpeg4(测试下来效率好像要高于ffmpeg,毕竟是专门for mpeg4),用xh264解 H264,拿过他们的源代码一看,还是人家这跨平台,现成的for windows平台的工程make文件,这才是真正的跨平台。当然想要更多功能,ffmpeg地位还是无人能及。

    如果有人对编解码做简单的跨平台移植有兴趣,可以加我MSN一起学习探计,相互学习,搞技术嘛,大家一起共享信息,会省掉多少人的多少个不眠之夜,我就是因为一些信息的不准确,害得我移了一周,每天可都工作到凌晨2点多。

    好了,今天就写到这里,至于Symbian平台的移植,改天再写。

  • 相关阅读:
    FreeCommander 学习手册
    String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1)
    StringBuffer 详解 (String系列之3)
    StringBuilder 详解 (String系列之2)
    java io系列26之 RandomAccessFile
    java io系列25之 PrintWriter (字符打印输出流)
    java io系列24之 BufferedWriter(字符缓冲输出流)
    java io系列23之 BufferedReader(字符缓冲输入流)
    java io系列22之 FileReader和FileWriter
    java io系列21之 InputStreamReader和OutputStreamWriter
  • 原文地址:https://www.cnblogs.com/windwithlife/p/1492728.html
Copyright © 2011-2022 走看看