编译适配纯鸿蒙系统的ijkplayer中的ffmpeg库

    目前bilibili官方的ijkplayer播放器,是只适配Android和IOS系统的。而华为接下来即将发布纯harmony系统,是否有基于harmony系统的ijkplayer可以使用呢?

    鸿蒙版ijkplayer播放器是哪个,如何使用,这个问题,大家可以参考我另一个技术号的文章先行了解一下:鸿蒙版ijkplayer播放器示例工程适配运行

    不过上述提到的这个被鸿蒙化的ijkplayer播放器,里面的ffmpeg库是以已经编译好的ffmpeg的动态库集成进去的。对于需要修改ffmpeg代码的人来说,还需要知道如何编译适配harmony系统的ffmpeg库,从而来替代这个鸿蒙版ijkplayer中的ffmpeg库。

    因此本文想要讲解的重点是,如何从之前的安卓版的ijkplayer仓库中,将ffmpeg编译出适配harmony系统的动态库。

一、基于openHarmony环境编译开源库

    在本文主题正式开始之前,大家也可以通过我另一个技术号的这篇文章,需要先行了解一下如何基于openHarmony环境编译适配harmony系统的动态库:

    基于openHarmony环境编译开源库

二、编译前准备

    编译之前,需要搭建的编译环境,需要下载的工具等。可以先大致参考之前安卓版本的编译环境,可从这篇文章中先行了解一下编译环境即可:ijkplayer编译流程详解

    PS:其中与安卓相关的配置可以不用做。因为对应的是需要下载鸿蒙的编译工具链和文件系统等。

三、修改编译脚本

    我们从上述二中的安卓版的ijkplayer仓库中,对主要编译脚本进行修改,来进行适配。

    主要需要修改的就是android\contrib\tools下的三个脚本:do-compile-openssl.sh、do-compile-ffmpeg.sh和do-detect-env.sh。

    在修改这3个脚本之前,根据“一”中文章所述,先提前下载好鸿蒙的交叉编译工具和文件系统,并在这3个脚本的编译前置脚本中(compile-openssl.sh和compile-ffmpeg.sh),将交叉工具链和文件系统的路径export出来,或者在全局环境变量/etc/profile配置文件export出来路径,如下:

export OHOS_SYSROOT=/home/weekend/openharmony/ohos-sdk/linux/native/sysroot
export OHOS_LLVM=/home/weekend/openharmony/ohos-sdk/linux/native/llvm

    OHOS_SYSROOT和OHOS_LLVM变量在后续的脚本中都是需要的。

1、修改do-detect-env.sh

    do-detect-env.sh脚本主要用来检测编译环境的,在安卓版本中,会检查安卓sdk版本,ndk之类的。在鸿蒙版本中这些就都不需要了。我将这些都去掉。

    然后增加鸿蒙的编译工具链和文件系统的检查,如下:

if [ -z "$OHOS_LLVM" ]; thenecho "You must define OHOS_LLVM before starting."echo "sysroot and llvm is necessary.\n"exit 1
fiif [ -z "$OHOS_SYSROOT" ]; thenecho "You must define OHOS_SYSROOT before starting."echo "sysroot and llvm is necessary.\n"exit 1
fi

    实际上,我在3个脚本的开头处,都会对这个进行检查。

    附上完整的修改后的 do-detect-env.sh:

#! /usr/bin/env bash
#
#--------------------
set -e
UNAME_S=$(uname -s)
UNAME_SM=$(uname -sm)
echo "build on $UNAME_SM"echo "OHOS_SYSROOT=$OHOS_SYSROOT"
echo "OHOS_LLVM=$OHOS_LLVM"if [ -z "$OHOS_LLVM" ]; thenecho "You must define OHOS_LLVM before starting."echo "sysroot and llvm is necessary.\n"exit 1
fiif [ -z "$OHOS_SYSROOT" ]; thenecho "You must define OHOS_SYSROOT before starting."echo "sysroot and llvm is necessary.\n"exit 1
fi# try to detect NDK version
export IJK_GCC_VER=4.9
export IJK_GCC_64_VER=4.9
export IJK_MAKE_TOOLCHAIN_FLAGS=
export IJK_MAKE_FLAG=case "$UNAME_S" inDarwin)export IJK_MAKE_FLAG=-j`sysctl -n machdep.cpu.thread_count`;;CYGWIN_NT-*)IJK_WIN_TEMP="$(cygpath -am /tmp)"export TEMPDIR=$IJK_WIN_TEMP/echo "Cygwin temp prefix=$IJK_WIN_TEMP/";;
esac

2、修改do-compile-openssl.sh

    do-compile-openssl.sh根据“二”中描述,主要是用于编译openssl的。根据上述“一”中的文章所述,主要是需要修改交叉编译工具链,和文件系统。

    将安卓NDK和交叉编译工具链相关的去掉,FF_CROSS_PREFIX=aarch64-linux-android这个是安卓的交叉工具链头,用的gcc。修改为export CC 后面跟着鸿蒙的交叉工具链是llvm目录下的clang,然后target=aarch64-linux-ohos,指明是64位的。

