编译适配纯鸿蒙系统的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.rhkb.cn/news/327710.html

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

相关文章

IP代理中的SOCKS5代理是什么?安全吗?

在互联网世界中,网络安全和个人隐私保护变得日益重要。SOCKS5代理作为一种安全高效的网络工具,不仅可以保护个人隐私安全,还可以提供更稳定、更快度的网络连接。本文将带大家深入了解SOCKS5代理在网络安全领域中的应用。 什么是SOCKS5代理 …

【Cesium解读】Cesium中primitive/entity贴地

官方案例 Cesium Sandcastle Cesium Sandcastle 好文推荐:Cesium贴地设置_primitive贴地-CSDN博客 scene.globe.depthTestAgainstTerrain true; True if primitives such as billboards, polylines, labels, etc. should be depth-tested against the terrain…

银行核心背后的落地工程体系丨混沌测试的场景设计与实战演练

本文作者: 张显华、窦智浩、卢进文 与集中式架构相比,分布式架构的系统复杂性呈指数级增长,混沌工程在信创转型、分布式架构转型、小机下移等过程中有效保障了生产的稳定性。本文分享了 TiDB 分布式数据库在银行核心业务系统落地中进行混沌测…

(深度估计学习)Win11复现DepthFM

目录 1. 系统配置2. 拉取代码,配置环境3.开始深度预测4.运行结果 论文链接:https://depthfm.github.io/ 讲解链接:https://www.php.cn/faq/734404.html 1. 系统配置 本人系统:Win11 CUDA12.2 python3.11.5 这里附上几个CUDA安装链…

谷歌Gemini时代来了!加固搜索护城河、赋能全家桶,Gemini 1.5 Pro升级至200万token

3 月中旬,谷歌宣布 Google I/O 定档北京时间 5 月 15 日凌晨 1 点。而当大会开幕时间临近,本应是讨论度最高的时候,「宿敌」OpenAI 却半路杀出,抢先一天,仅耗时 27 分钟就发布了颠覆性巨作 GPT-4o,将新一轮…

java项目之企业资产管理系统(springboot+vue+mysql)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的企业资产管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 管理员功能有个人中心&…

【学习笔记】C++每日一记[20240513]

简述静态全局变量的概念 在全局变量前加上static关键字,就定义了一个静态全局变量。通常情况下,静态全局变量的声明和定义放在源文件中,并且不能使用extern关键字将静态全局变量导出,因此静态全局变量的**作用于仅限于定义静态全…

数据库学习之select语句练习

目录 素材 练习 1、显示所有职工的基本信息。 结果 2、查询所有职工所属部门的部门号,不显示重复的部门号。 结果 3、求出所有职工的人数。 结果 4、列出最高工和最低工资。 结果 5、列出职工的平均工资和总工资。 结果 6、创建一个只有职…

C语言----斐波那契数列(附源代码)

各位看官们好,当我写了上一篇博客杨辉三角后,有一些看官叫我讲一下斐波那契数列。对于这个大家应该是有了解的。最简单的规律就是f(n)f(n-2)f(n-1)。就是当前是前两项之和,然后下标1和0都是1.从第三项开始计算的。那么我们知道规律&#xff0…

学习神经网络基础架构

今日学习了解了常见的几种神经网络基础架构。 1.卷积神经网络 卷积神经网络CNN是一种人工神经网络,旨在处理和分析具有网格状拓扑结构的数据,如图像和视频。将 CNN 想象成一个多层过滤器,可处理图像以提取有意义的特征并进行推理预测。 想…

风电功率预测 | 基于RF随机森林的风电功率预测(附matlab完整源码)

风电功率预测 风电功率预测完整代码风电功率预测 基于随机森林(Random Forest, RF)的风电功率预测是一种常用且有效的方法。以下是基于RF的风电功率预测的一般步骤: 数据准备:收集与风电场发电功率相关的数据,包括风速、风向、温度、湿度等气象数据以及风电场的历史功率数…

从零开始:C++ String类的模拟实现

文章目录 引言1.类的基本结构2.构造函数和析构函数3.基本成员函数总结 引言 在C编程中,字符串操作是非常常见且重要的任务。标准库中的std::string类提供了丰富且强大的功能,使得字符串处理变得相对简单。然而,对于学习C的开发者来说&#x…

ICode国际青少年编程竞赛- Python-5级训练场-多参数函数

ICode国际青少年编程竞赛- Python-5级训练场-多参数函数 1、 def go(a, b):Spaceship.step(2)Dev.step(a)Spaceship.step(b)Dev.turnRight()Dev.step(b)Dev.turnLeft()Dev.step(-a) Dev.turnLeft() Dev.step(3) Dev.step(-3) go(3, 2) go(6, 1) go(5, 2) go(4, 3)2、 def go(…

ip addr 或 ip address 是 Linux 系统中的一个命令,用于显示或修改网络接口的地址信息。

ip addr 或 ip address 是 Linux 系统中的一个命令,用于显示或修改网络接口的地址信息。这个命令是 iproute2 软件包的一部分,通常在现代 Linux 发行版中都是预装的。 当你运行 ip addr 或 ip address 命令时,你会看到系统上所有网络接口的地…

吴恩达深度学习笔记:优化算法 (Optimization algorithms)2.3-2.5

目录 第二门课: 改善深层神经网络:超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第二周:优化算法 (Optimization algorithms)2.3 指数加权平均数(Exponential…

QT学习(1)——创建第一个QT程序,信号和槽,打开关闭窗口的案例

目录 引出规范和帮助文档创建第一个Qt程序对象树概念信号signal槽slot自定义信号和槽1.自定义信号2.自定义槽3.建立连接4.进行触发 自定义信号重载带参数的按钮触发信号触发信号拓展 lambda表达式返回值mutable修饰案例 打开关闭窗口案例 总结 引出 QT学习(1&#…

3.TCP的三次握手和四次挥手

一、前置知识 TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。在传输数据前通信双方必须建立连接(所谓连接,是指客户端和服务端各自保存一份关于对方的信息,比如ip地址,端口号等)。TCP通过三次握手建立一个…

软件工程期末复习(6)需求分析的任务

需求分析 需求分析的任务 “建造一个软件系统的最困难的部分是决定要建造什么……没有别的工作在做错时会如此影响最终系统,没有别的工作比以后矫正更困难。” —— Fred Brooks 需求难以建立的原因&#x…

【计算机毕业设计】基于SSM++jsp的高校专业信息管理系统【源码+lw+部署文档+讲解】

目录 第1章 绪论 1.1 课题背景 1.2 课题意义 1.3 研究内容 第2章 开发环境与技术 2.1 MYSQL数据库 2.2 JSP技术 2.3 SSM框架 第3章 系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2 经济可行性 3.1.3 操作可行性 3.2 系统流程 3.2.1 操作流程 3.2.2 登录流程 3.2.3 删除信息流…

复利效应(应用于成长)

应用 每个人在智力、知识、经验上,复利效应都一样,只要能积累的东西,基本上最终都会产生复利效应。 再来看一下复利公式:FP*(1i)^n P本金;i利率;n持有期限。在使用时,一定要注意4个限定条件&a…