• CentOS6.2下编译mpeg4ip


    一、环境

    1、操作系统版本

    CentOS 6.2 64

    uname -a的输出:

    Linux localhost.localdomain 2.6.32-220.17.1.el6.x86_64 #1 SMP Wed May 16 00:01:37 BST 2012 x86_64 x86_64 x86_64 GNU/Linux

    2mpeg4ip版本

    版本:1.6.1

    下载链接:

    http://people.freebsd.org/~ahze/distfiles/mpeg4ip-1.6.1.tar.gz 

     

    二、编译 

    1、编译mpeg4ip需要的库 

    首先安装libtool库,命令如下: 

    yum install libtool 

    然后进入到mpeg4ip的目录,运行./bootstrap进行配置,如果出错,是因为bash版本及名称的问题,修改bootstrap文件中第一行,改sh bash.或运行 bash ./bootstrap。 

    提示如下:  

    *** ffmpeg encoder is not installed
    *** xvid encoder is not installed
    *** x264 encoder is not installed
    *** lame encoder is not installed
    *** faac encoder is not installed
    *** twolame encoder is not installed

     安装相应库: 

    yum install ffmpeg-devel xvidcore-devel twolame-devel x264-devel 

    编译:make 

    2、编译中的错误处理 

    2.1 报错内容:  

    In file included from config_opts.cpp:1:
    /include/mpeg4ip.h:126: error: new declaration 'char* strcasestr(const char*, const char*)'
    /usr/include/string.h:369: error: ambiguates old declaration 'const char* strcasestr(const char*, const char*)'

    解决办法:

    vi include/mpeg4ip.h 

    注释掉函数声明,如下所示:

    2.2 报错内容: 

    cc1plus: warnings being treated as errors
    sys_decoder_blkdec.cpp:190: error: suggest parentheses around '&&' within '||'
    sys_decoder_blkdec.cpp:205: error: suggest parentheses around '&&' within '||'

     如图所示:

    解决办法:

    vi common/video/iso-mpeg4/src/Makefile 

    去掉Werror 

    vi命令: %s/-Werror//

    2.3 报错内容: 

    type_basic.cpp:320: error: '<anonymous>' has incomplete type
    type_basic.cpp:320: error: invalid use of 'Void'
    type_basic.cpp:320: error: prototype for 'Void CMotionVector::setToZero(<type error>)' does not match any in class 'CMotionVector'
    ./../include/basic.hpp:441: error: candidate is: Void CMotionVector::setToZero()

    解决办法: 

    vi common/video/iso-mpeg4/src/type_basic.cpp 

    320行去掉括号内的Void,如图所示:

    2.4 报错内容:  

    cc1: warnings being treated as errors
    config.c: In function 'enter_chn':
    config.c:636: error: array subscript is above array bounds
    config.c:637: error: array subscript is above array bounds

    解决办法: 

    vi player/lib/audio/faad/Makefile 

    去掉Werror 

    2.5 报错内容: 

    /usr/local/include/libavutil/common.h: In function ‘int32_t av_clipl_int32(int64_t)’:
    /usr/local/include/libavutil/common.h:154: error: ‘UINT64_C’ was not declared in this scope
    ...

    解决办法: 

    涉及到标准cc99的问题,在出问题的文件中加上下面三句话就好了 

    #ifndef UINT64_C
    #define UINT64_C(value)__CONCAT(value,ULL)
    #endif

    2.6 报错内容: 

    In file included from ffmpeg.cpp:26:
    ffmpeg.h:29:28: error: ffmpeg/avcodec.h: No such file or directory
    ...

     解决办法:

    版本遗留问题,修改下路径就行了。其实这是一类问题,接下来还会遇到好多次,以这个为例展例下,其它的照此修改就OK了。

    vi player/plugin/audio/ffmpeg/ffmpeg.h

    在第30行进行修改,替换成完整路径:

    #include <ffmpeg-spice/libavcodec/avcodec.h> 

    2.7 报错内容: 

    ffmpeg.cpp: In function 'codec_data_t* ffmpeg_create(const char*, const char*, int, int, format_list_t*, audio_info_t*, const uint8_t*, uint32_t, audio_vft_t*, void*)':
    ffmpeg.cpp:180: error: 'AVCODEC_MAX_AUDIO_FRAME_SIZE' was not declared in this scope
    ffmpeg.cpp: In function 'int ffmpeg_decode(codec_data_t*, frame_timestamp_t*, int, int*, uint8_t*, uint32_t, void*)':

     解决办法:

    vi /usr/include/ffmpeg-spice/libavcodec/avcodec.h

    查找 AVCODEC_MAX_AUDIO_FRAME_SIZE,得到如下结果: 

    复制其值到文件player/plugin/audio/ffmpeg/ffmpeg.h,并把Q去掉:

    vi player/plugin/audio/ffmpeg/ffmpeg.h

    添加如下内容:

    #define AVCODEC_MAX_AUDIO_FRAME_SIZE 192000 

    2.8 报错内容: 

    media_utils.cpp: In function 'int create_media_for_iptv(CPlayerSession*, const char*, int, control_callback_vft_t*)':
    media_utils.cpp:613: error: invalid conversion from 'const char*' to 'char*'

     解决办法:

    vi player/src/media_utils.cpp

    613行,对name变量进行强制类型转换,如图所示:

     2.9 报错内容:

    ../server/mp4live/video_util_resize.h:93: error: conflicting declaration 'uint8_t* fV'
    ../server/mp4live/video_util_resize.h:91: error: 'fV' has a previous declaration as 'const uint8_t* fV'
    ../server/mp4live/video_util_resize.h:94: error: redefinition of 'uint32_t tvStride'
    ../server/mp4live/video_util_resize.h:94: error: 'uint32_t tvStride' previously declared here
    解决办法:
    这个就是函数声明的时候变量重名了,把名字修改的不同就OK了。这是我修改:
    void CopyYuv(const uint8_t *fY, const uint8_t *fU, const uint8_t *fV,
                 uint32_t fyStride, uint32_t fuStride, uint32_t fvStride2,
                 uint8_t *tY, uint8_t *tU, uint8_t *fV2,
                 uint32_t tyStride, uint32_t tvStride, uint32_t tvStride2,
                 uint32_t w, uint32_t h); 
    2.10 报错内容:
    video_ffmpeg.cpp:124: error: 'struct AVCodecContext' has no member named 'frame_rate'
    video_ffmpeg.cpp:125: error: 'struct AVCodecContext' has no member named 'frame_rate_base'
    video_ffmpeg.cpp:136: error: 'struct AVCodecContext' has no member named 'aspect_ratio'
    解决办法:
    这几个错误影响不大,就直接注释掉了,我主要用mp4live 
    vi server/mp4live/video_ffmpeg.cpp 

    好,编译成功,make install 即可使用。

    三、安装使用

    1、安装

    make install

    2、使用mp4live

  • E-Mail : Mike_Zhang@live.com
  • 转载请注明出处,谢谢!
  • 相关阅读:
    reuire代码优化之:r.js
    项目伪模块化开发之:requirejs(AMD)开发
    cookie
    前端构建工具gulpjs的使用介绍及技巧
    js之:漂浮线
    同步对象(Event)
    并发&并行 同步&异步 GIL 任务 同步锁 死锁 递归锁
    进程 线程 threading模块
    认证客户端的链接合法性
    socketserver 模块的构成
  • 原文地址:https://www.cnblogs.com/MikeZhang/p/mpeg4ip20120628.html
  • Copyright © 2020-2023  润新知