使用 Yocto 的嵌入式 Linux 上的 PJSIP 视频支持
PJSIP video support on embedded Linux using Yocto
目前,我正在使用 Yocto/OE 在 i.mx6 embedded Linux 上使用视频支持编译 PJSIP。到目前为止,我已经成功地让 PJSIP 与音频一起工作。
据我了解,在 Linux 上,您依赖于 SDL2 和 FFMPEG,Autotools 配置脚本应该设法自动检测所有这些。
一个问题是配置脚本无法获取 SDL2 的安装位置。即使我使用 with-sdl=... 输入路径,我也注意到例如未找到 sdl-config,因此稍后在编译期间正在编译 SDL 视频设备代码 none。
关于 FFMPEG,PJSIP 是否也适用于 libav?我问这个问题是因为在 Yocto 中我们已经包含了 libav,而对于 FFmpeg 我们必须创建一个自定义配方。
此外,因为我无法获得自动检测所有依赖项的工具,所以我开始 "adventurous" 自己在 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
}
注:我enabled/disabled定义语句相互独立
我发现的是:
- define 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?
我可以猜测为什么找不到 sdl-config:这些项目特定的脚本实际上在交叉编译情况下从不工作,并且通常不在 Yocto 中使用。您应该使用“--with-sdl”(或者修改 configure.ac 以使用 PKG_CHECK_MODULES() 来查找 sdl)。
为什么“--with-sdl”对你不起作用很难说(因为你没有展示你尝试过的东西)但假设他们想要一个带前缀的路径,我希望它能起作用:
--with-sdl=${STAGING_DIR_HOST}${prefix}
STAGING_DIR_HOST 是您当前正在为其构建的系统的 sysroot:如果您的配方中有 libsdl,则在配置运行时它应该在 sysroot 中。
一些 Yocto 版本使用 libav 而不是 ffmpeg,您应该能够依赖于您的 Yocto 拥有的版本并像上面那样使用“--with-ffmpeg”。
linux 上有关 PJSIP 支持的问题可能值得另一个问题——或者如果存在的话,可以在他们的支持论坛上尝试。
目前,我正在使用 Yocto/OE 在 i.mx6 embedded Linux 上使用视频支持编译 PJSIP。到目前为止,我已经成功地让 PJSIP 与音频一起工作。 据我了解,在 Linux 上,您依赖于 SDL2 和 FFMPEG,Autotools 配置脚本应该设法自动检测所有这些。 一个问题是配置脚本无法获取 SDL2 的安装位置。即使我使用 with-sdl=... 输入路径,我也注意到例如未找到 sdl-config,因此稍后在编译期间正在编译 SDL 视频设备代码 none。 关于 FFMPEG,PJSIP 是否也适用于 libav?我问这个问题是因为在 Yocto 中我们已经包含了 libav,而对于 FFmpeg 我们必须创建一个自定义配方。
此外,因为我无法获得自动检测所有依赖项的工具,所以我开始 "adventurous" 自己在 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
}
注:我enabled/disabled定义语句相互独立
我发现的是:
- define 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?
我可以猜测为什么找不到 sdl-config:这些项目特定的脚本实际上在交叉编译情况下从不工作,并且通常不在 Yocto 中使用。您应该使用“--with-sdl”(或者修改 configure.ac 以使用 PKG_CHECK_MODULES() 来查找 sdl)。
为什么“--with-sdl”对你不起作用很难说(因为你没有展示你尝试过的东西)但假设他们想要一个带前缀的路径,我希望它能起作用:
--with-sdl=${STAGING_DIR_HOST}${prefix}
STAGING_DIR_HOST 是您当前正在为其构建的系统的 sysroot:如果您的配方中有 libsdl,则在配置运行时它应该在 sysroot 中。
一些 Yocto 版本使用 libav 而不是 ffmpeg,您应该能够依赖于您的 Yocto 拥有的版本并像上面那样使用“--with-ffmpeg”。
linux 上有关 PJSIP 支持的问题可能值得另一个问题——或者如果存在的话,可以在他们的支持论坛上尝试。