CLANG=$OHOS_LLVM/bin/clangexport CC="$CLANG $OHOS_CFLAGS"
export CFLAGS="$OHOS_CFLAGS --sysroot=${OHOS_SYSROOT}"

    安卓的脚本中有FF_TOOLCHAIN_TOUCH,主要是安卓的ndk中提供的用于交叉编译的一些工具包。在鸿蒙的编译中,这一块就不需要了,直接去掉。就是下面这段是不需要了的:

FF_MAKE_TOOLCHAIN_FLAGS=$IJK_MAKE_TOOLCHAIN_FLAGS
FF_MAKE_FLAGS=$IJK_MAKE_FLAGFF_MAKE_TOOLCHAIN_FLAGS="$FF_MAKE_TOOLCHAIN_FLAGS --install-dir=$FF_TOOLCHAIN_PATH"
FF_TOOLCHAIN_TOUCH="$FF_TOOLCHAIN_PATH/touch"
if [ ! -f "$FF_TOOLCHAIN_TOUCH" ]; then$ANDROID_NDK/build/tools/make-standalone-toolchain.sh \$FF_MAKE_TOOLCHAIN_FLAGS \--platform=$FF_ANDROID_PLATFORM \--toolchain=$FF_TOOLCHAIN_NAMEtouch $FF_TOOLCHAIN_TOUCH;
fi

    只需要在后面编译的时候,指明CFLAGS=--sysroot=xxx,跟着鸿蒙的文件系统目录。

export CFLAGS="$OHOS_CFLAGS --sysroot=${OHOS_SYSROOT}"

    为了确保编译,可以将这些关键的编译相关的都export出来,如下:

export CC="$CLANG $OHOS_CFLAGS"
export CXX="$CLANGXX $OHOS_CFLAGS"
export AR=${OHOS_AR}
export AS=${OHOS_AS}
export NM=${OHOS_NM}
export STRIP=${OHOS_STRIP}
export RANLIB=${OHOS_RANLIB}
export LD=${OHOS_LD}
export LDFLAGS="--rtlib=compiler-rt -fuse-ld=lld"
export CFLAGS="$OHOS_CFLAGS --sysroot=${OHOS_SYSROOT}"

    附上完整的do-compile-openssl.sh供参考,我暂时只保留是arm的32位,64位和x86的64位这三个常用的cpu架构编译。具体如下:

