接着上篇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来编解码