接着上篇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來編解碼