#! /usr/bin/env bash
#--------------------
set -e
if [ -z "$OHOS_LLVM" ]; thenecho "You must define OHOS_LLVM before starting."echo "sysroot and llvm is necessary.\n"exit 1
fiif [ -z "$OHOS_SYSROOT" ]; thenecho "You must define OHOS_SYSROOT before starting."echo "sysroot and llvm is necessary.\n"exit 1
fi#--------------------
# common defines
FF_ARCH=$1
if [ -z "$FF_ARCH" ]; thenecho "You must specific an architecture 'arm, armv7a, x86, ...'.\n"exit 1
fiFF_BUILD_ROOT=`pwd`FF_BUILD_NAME=
FF_SOURCE=
FF_CROSS_PREFIX=FF_CFG_FLAGS=
FF_PLATFORM_CFG_FLAGS=FF_EXTRA_CFLAGS=
FF_EXTRA_LDFLAGS=# compile
CLANG=$OHOS_LLVM/bin/clang
CLANGXX=$OHOS_LLVM/bin/clang++
OHOS_AR=$OHOS_LLVM/bin/llvm-ar
OHOS_AS=$OHOS_LLVM/bin/llvm-as
OHOS_NM=$OHOS_LLVM/bin/llvm-nm
OHOS_RANLIB=$OHOS_LLVM/bin/llvm-ranlib
OHOS_STRIP=$OHOS_LLVM/bin/llvm-strip
OBJDUMP=$OHOS_LLVM/bin/llvm-objdump
OHOS_LD=$OHOS_LLVM/bin/ld.lldOHOS_LIBS="-L${OHOS_LLVM}/lib"
OHOS_INCS="-I${OHOS_LLVM}/include"OHOS_CFLAGS=#--------------------
echo ""
echo "--------------------"
echo "[*] do detect env"
echo "--------------------"
. ./tools/do-detect-env.sh
FF_MAKE_FLAGS=$IJK_MAKE_FLAG#----- armv7a begin -----
if [ "$FF_ARCH" = "armv7a" ]; thenFF_BUILD_NAME=openssl-armv7aFF_SOURCE=$FF_BUILD_ROOT/$FF_BUILD_NAMEFF_PLATFORM_CFG_FLAGS="linux-armv4"OHOS_CFLAGS="--target=arm-linux-ohos -march=armv7-a"elif [ "$FF_ARCH" = "arm64" ]; thenFF_BUILD_NAME=openssl-arm64FF_SOURCE=$FF_BUILD_ROOT/$FF_BUILD_NAMEFF_PLATFORM_CFG_FLAGS="linux-aarch64"OHOS_CFLAGS="--target=aarch64-linux-ohos"elif [ "$FF_ARCH" = "x86_64" ]; thenFF_BUILD_NAME=openssl-x86_64FF_SOURCE=$FF_BUILD_ROOT/$FF_BUILD_NAMEFF_PLATFORM_CFG_FLAGS="linux-x86_64"OHOS_CFLAGS="--target=x86_64-linux-ohos"elseecho "unknown architecture $FF_ARCH";exit 1
fiFF_SYSROOT=$OHOS_SYSROOT
FF_PREFIX=$FF_BUILD_ROOT/build/$FF_BUILD_NAME/outputmkdir -p $FF_PREFIX
# mkdir -p $FF_SYSROOT#--------------------
echo ""
echo "--------------------"
echo "[*] check openssl env"
echo "--------------------"
export CC="$CLANG $OHOS_CFLAGS"
export CXX="$CLANGXX $OHOS_CFLAGS"
export AR=${OHOS_AR}
export AS=${OHOS_AS}
export NM=${OHOS_NM}
export STRIP=${OHOS_STRIP}
export RANLIB=${OHOS_RANLIB}
export LD=${OHOS_LD}
export LDFLAGS="--rtlib=compiler-rt -fuse-ld=lld"
export CFLAGS="$OHOS_CFLAGS --sysroot=${OHOS_SYSROOT}"
export COMMON_FF_CFG_FLAGS=FF_CFG_FLAGS="$FF_CFG_FLAGS $COMMON_FF_CFG_FLAGS"#--------------------
# Standard options:
FF_CFG_FLAGS="$FF_CFG_FLAGS zlib-dynamic"
FF_CFG_FLAGS="$FF_CFG_FLAGS no-asm"
FF_CFG_FLAGS="$FF_CFG_FLAGS no-shared"
FF_CFG_FLAGS="$FF_CFG_FLAGS -fPIC"
FF_CFG_FLAGS="$FF_CFG_FLAGS --openssldir=$FF_PREFIX"
FF_CFG_FLAGS="$FF_CFG_FLAGS $FF_PLATFORM_CFG_FLAGS"#--------------------
echo ""
echo "--------------------"
echo "[*] configurate openssl"
echo "--------------------"
cd $FF_SOURCE
#if [ -f "./Makefile" ]; then
#    echo 'reuse configure'
#elseecho "./Configure $FF_CFG_FLAGS"./Configure $FF_CFG_FLAGS
#fi#--------------------
echo ""
echo "--------------------"
echo "[*] compile openssl"
echo "--------------------"
make depend
make $FF_MAKE_FLAGS
make install_sw#--------------------
echo ""
echo "--------------------"
echo "[*] link openssl"
echo "--------------------"

3、修改do-compile-ffmpeg.sh

    这个脚本就是真正编译ffmpeg的了,与“2”中的openssl类似,主要是需要修改交叉编译工具链,和文件系统。

    同样的与安卓相关的FF_TOOLCHAIN_TOUCH这一段可以去掉的:

FF_TOOLCHAIN_TOUCH="$FF_TOOLCHAIN_PATH/touch"
if [ ! -f "$FF_TOOLCHAIN_TOUCH" ]; then$ANDROID_NDK/build/tools/make-standalone-toolchain.sh \$FF_MAKE_TOOLCHAIN_FLAGS \--platform=$FF_ANDROID_PLATFORM \--toolchain=$FF_TOOLCHAIN_NAMEtouch $FF_TOOLCHAIN_TOUCH;
fi

    将交叉编译工具链中提供的工具等,都export出来,这些可能有些不一定用到,但是export出来有利无害:   

CLANG=$OHOS_LLVM/bin/clang
CLANGXX=$OHOS_LLVM/bin/clang++
OHOS_AR=$OHOS_LLVM/bin/llvm-ar
OHOS_AS=$OHOS_LLVM/bin/llvm-as
OHOS_NM=$OHOS_LLVM/bin/llvm-nm
OHOS_RANLIB=$OHOS_LLVM/bin/llvm-ranlib
OHOS_STRIP=$OHOS_LLVM/bin/llvm-strip
OBJDUMP=$OHOS_LLVM/bin/llvm-objdump
OHOS_LD=$OHOS_LLVM/bin/ld.lldOHOS_LIBS="-L${OHOS_LLVM}/lib"
OHOS_INCS="-I${OHOS_LLVM}/include"

    同样的将安卓NDK和交叉编译工具链相关的去掉,以arm的64位为例,FF_CROSS_PREFIX=aarch64-linux-android这个是安卓的交叉工具链头,修改为export CC 后面跟着鸿蒙的交叉工具链是llvm目录下的clang,然后FF_EXTRA_CFLAGS和FF_EXTRA_LDFLAGS需要target=aarch64-linux-ohos,指明是64位的,如下:

    FF_EXTRA_CFLAGS="$FF_EXTRA_CFLAGS --target=x86_64-linux-ohos"FF_EXTRA_LDFLAGS="$FF_EXTRA_LDFLAGS --target=x86_64-linux-ohos"

    还需要将相关的系统所需头文件,lib库等指明,用于后续编译链接使用:

 OHOS_LIBS="$OHOS_LIBS -L${OHOS_SYSROOT}/usr/lib/aarch64-linux-ohos"OHOS_INCS="$OHOS_INCS -I${OHOS_SYSROOT}/usr/include/aarch64-linux-ohos"

    后续会用到CC、LD、AR、STRIP这些,需要都指明一下:

