【问题标题】:Error compiling PJSIP on Ubuntu在 Ubuntu 上编译 PJSIP 时出错
【发布时间】:2014-06-13 21:40:21
【问题描述】:

我正在尝试在 Ubuntu 上编译具有视频支持的 PJSIP 2.1,但在运行“make”时出现以下错误:

    In file included from ../src/pjmedia/ffmpeg_util.c:26:0:
../src/pjmedia/ffmpeg_util.h:50:12: warning: ‘enum CodecID’ declared inside parameter list [enabled by default]
       enum CodecID *codec_id);
            ^
../src/pjmedia/ffmpeg_util.h:50:12: warning: its scope is only this definition or declaration, which is probably not what you want [enabled by default]
../src/pjmedia/ffmpeg_util.h:53:7: warning: ‘enum CodecID’ declared inside parameter list [enabled by default]
       pjmedia_format_id *fmt_id);
       ^
../src/pjmedia/ffmpeg_util.c:65:18: error: field ‘codec_id’ has incomplete type
     enum CodecID codec_id;
                  ^
../src/pjmedia/ffmpeg_util.c:167:13: error: conflicting types for ‘pjmedia_format_id_to_CodecID’
 pj_status_t pjmedia_format_id_to_CodecID(pjmedia_format_id fmt_id,
             ^
In file included from ../src/pjmedia/ffmpeg_util.c:26:0:
../src/pjmedia/ffmpeg_util.h:49:13: note: previous declaration of ‘pjmedia_format_id_to_CodecID’ was here
 pj_status_t pjmedia_format_id_to_CodecID(pjmedia_format_id fmt_id,
             ^
../src/pjmedia/ffmpeg_util.c: In function ‘pjmedia_format_id_to_CodecID’:
../src/pjmedia/ffmpeg_util.c:173:35: warning: comparison between pointer and integer [enabled by default]
  if (t->id==fmt_id && t->codec_id != PIX_FMT_NONE) {
                                   ^
../src/pjmedia/ffmpeg_util.c:174:6: error: dereferencing pointer to incomplete type
      *codec_id = t->codec_id;
      ^
../src/pjmedia/ffmpeg_util.c:174:6: warning: statement with no effect [-Wunused-value]
../src/pjmedia/ffmpeg_util.c:179:5: error: dereferencing pointer to incomplete type
     *codec_id = PIX_FMT_NONE;
     ^
../src/pjmedia/ffmpeg_util.c:179:5: warning: statement with no effect [-Wunused-value]
../src/pjmedia/ffmpeg_util.c: At top level:
../src/pjmedia/ffmpeg_util.c:183:55: error: parameter 1 (‘codec_id’) has incomplete type
 pj_status_t CodecID_to_pjmedia_format_id(enum CodecID codec_id,
                                                       ^
make[2]: *** [output/pjmedia-i686-pc-linux-gnu/ffmpeg_util.o] Error 1
make[2]: Leaving directory `/home/gboutmy/Downloads/pjproject-2.1.0/pjmedia/build'
make[1]: *** [pjmedia] Error 2
make[1]: Leaving directory `/home/gboutmy/Downloads/pjproject-2.1.0/pjmedia/build'
make: *** [all] Error 1

我已经安装了所需的依赖项,但不知道问题出在哪里。读取错误消息看起来像是来自 PJSIP 代码中的错误?

编辑:我根据Getting “field has incomplete type” and "conflicting types"enum CodecID 重命名为enum AVCodecID,但现在我收到以下错误:

../lib/libpjmedia-codec-i686-pc-linux-gnu.a(ffmpeg_vid_codecs.o): In function `ffmpeg_codec_encode_whole.isra.7':
ffmpeg_vid_codecs.c:(.text+0x1374): undefined reference to `avcodec_encode_video2'
collect2: error: ld returned 1 exit status
make[2]: *** [../bin/pjmedia-test-i686-pc-linux-gnu] Error 1
make[2]: Leaving directory `/home/gboutmy/Downloads/pjproject-2.1.0/pjmedia/build'
make[1]: *** [pjmedia-test] Error 2
make[1]: Leaving directory `/home/gboutmy/Downloads/pjproject-2.1.0/pjmedia/build'
make: *** [all] Error 1

【问题讨论】:

    标签: c linux makefile sip pjsip


    【解决方案1】:

    您似乎想念libavcodec/avcodec.h,而且很可能还想念libavformat/avformat.h。这应该是因为 ffmpeg 的 include 文件夹不在gcc 的查找头文件的目录列表中。

    从您的更新看来,pjsip 正在构建一个更新的 ffmpeg 版本,该版本在 Ubuntu 的存储库中可用。当您自己构建它时,您可以通过运行配置 pjsip 以使用您的版本:

    ./configure --with-ffmpeg=<YOUR_FFMPEG_FOLDER>
    

    #Copy all library ffmpeg library files into one folder 
    CFLAGS="-I<YOUR_FFMPEG_FOLDER>" LDFLAGS="-L<YOUR_FFMPEG_LIB_FOLDER>" ./configure 
    

    【讨论】:

    • 这两个文件丢失了,但是安装它们似乎并不能解决问题。我仍然收到相同的错误消息。我自己编译了ffmpeg,这可能与问题有关吗?
    • @Emualynk 这是可能的,但从您上次更新来看,您似乎正在使用一个相当旧的版本,也许是 1.x 版本?我认为avcodec_encode_video2 是在 2.X 中引入的
    • 我从网站上抓取了 ffmpeg 2.1.1 版:/
    • @Emualynk 好的,那么发生的事情是gcc 正在使用系统的 ffmpeg 库。很抱歉,但我不知道 Ubuntu 正在使用这么旧的版本。请运行以下命令删除 libavformat-dev:apt-get remove libavformat-dev 并配置 gcc 以获取本地源文件和库,请查看我的更新以了解如何实现此目的。
    • 它现在可以工作了,我所做的是从一个干净的 linux 安装开始,我从最新的存储库源构建了 ffmpeg。
    【解决方案2】:

    原问题的答案:

    在编译 PJSIP 时,我发现 CodecID 枚举已被 ffmpeg 弃用。但是它已被 AV_CodecID 取代,并且枚举值也添加了前导 AV_ 。

    因此,将CodecID 更改为AV_CodecID 后,请更改ffmpeg_util.c 中的枚举。

    例如,更改后的表格如下所示:

    /* Conversion table between pjmedia_format_id and CodecID */
    static const struct ffmpeg_codec_table_t
    {
        pjmedia_format_id   id;
        enum AVCodecID      codec_id;
    } ffmpeg_codec_table[] =
    {
        {PJMEDIA_FORMAT_H261,       AV_CODEC_ID_H261},
        {PJMEDIA_FORMAT_H263,       AV_CODEC_ID_H263},
        {PJMEDIA_FORMAT_H263P,      AV_CODEC_ID_H263P},
        {PJMEDIA_FORMAT_H264,       AV_CODEC_ID_H264},
        {PJMEDIA_FORMAT_MPEG1VIDEO, AV_CODEC_ID_MPEG1VIDEO},
        {PJMEDIA_FORMAT_MPEG2VIDEO, AV_CODEC_ID_MPEG2VIDEO},
        {PJMEDIA_FORMAT_MPEG4,      AV_CODEC_ID_MPEG4},
        {PJMEDIA_FORMAT_MJPEG,      AV_CODEC_ID_MJPEG}
    };
    

    【讨论】:

      猜你喜欢
      • 2013-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多