我是在3.3.2
版本的linphone基础上编译的,
所以取版本的时候要注意。
mediastreamer
本身是一个处理音视频以及流的框架。官方的说明是:
- mediastreamer2/ is one of the important part of linphone. It
is a framework library for audio
and video processing. It contains several objects for grabing
audio and video and outputing
it (through rtp, to file).
It contains also codec objects to compress audio and video
streams.
The mediastream.h files contain routines to
easyly setup audio streams.
需求的库比较多, 一般说来有这么几个:
oRTP
speex
ffmpeg
libv4l
其中,
speex还需要ogg的支持。 而ffmpeg是很强大的编解码库,
libv4l仿佛是给摄像头用的。在本文中, 我们不讨论ffmpeg 和libv4l的编译。
oRTP之前已经讨论过了(参考http://blog.sina.com.cn/s/blog_4868f98601017dr8.html)。本文只讨论speex、ogg和mediastreamer2
OGG编译方法和脚本编写:
这个没什么难度,直接上脚本:
#!/bin/sh
export TMPDIR="/tmp/"
export PRJ_ROOT="/home/hl/linphone"
export NDKROOT="/opt/android-ndk-r8c"
export PREBUILT=$NDKROOT/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86
CC=$PREBUILT/bin/arm-linux-androideabi-gcc
export CC
CFLAGS="--sysroot=$NDKROOT/platforms/android-9/arch-arm -fPIC -DANDROID -DHAVE_PTHREAD -mfpu=neon -mfloat-abi=softfp -I$NDKROOT/platforms/android-9/arch-arm/usr/include"
export CFLAGS
LDFLAGS="-Wl,-T,$PREBUILT/arm-linux-androideabi/lib/ldscripts/armelf_linux_eabi.x -Wl,-rpath-link=$NDKROOT/platforms/android-9/arch-arm/usr/lib -L$NDKROOT/platforms/android-9/arch-arm/usr/lib -nostdlib -lc -lm -ldl -lgcc"
export LDFLAGS
./configure --prefix=$PRJ_ROOT/libs --host=arm-linux --disable-shared --enable-static --disable-strict(最后这个貌似没有用,不过加上也没关系)
执行完成后直接make 然后make install即可
我在编译ogg的时候没有遇到任何问题,
真是难得的令人愉悦啊!!!
SPEEX编译方法和脚本编写
注意:
1)在安装完ogg之后 , 需要在--with-ogg的参数中指定 ogg安装目录
2)ndk的头文件下面/sys目录没有soundcard.h头文件,编译会报错。(但是/linux目录下面有)解决的方法和oSIP中一样, 如法炮制—— 把linux下面的头文件拷贝到sys下面去
#!/bin/sh
export TMPDIR="/tmp/"
export NDKROOT="/opt/android-ndk-r8c"
export PRJ_ROOT="/home/hl/linphone"
export PREBUILT=$NDKROOT/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86
CC=$PREBUILT/bin/arm-linux-androideabi-gcc
export CC
CFLAGS="--sysroot=$NDKROOT/platforms/android-9/arch-arm -fPIC -DANDROID -DHAVE_PTHREAD -mfpu=neon -mfloat-abi=softfp -I$NDKROOT/platforms/android-9/arch-arm/usr/include"
export CFLAGS
LDFLAGS="-Wl,-T,$PREBUILT/arm-linux-androideabi/lib/ldscripts/armelf_linux_eabi.x -Wl,-rpath-link=$NDKROOT/platforms/android-9/arch-arm/usr/lib -L$NDKROOT/platforms/android-9/arch-arm/usr/lib -nostdlib -lc -lm -ldl -lgcc"
export LDFLAGS
./configure --prefix=$PRJ_ROOT/libs --host=arm-linux --disable-shared --enable-static --disable-strict --disable-oggtest --with-ogg=/$PRJ_ROOT/libs/
执行完脚本之后,make ;make install即可
SPEEX编译过程中的问题:
1)speexdec.c:65:27: fatal error: sys/soundcard.h: No such file or directory
这个是ndk的头文件下面/sys目录没有这个头文件导致的。(但是/linux目录下面有)解决的方法和oSIP中一样, 如法炮制—— 把linux下面的头文件拷贝到sys下面去
MEDIASTREAMER2
编译方法和脚本编写:
好了,speex和ogg编译完成之后, 连同之前的oRTP。
我们就可以来编译mediastreamer2
脚本:
#!/bin/sh
export TMPDIR="/tmp/"
export NDKROOT="/opt/android-ndk-r8c"
export PRJ_ROOT="/home/hl/linphone"
export PREBUILT=$NDKROOT/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86
CC=$PREBUILT/bin/arm-linux-androideabi-gcc
export CC
CFLAGS="--sysroot=$NDKROOT/platforms/android-9/arch-arm -fPIC -DHAVE_PTHREAD -mfpu=neon -mfloat-abi=softfp -I$NDKROOT/platforms/android-9/arch-arm/usr/include"
export CFLAGS
LDFLAGS="-Wl,-T,$PREBUILT/arm-linux-androideabi/lib/ldscripts/armelf_linux_eabi.x -Wl,-rpath-link=$NDKROOT/platforms/android-9/arch-arm/usr/lib -L$NDKROOT/platforms/android-9/arch-arm/usr/lib -nostdlib -lc -lm -ldl -lgcc -llog -lstdc++"
export LDFLAGS
#相关库的环境变量设置
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$PRJ_ROOT/libs/lib/pkgconfig/
ORTP_CFLAGS=$(pkg-config --cflags ortp)
export ORTP_CFLAGS
ORTP_LIBS=$(pkg-config --libs ortp)
export ORTP_LIBS
SPEEX_CFLAGS=$(pkg-config --cflags speex)
export SPEEX_CFLAGS
SPEEX_LIBS=$(pkg-config --libs speex)
export SPEEX_LIBS
SPEEXDSP_CFLAGS=$(pkg-config --cflags speexdsp)
export SPEEXDSP_CFLAGS
SPEEXDSP_LIBS=$(pkg-config --libs speexdsp)
export SPEEXDSP_LIBS
./configure --prefix=$PRJ_ROOT/libs --host=arm-linux --disable-gsm --disable-libv4l --disable-ffmpeg--enable-external-ortp--disable-shared --enable-static
注意: 这个版本中剪切掉了 ffmpeg、gsm、libv4l不知道会不会对今后造成影响
如果需要这部分功能, 请单独编译并且修改配置
MEDIASTREAMER2编译过程中的问题
1)videoenc.c:833:17:
error: 'mblk_t' has no member named
'reserved3'
类似的还有:
msvideo.c: In function 'yuv_buf_init_from_mblk':
msvideo.c:215:6: error: 'mblk_t' has no member named 'reserved3'
仔细寻找之后发现应该是在这里:
oRTP/include/ortpstr_utils.h
typedef struct msgb
{
struct msgb *b_prev;
struct msgb *b_next;
struct msgb *b_cont;
struct datab *b_datap;
unsigned char *b_rptr;
unsigned char *b_wptr;
uint32_t reserved1;
uint32_t reserved2;
} mblk_t;
可见确实没有'reserved3'-'reserved5'
出现这个问题是由于 oRTP版本 和mediastreamer2版本不一致导致的, 这种情况下需要检查一下mediastreamer2的版本和oRTP是否对应
2)ld: error: cannot find -lpthread
NDK本身就没有thread库 。 所以这个-lpthread是多余的、
原因应该在于 configure.ac文件中 有这么一句;
LIBS="$LIBS -pthread -lpthread"
在configure文件里面也能看见它:
在16076行:
解决办法就是修改成:LIBS="$LIBS"
3)error: undefined reference to '__android_log_vprint'
这个应该是少链接了 log。增加 -llog可以解决
4) error: undefined reference to 'speex_.....'
这个应该是 speex库没有链接进去。
检查下SPEEX_CFLAGS看看
5)in function ms_snd_card_descs:mscommon.c(.data.rel.ro+0x4): error: undefined reference to 'msandroid_sound_card_desc'
仔细比较了一下 3.3.2的mediastreamer之后发现, 源代码中时没有这一段的, 这个估计是windows版linphone在编译的时候引入的, 所以处理办法就是把mscommon.c相关的这段代码注视掉
6)libtool: link: cannot find the library `../../oRTP/src/libortp.la' or unhandled argument `../../oRTP/src/libortp.la'
明明已经写了ORTP_CFLAGS和ORTP_LIBS怎么还会到不相关的目录区寻找?
仔细观察一下 configure文件的第18140行:
if test "$external_ortp" = 'false'; then
if test -e $srcdir/../oRTP/include/ortp/ortp.h ; then
echo "building from linphone source tree, using ../oRTP/include/ortp/ortp.h"
ORTP_CFLAGS="-I\$(top_srcdir)/../oRTP/include"
ORTP_LIBS="\$(top_builddir)/../oRTP/src/libortp.la"
if test x$ac_cv_c_bigendian = xyes ; then
ORTP_CFLAGS="$ORTP_CFLAGS -DORTP_BIGENDIAN"
fi
else
external_ortp=true
fi
fi
也就是说$external_ortp" = 'false'的情况下会去这个目录去寻找,
是这个条件成立的方法就是在config文件里面增加 一个选项:
--enable-external-ortp