【问题标题】:PJSIP video support on embedded Linux using Yocto使用 Yocto 在嵌入式 Linux 上支持 PJSIP 视频
【发布时间】:2017-05-29 08:59:39
【问题描述】:

目前,我正在使用 Yocto/OE 在 i.mx6 嵌入式 Linux 上使用视频支持编译 PJSIP。到目前为止,我已经成功地让 PJSIP 与音频工作。 据我了解,在 Linux 上,您依赖于 SDL2 和 FFMPEG,Autotools 配置脚本应该能够自动检测所有这些。 一个问题是配置脚本无法找到 SDL2 的安装位置。即使我使用 with-sdl=... 输入路径,我也会注意到找不到 sdl-config,因此在稍后编译期间,没有任何 SDL 视频设备代码被编译。 关于 FFMPEG,PJSIP 是否也适用于 libav?我问这个问题是因为在 Yocto 中我们已经包含了 libav,而对于 FFmpeg,我们必须创建一个自定义配方。

此外,由于我无法获得自动检测所有依赖项的工具,我开始“冒险”自己在 config_site.h 中设置以下定义语句:

do_configure_prepend () {
    export LD="${CC}"
    echo "export CFLAGS += -D_REENTRANT -I${STAGING_INCDIR}/SDL2" > user.mak
    echo "export LDFLAGS += -lSDL2" >> user.mak
    echo "export LDFLAGS += -lGLESv2" >> user.mak

    bbnote "enabling video support"
    echo "#define PJMEDIA_HAS_VIDEO                 1" > ${S}/pjlib/include/pj/config_site.h
    echo "#define PJMEDIA_VIDEO_DEV_HAS_OPENGL          1" >> ${S}/pjlib/include/pj/config_site.h
    echo "#define PJMEDIA_VIDEO_DEV_HAS_OPENGL_ES       1" >> ${S}/pjlib/include/pj/config_site.h
    echo "#define PJMEDIA_VIDEO_DEV_HAS_SDL         1" >> ${S}/pjlib/include/pj/config_site.h
    echo "#define PJMEDIA_VIDEO_DEV_HAS_QT          1" >> ${S}/pjlib/include/pj/config_site.h
    echo "#define PJMEDIA_VIDEO_DEV_HAS_FFMPEG          1" >> ${S}/pjlib/include/pj/config_site.h
}

注意:我启用/禁用了相互独立的定义语句。

我发现的是:

  • 定义 PJMEDIA_VIDEO_DEV_HAS_QT:仅适用于 iOS,启用此功能无法编译
  • define PJMEDIA_VIDEO_DEV_HAS_OPENGL(_ES):仅适用于 Android,启用此选项无法编译
  • define PJMEDIA_VIDEO_DEV_HAS_SDL: 给出编译错误,可能是因为 sdl-config 没有运行?
  • define PJMEDIA_VIDEO_DEV_HAS_FFMPEG:由于缺少 FFmpeg 头文件而导致编译错误

所以我的问题是:

关于为什么找不到 sdl2-config 的任何想法?需要吗? 我们可以将 FFmpeg 切换为 libav 吗?为什么?为什么不? 关于OpenGL,即使我们基于i.mx6的平台支持OpenGLES2,为什么我们不能使用它?为什么它可以在 Android 而不是嵌入式 Linux 上运行?

【问题讨论】:

    标签: embedded-linux yocto pjsip


    【解决方案1】:

    我可以猜测为什么找不到 sdl-config:这些特定于项目的脚本实际上在交叉编译情况下无法工作,并且通常不会在 Yocto 中使用。您应该使用“--with-sdl”(或者修改 configure.ac 以使用 PKG_CHECK_MODULES() 来查找 sdl)。

    为什么“--with-sdl”对你不起作用很难说(因为你没有展示你尝试过的东西)但是假设他们想要一个带前缀的路径,我希望这会起作用:

    --with-sdl=${STAGING_DIR_HOST}${prefix}
    

    STAGING_DIR_HOST 是您当前正在为其构建的系统的 sysroot:如果您的配方中有 libsdl,则在 configure 运行时它应该在 sysroot 中。

    某些 Yocto 版本使用 libav 而不是 ffmpeg,您应该能够依赖于您的 Yocto 拥有的版本并像上面一样使用“--with-ffmpeg”。

    关于 Linux 上 PJSIP 支持的问题可能值得另一个问题 - 或者在他们的支持论坛上尝试(如果有的话)。

    【讨论】:

    • 嗨,我做了一些试验和错误,例如我尝试了以下方法:--with-sdl--with-sdl=${includedir}/SDL2--with-sdl=${STAGING_DIR_HOST}${includedir}/SDL2,但没有一个成功。我再次尝试了您的建议,但配置脚本仍然没有拾取 sdl2-config。我想我确实需要编辑 configure.ac。但是,当我对 ffmpeg 尝试相同的操作时,我确实看到 Yocto 中的 pkg_config 能够拾取它,在生成的 build.mak 文件中,我还看到了 libavcodec 等的额外 CFLAGS。
    • 查看了配置:我同意修改它以使用 PKG_CHECK_MODULES(SDL, sdl) 然后将 SDL_CFLAGS 和 SDL_LIBS 添加到 CFLAGS 和 LIBS 似乎是一个合理的选择:sdl-config 不会在 yocto 上工作。
    • 好吧,我刚刚完成了 PJSIP 的构建,但是通过另一种方式(可能不太干净)。在我的 dev-pc 上,我编辑了 aconfigure.ac 文件以使用 AC_PATH_PROGS(SDL_CONFIG,sdl2-config sdl-config,,$with_sdl/bin/crossscripts)。接下来我生成了一个配置:autoconf -o aconfigure aconfigure。然后我在 Yocto 中获取 pjproject 源,并将我的 dev-pc 中的 aconfigure 和 aconfigure.ac 文件复制到 Yocto ${S} 文件夹中。接下来,bitbake 完美运行。在目标机器上 pjsua 现在列出了 H263 和 H264 编解码器。视频仍然无法播放:!SDL_Init() error: No available video device.
    • 对其他阅读本文的人的额外说明:我使用的是 Yocto 1.8,但是我不使用 oe-core 提供的 libav。相反,我使用的是新版本 Yocto 中的 ffmpeg 配方。我可以确认使用默认 libav 不适用于 pjproject 并且会出错:'AVCodec' has no member named 'encode'
    猜你喜欢
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多