export CC=${CLANG}
export LD=${OHOS_LD}
export AR=${OHOS_AR}
export STRIP=${OHOS_STRIP}

    在ffmpeg的configure中,需要加上--cc,--ld,--strip,如下:

if [ -f "./config.h" ]; thenecho 'reuse configure'
elsewhich $CC./configure $FF_CFG_FLAGS \--cc=${CLANG} \--ld=${CLANG} \--strip=${STRIP} \--extra-cflags="$FF_CFLAGS $FF_EXTRA_CFLAGS" \--extra-ldflags="$FF_DEP_LIBS $FF_EXTRA_LDFLAGS"make clean
fi

    然后在最后的CC编译链接成动态库中,需要将刚才的OHOS_LIBS和OHOS_INCS都加上,不然编译链接会报找不到一些系统的基本库之类。同时为了保持跟鸿蒙版ijkplayer中的ffmpeg库名字一致,将库名改为.z.so结尾。(这个貌似是无所谓的)。如下:

$CC -lm -lz -shared --sysroot=$FF_SYSROOT -Wl,--no-undefined -Wl,-z,noexecstack $FF_EXTRA_LDFLAGS \-Wl,-soname,libqfffmpeg.z.so \$FF_C_OBJ_FILES \$FF_ASM_OBJ_FILES \$OHOS_LIBS \$OHOS_INCS \$FF_DEP_LIBS \-o $FF_PREFIX/libqfffmpeg.z.so

    另外在编译过程中发现--enable-asm和--enable-inline-asm打开的话,会编译不过,所以这2个改为disable的:

    FF_CFG_FLAGS="$FF_CFG_FLAGS --disable-asm"FF_CFG_FLAGS="$FF_CFG_FLAGS --disable-inline-asm"

    附上完整的do-compile-ffmpeg.sh供参考,我暂时只保留是arm的32位,64位和x86的64位这三个常用的cpu架构编译。具体如下:

