当前位置: 首页 > news >正文

网站建设管理工作会议上的讲话/百度seo点击

网站建设管理工作会议上的讲话,百度seo点击,今晚比分足球预测,服装公司网站规划建设目前bilibili官方的ijkplayer播放器,是只适配Android和IOS系统的。而华为接下来即将发布纯harmony系统,是否有基于harmony系统的ijkplayer可以使用呢? 鸿蒙版ijkplayer播放器是哪个,如何使用,这个问题,大家…

    目前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中,可以正常运行。至此文章结束。

相关文章:

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

目前bilibili官方的ijkplayer播放器,是只适配Android和IOS系统的。而华为接下来即将发布纯harmony系统,是否有基于harmony系统的ijkplayer可以使用呢? 鸿蒙版ijkplayer播放器是哪个,如何使用,这个问题,大家…...

离线维护麒麟操作系统

1 本地源设置 a 首先传输一个镜像ISO文件到离线系统。 b 加载镜像文件作为源文件。 #mkdir /mnt/cdrom #mount -o path/镜像.iso /mnt/cdromc 修改源文件 # cd /etc/yum.repo.d/ # vi base.repo 修改baseurl file:///mnt/cdrom d update &install 然后就可以愉快的…...

leetcode尊享面试——二叉树(python)

250.统计同值子树 使用dfs深度搜索,同值子树,要满足三个条件: 对于当前节点node,他的左子树血脉纯净(为同值子树),右子树血脉纯净(为同值子树),node的值等于…...

macbookpro 安装linux mint 无线wifi无法连接 解决方案

见欢迎页面—驱动管理...

抖音小店如此内卷,现在还值得投入吗?还能赚到钱吗?

大家好,我是电商笨笨熊 抖音小店已经经历4-5年的风霜,所以现在很多还未入驻的玩家都会有一个顾虑; 担心现在进入抖店是都还具备发展空间,还能不能赚到钱; 尤其是当一片市场逐渐加入越来越多商家的时候平台一定会内卷…...

Java基础知识(11)

Java基础知识(11) (包括:IO流高级流,网络爬虫基础,Commons-i0工具包和Hutool工具包) 目录 Java基础知识(11) 一.IO流高级流 1.缓冲流 【1】字节缓冲流 &#xff0…...

iOS——SDWebImage源码学习

什么是SDWebImage SDWebImage是一个流行的iOS和macOS平台上的开源库,用于异步加载和缓存网络图片。它提供了一套简单易用的API,使得在应用中加载网络图片变得更加方便和高效。 主要特点和功能: 异步加载:SDWebImage通过异步方式…...

信创基础软件之中间件

信创基础软件之中间件 中间件概述 中间件是一种应用于分布式系统的基础软件,位于应用与操作系统、数据库之间,主要用于解决分布式环境下数据传输、数据访问、应用调度、系统构建和系统集成、流程管理等问题,是分布式环境下支撑应用开发、运…...

在Ubuntu linux操作系统上操作MySQL数据库常用的命令

检查是否安装了MySQL,或检查MySQL的状态: sudo systemctl status mysql或 sudo systemctl status mysql.service如果mysql有安装,上面这条命令会返回mysql的状态active或inactive。 卸载mysql数据库 第一步是停了数据库: sud…...

前端科举八股文-JAVASCRIPT篇

前端科举八股文-JAVASCRIPT篇 Js的变量类型,区别是什么平时有用过symbol吗函数闭包的理解?js的原型链? Function Function.constructor 返回值?promise的出现是为了解决什么问题?前端中的事件流事件委托?js的new操作符做了哪些…...

Docker私有仓库与Harbor部署使用

目录 一、本地私有仓库 1. 下载registry镜像 2. 在daemon.json文件中添加私有镜像仓库地址 ​编辑 3. 运行registry容器 4. Docker容器的重启策略如下 5. 为镜像打标签 6. 上传到私有仓库 7. 列出私有仓库的所有镜像 8. 列出私有仓库的centos镜像有哪些tag 9. 先删…...

Linux的iptables防火墙基础介绍

iptables 防火墙 应用层软件----管理 内核级netfilter 硬件-------内核----网络—netfilter/kvm----- app iptables iptables—控制netfilter 过滤&#xff1a;<smac/sip/dip/sport/dport/状态> TCP/IP 应用层 传输层 sport dport 状态 <三次握手/四次断开> 网…...

deepspeed+transformers模型微调

一、目录 代码讲解 二、实现。 1、代码讲解&#xff0c;trainer 实现。 transformers通过trainer 集成deepspeed功能&#xff0c;所以中需要进行文件配置&#xff0c;即可实现deepspeed的训练。 微调代码&#xff1a; 参数定义—>数据处理---->模型创建/评估方式----&…...

无人机摄影测量数据处理、三维建模及在土方量计算中的应用

专题一、无人机摄影测量技术应用现状及其发展 1、无人机摄影测量技术概述 2、摄影测量系统的发展 3、无人机摄影测量技术应用分析 专题二、基本原理和关键技术讲解 1、摄影测量基础知识 1&#xff09;航空摄影 2&#xff09;航摄像片的方位元素 3&#xff09;共…...

《ESP8266通信指南》15-MQTT连接、订阅MQTT主题并打印消息(基于Lua|适合新手|非常简单)

往期 《ESP8266通信指南》14-连接WIFI&#xff08;基于Lua&#xff09;-CSDN博客 《ESP8266通信指南》13-Lua 简单入门&#xff08;打印数据&#xff09;-CSDN博客 《ESP8266通信指南》12-Lua 固件烧录-CSDN博客 《ESP8266通信指南》11-Lua开发环境配置-CSDN博客 《ESP826…...

