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

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