#! /usr/bin/env bash
#
#--------------------
echo "===================="
echo "[*] build ffmpeg and check env $1"
echo "===================="
set -e#--------------------
# common defines
FF_ARCH=$1
FF_BUILD_OPT=$2
echo "FF_ARCH=$FF_ARCH"
echo "FF_BUILD_OPT=$FF_BUILD_OPT"
if [ -z "$FF_ARCH" ]; thenecho "You must specific an architecture 'arm, armv7a, x86, ...'."echo ""exit 1
fiif [ -z "$OHOS_LLVM" ]; thenecho "You must define OHOS_LLVM before starting."echo "sysroot and llvm is necessary.\n"exit 1
fiif [ -z "$OHOS_SYSROOT" ]; thenecho "You must define OHOS_SYSROOT before starting."echo "sysroot and llvm is necessary.\n"exit 1
fiFF_BUILD_ROOT=`pwd`FF_BUILD_NAME=
FF_SOURCE=
FF_CROSS_PREFIX=
FF_DEP_OPENSSL_INC=
FF_DEP_OPENSSL_LIB=FF_DEP_LIBSOXR_INC=
FF_DEP_LIBSOXR_LIB=FF_CFG_FLAGS=FF_EXTRA_CFLAGS=
FF_EXTRA_LDFLAGS=
FF_DEP_LIBS=FF_MODULE_DIRS="compat libavcodec libavfilter libavformat libavutil libswresample libswscale"
FF_ASSEMBLER_SUB_DIRS=#--------------------
echo ""
echo "--------------------"
echo "[*] do detect env"
echo "--------------------"
. ./tools/do-detect-env.sh
FF_MAKE_FLAGS=$IJK_MAKE_FLAG# compile
CLANG=$OHOS_LLVM/bin/clang
CLANGXX=$OHOS_LLVM/bin/clang++
OHOS_AR=$OHOS_LLVM/bin/llvm-ar
OHOS_AS=$OHOS_LLVM/bin/llvm-as
OHOS_NM=$OHOS_LLVM/bin/llvm-nm
OHOS_RANLIB=$OHOS_LLVM/bin/llvm-ranlib
OHOS_STRIP=$OHOS_LLVM/bin/llvm-strip
OBJDUMP=$OHOS_LLVM/bin/llvm-objdump
OHOS_LD=$OHOS_LLVM/bin/ld.lldOHOS_LIBS="-L${OHOS_LLVM}/lib"
OHOS_INCS="-I${OHOS_LLVM}/include"#----- armv7a begin -----
if [ "$FF_ARCH" = "armv7a" ]; thenFF_BUILD_NAME=ffmpeg-armv7aFF_BUILD_NAME_OPENSSL=openssl-armv7aFF_BUILD_NAME_LIBSOXR=libsoxr-armv7aFF_SOURCE=$FF_BUILD_ROOT/$FF_BUILD_NAMEFF_CFG_FLAGS="$FF_CFG_FLAGS --arch=arm --cpu=cortex-a8"FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-neon"FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-thumb"OHOS_LIBS="$OHOS_LIBS -L${OHOS_SYSROOT}/usr/lib/arm-linux-ohos"OHOS_INCS="$OHOS_INCS -I${OHOS_SYSROOT}/usr/include/arm-linux-ohos"FF_EXTRA_CFLAGS="$FF_EXTRA_CFLAGS -march=armv7-a -mcpu=cortex-a8 -mfpu=vfpv3-d16 -mfloat-abi=softfp -mthumb --target=arm-linux-ohos"FF_EXTRA_LDFLAGS="$FF_EXTRA_LDFLAGS -Wl,--fix-cortex-a8 --target=arm-linux-ohos"FF_ASSEMBLER_SUB_DIRS="arm"elif [ "$FF_ARCH" = "arm64" ]; thenFF_BUILD_NAME=ffmpeg-arm64FF_BUILD_NAME_OPENSSL=openssl-arm64FF_BUILD_NAME_LIBSOXR=libsoxr-arm64FF_SOURCE=$FF_BUILD_ROOT/$FF_BUILD_NAMEFF_CFG_FLAGS="$FF_CFG_FLAGS --arch=aarch64 --enable-yasm"OHOS_LIBS="$OHOS_LIBS -L${OHOS_SYSROOT}/usr/lib/aarch64-linux-ohos"OHOS_INCS="$OHOS_INCS -I${OHOS_SYSROOT}/usr/include/aarch64-linux-ohos"FF_EXTRA_CFLAGS="$FF_EXTRA_CFLAGS --target=aarch64-linux-ohos"FF_EXTRA_LDFLAGS="$FF_EXTRA_LDFLAGS --target=aarch64-linux-ohos"FF_ASSEMBLER_SUB_DIRS="aarch64 neon"elif [ "$FF_ARCH" = "x86_64" ]; thenFF_BUILD_NAME=ffmpeg-x86_64FF_BUILD_NAME_OPENSSL=openssl-x86_64FF_BUILD_NAME_LIBSOXR=libsoxr-x86_64FF_SOURCE=$FF_BUILD_ROOT/$FF_BUILD_NAMEFF_CFG_FLAGS="$FF_CFG_FLAGS --arch=x86_64 --enable-yasm"OHOS_LIBS="$OHOS_LIBS -L${OHOS_SYSROOT}/usr/lib/x86_64-linux-ohos"OHOS_INCS="$OHOS_INCS -I${OHOS_SYSROOT}/usr/include/x86_64-linux-ohos"FF_EXTRA_CFLAGS="$FF_EXTRA_CFLAGS --target=x86_64-linux-ohos"FF_EXTRA_LDFLAGS="$FF_EXTRA_LDFLAGS --target=x86_64-linux-ohos"FF_ASSEMBLER_SUB_DIRS="x86"	elseecho "unknown architecture $FF_ARCH";exit 1
fiif [ ! -d $FF_SOURCE ]; thenecho ""echo "!! ERROR"echo "!! Can not find FFmpeg directory for $FF_BUILD_NAME"echo "!! Run 'sh init-android.sh' first"echo ""exit 1
fiFF_SYSROOT=$OHOS_SYSROOT
FF_PREFIX=$FF_BUILD_ROOT/build/$FF_BUILD_NAME/output
FF_DEP_OPENSSL_INC=$FF_BUILD_ROOT/build/$FF_BUILD_NAME_OPENSSL/output/include
FF_DEP_OPENSSL_LIB=$FF_BUILD_ROOT/build/$FF_BUILD_NAME_OPENSSL/output/lib
FF_DEP_LIBSOXR_INC=$FF_BUILD_ROOT/build/$FF_BUILD_NAME_LIBSOXR/output/include
FF_DEP_LIBSOXR_LIB=$FF_BUILD_ROOT/build/$FF_BUILD_NAME_LIBSOXR/output/libcase "$UNAME_S" inCYGWIN_NT-*)FF_SYSROOT="$(cygpath -am $FF_SYSROOT)"FF_PREFIX="$(cygpath -am $FF_PREFIX)";;
esacmkdir -p $FF_PREFIX
# mkdir -p $FF_SYSROOT#--------------------
echo ""
echo "--------------------"
echo "[*] check ffmpeg env"
echo "--------------------"
export CC=${CLANG}
export LD=${OHOS_LD}
export AR=${OHOS_AR}
export STRIP=${OHOS_STRIP}FF_CFLAGS="-O3 -Wall -pipe \-std=c99 \-ffast-math \-fstrict-aliasing -Werror=strict-aliasing \-Wno-psabi -Wa,--noexecstack \-DANDROID -DNDEBUG"# cause av_strlcpy crash with gcc4.7, gcc4.8
# -fmodulo-sched -fmodulo-sched-allow-regmoves# --enable-thumb is OK
#FF_CFLAGS="$FF_CFLAGS -mthumb"# not necessary
#FF_CFLAGS="$FF_CFLAGS -finline-limit=300"export COMMON_FF_CFG_FLAGS=
. $FF_BUILD_ROOT/config/module.sh#--------------------
# with openssl
if [ -f "${FF_DEP_OPENSSL_LIB}/libssl.a" ]; thenecho "OpenSSL detected"
# FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-nonfree"FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-openssl"FF_CFLAGS="$FF_CFLAGS -I${FF_DEP_OPENSSL_INC}"FF_DEP_LIBS="$FF_DEP_LIBS -L${FF_DEP_OPENSSL_LIB} -lssl -lcrypto"
fiFF_CFG_FLAGS="$FF_CFG_FLAGS $COMMON_FF_CFG_FLAGS"#--------------------
# Standard options:
FF_CFG_FLAGS="$FF_CFG_FLAGS --prefix=$FF_PREFIX"# Advanced options (experts only):
FF_CFG_FLAGS="$FF_CFG_FLAGS "
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-cross-compile"
FF_CFG_FLAGS="$FF_CFG_FLAGS --target-os=linux"
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-pic"
# FF_CFG_FLAGS="$FF_CFG_FLAGS --disable-symver"if [ "$FF_ARCH" = "x86" ]; thenFF_CFG_FLAGS="$FF_CFG_FLAGS --disable-asm"
else# Optimization options (experts only):FF_CFG_FLAGS="$FF_CFG_FLAGS --disable-asm"FF_CFG_FLAGS="$FF_CFG_FLAGS --disable-inline-asm"
ficase "$FF_BUILD_OPT" indebug)FF_CFG_FLAGS="$FF_CFG_FLAGS --disable-optimizations"FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-debug"FF_CFG_FLAGS="$FF_CFG_FLAGS --disable-small";;*)FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-optimizations"FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-debug"FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-small";;
esac#--------------------
echo ""
echo "--------------------"
echo "[*] configurate ffmpeg"
echo "--------------------"
cd $FF_SOURCE
if [ -f "./config.h" ]; thenecho 'reuse configure'
elsewhich $CC./configure $FF_CFG_FLAGS \--cc=${CLANG} \--ld=${CLANG} \--strip=${STRIP} \--extra-cflags="$FF_CFLAGS $FF_EXTRA_CFLAGS" \--extra-ldflags="$FF_DEP_LIBS $FF_EXTRA_LDFLAGS"make clean
fi#--------------------
echo ""
echo "--------------------"
echo "[*] compile ffmpeg"
echo "--------------------"
cp config.* $FF_PREFIX
make $FF_MAKE_FLAGS > /dev/null
make install
mkdir -p $FF_PREFIX/include/libffmpeg
cp -f config.h $FF_PREFIX/include/libffmpeg/config.h#--------------------
echo ""
echo "--------------------"
echo "[*] link ffmpeg"
echo "--------------------"
echo $FF_EXTRA_LDFLAGSFF_C_OBJ_FILES=
FF_ASM_OBJ_FILES=
for MODULE_DIR in $FF_MODULE_DIRS
doC_OBJ_FILES="$MODULE_DIR/*.o"if ls $C_OBJ_FILES 1> /dev/null 2>&1; thenecho "link $MODULE_DIR/*.o"FF_C_OBJ_FILES="$FF_C_OBJ_FILES $C_OBJ_FILES"fifor ASM_SUB_DIR in $FF_ASSEMBLER_SUB_DIRSdoASM_OBJ_FILES="$MODULE_DIR/$ASM_SUB_DIR/*.o"if ls $ASM_OBJ_FILES 1> /dev/null 2>&1; thenecho "link $MODULE_DIR/$ASM_SUB_DIR/*.o"FF_ASM_OBJ_FILES="$FF_ASM_OBJ_FILES $ASM_OBJ_FILES"fidone
done$CC -lm -lz -shared --sysroot=$FF_SYSROOT -Wl,--no-undefined -Wl,-z,noexecstack $FF_EXTRA_LDFLAGS \-Wl,-soname,libqfffmpeg.z.so \$FF_C_OBJ_FILES \$FF_ASM_OBJ_FILES \$OHOS_LIBS \$OHOS_INCS \$FF_DEP_LIBS \-o $FF_PREFIX/libqfffmpeg.z.somysedi() {f=$1exp=$2n=`basename $f`cp $f /tmp/$nsed $exp /tmp/$n > $frm /tmp/$n
}echo ""
echo "--------------------"
echo "[*] create files for shared ffmpeg"
echo "--------------------"
rm -rf $FF_PREFIX/shared
mkdir -p $FF_PREFIX/shared/lib/pkgconfig
ln -s $FF_PREFIX/include $FF_PREFIX/shared/include
ln -s $FF_PREFIX/libqfffmpeg.z.so $FF_PREFIX/shared/lib/libqfffmpeg.z.so
cp $FF_PREFIX/lib/pkgconfig/*.pc $FF_PREFIX/shared/lib/pkgconfig
for f in $FF_PREFIX/lib/pkgconfig/*.pc; do# in case empty dirif [ ! -f $f ]; thencontinueficp $f $FF_PREFIX/shared/lib/pkgconfigf=$FF_PREFIX/shared/lib/pkgconfig/`basename $f`# OSX sed doesn't have in-place(-i)mysedi $f 's/\/output/\/output\/shared/g'mysedi $f 's/-lavcodec/-lijkffmpeg/g'mysedi $f 's/-lavfilter/-lijkffmpeg/g'mysedi $f 's/-lavformat/-lijkffmpeg/g'mysedi $f 's/-lavutil/-lijkffmpeg/g'mysedi $f 's/-lswresample/-lijkffmpeg/g'mysedi $f 's/-lswscale/-lijkffmpeg/g'
done

    以上便是最关键的3个脚本的修改,按照上述修改后,便可编译适配纯harmony系统的ffmpeg库。大家可以将我上述附上的3个完整的脚本复制出来跟原本安卓版的脚本进行对比,可以更清晰地知道修改什么地方。

四、编译

    修改脚本之后,便可跟安卓一样运行脚本编译。

    先编译openssl:

./compile-openssl.sh clean
./compile-openssl.sh all

    然后编译ffmpeg:

./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all

    编译完成后,在contrib/build下会有对应cpu架构的ffmpeg和openssl产物文件夹。例如我编译arm64的:

    在ffmpeg-arm64的output目录下,就有最终编译好的libqfffmpeg.z.so动态库:

    亲测替换到鸿蒙版的ijkplayer中,可以正常运行。至此文章结束。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/9679.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

暴力法解决最近对问题和凸包问题-实现可视化

目录 最近对问题 凸包问题 最近对问题 顾名思义就是采用蛮力法求出所有点之间的距离,然后进行比较找出第一个最近对,一个一个进行比较。 大概思路就是如图(每个圈代表一个数对) 第一个和其他四个比较 第二个和其他三个比较 …

新版文件同步工具(Python编写,其中同时加入了多进程计算MD5、多线程复制大文件、多协程复制小文件、彩色输出消息、日志功能)

两个月前,接到一个粉丝的要求,说希望在我之前编写的一个python编写的文件同步脚本(Python编写的简易文件同步工具(已解决大文件同步时内存溢出问题)https://blog.csdn.net/donglxd/article/details/131225175)上加入多线程复制文件的功能,前段…

英语学习笔记8——What‘s your job?

What’s your job? 你是做什么工作的? 词汇 Vocabulary policeman 男警察 policewoman 女警察 police n. 警力 集合名词,永表复数 西方国家警察管的事很多。交警,刑警,武警一般不分开。 taxi driver 出租车司机 taxi / cab n.…

空间复杂度

前言 通过上一节的学习,我们知道了衡量一个算法是否高效的标准就是复杂度,我们已经学习了时间复杂度,那么本节我们就了解一下空间复杂度的相关知识,那么我们废话不多说,正式进入今天的学习 空间复杂度 空间复杂度也是…

python爬虫(三)之虎嗅网汽车文章爬虫

python爬虫(三)之虎嗅网汽车文章爬虫 闲来没事,闲鱼上有个好兄弟要我从虎嗅网上抓一些汽车文章的爬虫,于是大力出奇迹,我写了一个python程序,将这个网站上所有的汽车文章全部抓取下来了,存储到…

若依生成代码的步骤

1.创建表,要有注释 2.导入表 3.创建主菜单 4.修改表 5.生成代码 6.把代码复制到自己的程序中:复制表、后端、前端 7.重启后端,如果有问题则clean 8.回到浏览器可以看到正常显示了生成的页面

JAVA获取application.yml配置文件的属性值

application.yml配置参数 方式一:使用Value方式(常用) 语法 Value("${配置文件中的key:默认值}") Value("${配置文件中的key}")方法1:使用的类文件中定义变量,直接使用变量 import org.springframework.beans.factory.an…

【2024】Gradle安装配置以及基于Kotlin 进行详细使用

目录💻 一、介绍二、安装Gradle1、下载安装2、配置环境变量2.1、mac2.2、windows 3、配置国内国内镜像源4、初始化Gradle项目4.1、项目结构4.2、Gradle常用命令 三、项目配置1、配置文件介绍1.1、设置文件settings.gradle1.1.1、单体项目1.1.2、父子项目 1.2、构建文…

5.2 Java全栈开发前端+后端(全栈工程师进阶之路)-服务端框架-Spring框架-相信我看这一篇足够

1.Spring框架 1.1.Spring框架简介 Spring是一个基于java的轻量级的、一站式框架。 虽然Spring是一个轻量级框架,但并不表示它的功能少。实际上,spring是一个庞然大物,包罗万象。 时至今日,Spring已经成为java世界中事实上的标准…

常用控件(一)

常用控件 一 按钮类控件QPushButtonQRadioButtonQCheckBox 按钮类控件 QPushButton 使用QPushButton表示一个按钮,这是我们当前最熟悉的一个控件了; QPushButton继承自QAbstractButton,这个类是个抽象类,是其他按钮类的父类; QAbstractButt…

Java毕业设计 基于SpringBoot vue新能源充电系统

Java毕业设计 基于SpringBoot vue新能源充电系统 SpringBoot 新能源充电系统 功能介绍 首页 图片轮播 充电桩 充电桩类型 充电桩详情 充电桩预约 新能源公告 公告详情 登录注册 个人中心 余额充值 修改密码 充电桩报修 充电桩预约订单 客服 后台管理 登录 个人中心 修改密码…

网工交换基础——VLAN Maping

一、定义 VLAN Maping通过修改报文携带的VLAN Tag来实现不同VLAN的相互映射。 二、应用场景 1、场景一:两个VLAN相同的二层用户网络通过骨干网络互联,为了实现用户之间的二层互通,以及二层协议(例如MSTP等)的统一部署…

layui select 绑定onchange事件失效

layui select 绑定onchange事件失效 问题背景解决方案 问题背景 在日常工作中,可能会用到页面 freemaker 以及 layui 前端框架,这个时候直接在 select 上面绑定 onchange 事件往往是不生效的,错误的方式 这种方式给 select 绑定的 onchange…

智慧景区新篇章:山海鲸可视化管理解析

随着旅游业的蓬勃发展,景区管理面临着越来越多的挑战。如何提升游客体验、优化资源配置、确保游客安全,成为景区管理者亟需解决的问题。山海鲸智慧景区管理可视化系统,以其先进的技术和创新的理念,为景区管理带来了全新的解决方案…

图像ISP——AGC参数解析

前言 AWB和AGC是两种常见的自动调整功能。AWB用于自动调整图像的白平衡,以确保颜色在不同光照条件下仍然看起来自然。而AGC则用于自动调整图像的增益,以在不同的亮度条件下保持适当的曝光。 代码例程 static AWB_AGC_TABLE_S g_stAwbAgcTable {/* bvali…

厉害了,OPCUA协议助力航天工业探索苍穹!

今年以来,航天科技真是捷报频频,神州十八号载人飞船和嫦娥六号均发射成功!还让宇航员成功地进入了天宫空间站,可喜可贺。说到航天过程,其中有一个环节尤为重要,就是布置众多望远镜。有人可能会问&#xff0…

赣红孵联合卫东街道未保站开展未成年人保护法散落在每个角落活动

为进一步提高家长的法治意识,依法保障未成年人的合法权益,全力构建安全和谐文明家庭,5月8日,赣红孵社会组织培育中心联合卫东街道未成年人保护站在在南师附小红谷滩校区实验小学开展“未成年人保护法散落在每个角落”未成年人普法…

MySQL慢查询SQL优化

一、慢查询日志 描述:通过慢查询日志等定位那些执行效率较低的SQL语句 查看 # 慢查询是否开启 show variables like slow_query_log%; # 慢查询超时时间 show variables like long_query_time%;执行SQL 开启慢查询日志 set global slow_query_log ON;设置慢查…

笔试强训week4

day1 Q1 难度⭐⭐ 小易的升级之路_牛客题霸_牛客网 (nowcoder.com) 题目: 小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 a.在接下来的一段时间内,他将会依次遇见n个怪物,每个怪物的防御力为b1,b2,b3...bn. 如果遇到的怪物防…

cookie,session,token

目的:解决用户登录状态 从一个简单的登录开始说起, 在我们访问bilibili的时候,第一次需要登录,但后续就不需要登录了,可以直接访问bilibili。 而且每次在页面请求服务器的资源都需要维持登录状态,如果没…