LeetCode:两数之和

文章收录于LeetCode专栏 LeetCode地址 两数之和 给定一个整数数组nums和一个整数目标值target&#xff0c;请你在该数组中找出和为目标值的那两个整数&#xff0c;并返回它们的数组下标。   你可以假设每种输入只会对应一个答案。但是数组中同一个元素在答案里不能重复出现。…...

CSDN我的创作纪念日128天||不忘初心|努力上进|勇往直前

机缘 Hello&#xff0c;大家好&#xff0c;我是景天&#xff0c;其实很早之前我就加入到了CSND的大军&#xff0c;彼时我还是个刚毕业的小白白&#xff0c;时常过来CSND汲取养料&#xff0c;就这样&#xff0c;慢慢的来提升自己&#xff0c;强大自己。工作锻炼了我&#xff0c…...

MySQL数据库中的浮点类型和高精度类型有什么区别?为什么不推荐使用浮点类型?

在软件开发中&#xff0c;作为后端&#xff0c;无可避免的需要熟练使用 MySQL 数据库进行数据存储和读取。对于信息系统而言&#xff0c;数据库的的地位不言而喻。那作为软件开发工程师&#xff0c;在使用 MySQL 过程中&#xff0c;又有哪些需要注意的呢&#xff1f;我们从实际…...

C++ 抽象与封装

一 抽象 抽象实例&#xff1a;时钟 数据抽象&#xff1a; 具有表面当前时间的时、分、秒 行为抽象&#xff1a; 具有设置时间和显示时间两个最基本的功能。 抽象实例&#xff1a;人 数据抽象&#xff1a;姓名、年龄、性别等。 行为抽象&#xff1a; 生物属性&#xff1a;吃…...

antV X6的简要使用教程

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 在我们的日常开发工作中&#xff0c;我们经常需要构建复杂的交互式图…...

【LLM 论文】Step-Back Prompting:先解决更高层次的问题来提高 LLM 推理能力

论文&#xff1a;Take a Step Back: Evoking Reasoning via Abstraction in Large Language Models ⭐⭐⭐⭐ Google DeepMind, ICLR 2024, arXiv:2310.06117 论文速读 该论文受到的启发是&#xff1a;人类再解决一个包含很多细节的具体问题时&#xff0c;先站在更高的层次上解…...

Java——接口的补充

目录 一&#xff1a;接口的注意事项 1. 接口中不能有方法块&#xff1b; 2. 接口没有构造方法&#xff1a; 3.接口是可以多继承的&#xff1b; 4. 多个接口抽象方法重复 5. 类的父类方法与接口方法重复 二&#xff1a;类与接口 1. 继承与实现 2. 多个父接口的抽象…...

word转pdf的java实现(documents4j)

一、多余的话 java实现word转pdf可用的jar包不多&#xff0c;很多都是收费的。最近发现com.documents4j挺好用的&#xff0c;它支持在本机转换&#xff0c;也支持远程服务转换。但它依赖于微软的office。电脑需要安装office才能转换。鉴于没在linux中使用office&#xff0c;本…...

基于K8S构建Jenkins持续集成平台

文章目录 安装和配置NFSNFS简介NFS安装 在Kubernetes安装Jenkins-Master创建NFS client provisioner安装Jenkins-Master Jenkins与Kubernetes整合实现Jenkins与Kubernetes整合构建Jenkins-Slave自定义镜像 JenkinsKubernetesDocker完成微服务持续集成拉取代码&#xff0c;构建镜…...

PHPStudy 访问网页 403 Forbidden禁止访问

涉及靶场 upload-labd sqli-labs pikachu dvwa 以及所有部署在phpstudy中的靶场 注意&#xff1a;一定要安装解压软件 很多同学解压靶场代码以后访问报错的原因是&#xff1a;电脑上没有解压软件。 这个时候压缩包看起来就是黄色公文包的样子&#xff0c;右键只有“全部提取…...

热爱电子值得做的电子制作实验

加我zkhengyang&#xff0c;进嵌入式音频系统研究开发交流答疑群(课题组) AM/FM收音机散件制作&#xff0c;磁带随声听散件&#xff0c;黑白电视机散件制作&#xff0c;功放散件制作&#xff0c;闪光灯散件制作&#xff0c;声控灯散件&#xff0c;等等&#xff0c;可提高动手能…...

.class文件启动过程以及文件内容结构讲解

当你直接启动一个.class文件时&#xff0c;实际上是在操作系统中调用Java虚拟机&#xff08;JVM&#xff09;&#xff0c;并将该.class文件传递给JVM以执行。现在让我们来解释一下.class文件的启动过程以及文件内容结构&#xff1a; 启动过程&#xff1a;操作系统通过指定的命…...

解锁楼宇自动化新维度西门子Insight+BACnet IP I/O控制器

数字城市的楼宇自动化已不再是一个遥不可及的概念&#xff0c;而是成为了现代建筑的标配。特别是在大型商业综合体、高端写字楼和公共设施中&#xff0c;高效的楼宇管理系统是确保环境舒适度与能源效率的关键。当提及楼宇自动化领域的佼佼者&#xff0c;西门子Insight楼宇自动化…...

2024.05.10作业

TCP服务器 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> #include <QTcpSocket> #include <QList> #include <QMessageBox> #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { class Widget; …...

基于POSIX标准库的读者-写者问题的简单实现

文章目录 实验要求分析保证读写、写写互斥保证多个读者同时进行读操作读者优先实例代码分析写者优先读写公平法示例代码分析实验要求 创建一个控制台进程,此进程包含n个线程。用这n个线程来表示n个读者或写者。每个线程按相应测试数据文件的要求进行读写操作。用信号量机制分别…...