baresip android 编译、运行教程2 :视频通话

接着上篇https://blog.csdn.net/Java_lilin/article/details/99450195  写了语音的使用这次写视频

sip客户端的voip 语音识别 https://blog.csdn.net/Java_lilin/article/details/101357324

baresip 源码较为linphone 、pjsip 简单写 如果自己控制音视频比较简单些

(如果觉得麻烦可以去https://item.taobao.com/item.htm?id=606696026272购买个维护好的)

1.编译ffmpeg 在安卓下  启用他默认的libx264  当然也要编译264   本文用的ffmpeg4.1.3  脚本如下注意x264只用到了arm64-v8a 其他的改下

x264

#!/bin/bash
NDK=/opt/ffandroid/android-ndk-r15c/
OUTPUT_DIR=/opt/ffmpeg/test1/x264out/
SOURCE=/opt/ffmpeg/test1/x264/
TEMP_DIR=/opt/ffmpeg/test1/tmp/
#"armeabi-v7a arm64-v8a x86_64 x86"
ARCHS="arm64-v8a"
#ARCHS="armeabi-v7a arm64-v8a x86_64 x86"
CONFIGURE_FLAGS="--enable-static --enable-pic --disable-cli "
PLATFORM=""
TOOLCHAIN=""
CROSS_PREFIX=""
HOST=""
CWD=/opt/ffmpeg/test1/

for ARCH in $ARCHS
do
    echo "building $ARCH..."
    mkdir -p "$TEMP_DIR/$ARCH"
    cd "$TEMP_DIR/$ARCH"
    PREFIX=$OUTPUT_DIR/$ARCH
    case $ARCH in
    armeabi-v7a)
        PLATFORM=$NDK/platforms/android-26/arch-arm/
        TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
        CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
        HOST="arm-linux"
    ;;
    arm64-v8a)
        PLATFORM=$NDK/platforms/android-26/arch-arm64/
        TOOLCHAIN=$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64
        CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
        HOST="aarch64-linux"
    ;;
    x86_64)
        PLATFORM=$NDK/platforms/android-26/arch-x86_64/
        TOOLCHAIN=$NDK/toolchains/x86_64-4.9/prebuilt/darwin-x86_64
        CROSS_PREFIX=$TOOLCHAIN/bin/x86_64-linux-android-
        HOST="x86_64-linux"
    ;;
    x86)
        PLATFORM=$NDK/platforms/android-26/arch-x86/
        TOOLCHAIN=$NDK/toolchains/x86-4.9/prebuilt/darwin-x86_64
        CROSS_PREFIX=$TOOLCHAIN/bin/i686-linux-android-
        HOST="i686-linux"
    ;;
    esac

    echo "platform:$PLATFORM"
    echo "toolchains:$TOOLCHAIN"
    echo "cross-prefix:$CROSS_PREFIX"
    echo "prefix:$PREFIX"
    echo "host:$HOST"

    TMPDIR=${TMPDIR/%\/} /opt/ffmpeg/test1/x264/configure \
      ${CONFIGURE_FLAGS} \
      --prefix=$PREFIX \
      --host=$HOST \
      --cross-prefix=$CROSS_PREFIX \
      --sysroot=$PLATFORM || exit 1
    make -j4 install
    cd $CWD
done


echo Android builds finished
 

========================

#!/bin/sh

MY_LIBS_NAME=ffmpeg-4.1.3
MY_DIR=ffmpeg-4.1.3

# cd ./${MY_DIR}

#编译的过程中产生的中间件的存放目录,为了区分编译目录,源码目录,install目录
MY_BUILD_DIR=binary


NDK_PATH=/opt/ffandroid/android-ndk-r15c
BUILD_PLATFORM=linux-x86_64
TOOLCHAIN_VERSION=4.9
ANDROID_VERSION=26

ANDROID_ARMV5_CFLAGS="-march=armv5te"
ANDROID_ARMV7_CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=neon"  #-mfloat-abi=hard -mfpu=vfpv3-d16 #-mfloat-abi=hard -mfpu=vfp
ANDROID_ARMV8_CFLAGS="-march=armv8-a"
ANDROID_X86_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
ANDROID_X86_64_CFLAGS="-march=x86-64 -msse4.2 -mpopcnt -m64 -mtune=intel"


# params($1:arch,$2:arch_abi,$3:host,$4:cross_prefix,$5:cflags)
build_bin() {

    echo "-------------------star build $2-------------------------"

    ARCH=$1            # arm arm64 x86 x86_64
    ANDROID_ARCH_ABI=$2     # armeabi armeabi-v7a x86 mips

    PREFIX=$(pwd)/dist/${MY_LIBS_NAME}/${ANDROID_ARCH_ABI}/

    HOST=$3
    SYSROOT=${NDK_PATH}/platforms/android-${ANDROID_VERSION}/arch-${ARCH}

    CFALGS=$5


    TOOLCHAIN=${NDK_PATH}/toolchains/${HOST}-${TOOLCHAIN_VERSION}/prebuilt/${BUILD_PLATFORM}
    CROSS_PREFIX=${TOOLCHAIN}/bin/$4-

    # build 中间件
        BUILD_DIR=./${MY_BUILD_DIR}/${ANDROID_ARCH_ABI}

    echo "pwd==$(pwd)"
    echo "ARCH==${ARCH}"
    echo "PREFIX==${PREFIX}"
    echo "HOST==${HOST}"
    echo "SYSROOT=${SYSROOT}"
    echo "CFALGS=$5"
    echo "CFALGS=${CFALGS}"
    echo "TOOLCHAIN==${TOOLCHAIN}"
    echo "CROSS_PREFIX=${CROSS_PREFIX}"

    #echo "-------------------------按任意键继续---------------------"
    #read -n 1
    #echo "-------------------------继续执行-------------------------"

    mkdir -p ${BUILD_DIR}   #创建当前arch_abi的编译目录,比如:binary/armeabi-v7a
                cd ${BUILD_DIR}         #此处 进了当前arch_abi的2级编译目录
    
    cd /opt/ffmpeg/ffmpeg-4.1.3
    echo "pwd==$(pwd)"        

    sh configure \
        --prefix=${PREFIX} \
        --target-os=linux \
        --arch=${ARCH} \
        --sysroot=$SYSROOT \
        --enable-cross-compile \
        --cross-prefix=${CROSS_PREFIX} \
        --extra-cflags="$CFALGS -I/opt/ffmpeg/test1/x264out/arm64-v8a/include -Os -fPIC -DANDROID -Wfatal-errors -Wno-deprecated" \
        --extra-cxxflags="-D__thumb__ -fexceptions -frtti" \
        --extra-ldflags="-L${SYSROOT}/usr/lib -L/opt/ffmpeg/test1/x264out/arm64-v8a/lib" \
        --enable-shared \
        --enable-asm \
        --enable-neon \
        --enable-postproc \
        --enable-gpl \
        --enable-libx264 \
        --enable-encoder=libx264 \
        --enable-encoder=mjpeg \
        --enable-encoder=png \
        --disable-doc \
        --disable-ffmpeg \
        --disable-ffplay \
        --disable-ffprobe \
        --disable-symver \
        --disable-debug \
        --enable-small


    make clean
    make
    make install

    #从当前arch_abi编译目录跳出,对应上面的cd ${BUILD_DIR},以便function多次执行
        cd ../../

    echo "-------------------$2 build end-------------------------"
}
# build armeabi
#build_bin arm armeabi arm-linux-androideabi arm-linux-androideabi "$ANDROID_ARMV5_CFLAGS"

#build armeabi-v7a
#build_bin arm armeabi-v7a arm-linux-androideabi arm-linux-androideabi "$ANDROID_ARMV7_CFLAGS"

#build arm64-v8a
build_bin arm64 arm64-v8a aarch64-linux-android aarch64-linux-android "$ANDROID_ARMV8_CFLAGS"

 

2、编译后在原来的脚本加上 avcodec在编译 

EXTRA_MODULES := avcodec webrtc_aec g711 opensles dtls_srtp opus g7221 zrtp \ stun turn ice presence contact mwi account natpmp \ srtp uuid debug_cmd ilbc

在项目的config 打开avcodec.so

 

3、通过看avformat和opengl 模块发现  主要注册一个src 和显示的就行了  通过看了模块的加载方法 其实主要就是实现以下两个方法 

 vidsrc_register()和 baresip_vidispl();

在项目添加一个按钮先实现src 

点击后照着https://blog.csdn.net/stn_lcd/article/details/74926376 写的吧摄像头nv12的传过来转成ffmpeg的420p 并且放到一个队列里面

队列的创建一个c++类 

 

4.照着avformat的方法写在添加的按钮jni方法添加

vidsrc_register(&mod_avf, baresip_vidsrcl(),   "avformat", alloc, NULL);

主要是实现在alloc 里面读取队列的

照着他的模块avformat.c写

好了添加按钮jni 点击

如果没问题 拨打一个视频就对方就看到了

 

6添加显示的

默认avcodec解码后就成为yuv420的了 注册方法 参考openggl模块写

主要在display方法把数据传到java层  java 用opengl 绘制图像

opengl的绘制就百度找下吧 

 

好了现在在呼叫视频都能看到了

如果有兴趣可以改为mediacodec来编解码  

 

更多交流群:261074724

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章