From 9427cc3ac5a8173f8fb078739f98c5366bb57855 Mon Sep 17 00:00:00 2001 From: liulihong Date: Wed, 6 Dec 2023 11:55:04 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9FFmpeg=E5=BA=93=E7=BC=96?= =?UTF-8?q?=E8=AF=91=E8=84=9A=E6=9C=AC=E5=92=8C=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: liulihong --- thirdparty/FFmpeg/HPKBUILD | 52 ++++++++++++------ thirdparty/FFmpeg/docs/hap_integrate.md | 10 +++- .../FFmpeg/docs/pic/FFmpeg_install_dir.png | Bin 4975 -> 15293 bytes 3 files changed, 41 insertions(+), 21 deletions(-) mode change 100644 => 100755 thirdparty/FFmpeg/HPKBUILD diff --git a/thirdparty/FFmpeg/HPKBUILD b/thirdparty/FFmpeg/HPKBUILD old mode 100644 new mode 100755 index de14ec9e..2b7d0bd5 --- a/thirdparty/FFmpeg/HPKBUILD +++ b/thirdparty/FFmpeg/HPKBUILD @@ -6,8 +6,8 @@ pkgrel=0 pkgdesc="FFmpeg is a collection of libraries and tools to process multimedia content such as audio, video, subtitles and related metadata." url="https://github.com/FFmpeg/FFmpeg/" archs=("armeabi-v7a" "arm64-v8a") -license="GPL2/GPL3/LGPL3" -depends=("openssl") +license=("GPL2" "GPL3" "LGPL3" "MIT" "X11" "BSD-styl") +depends=("rtmpdump" "openssl_1_0_2u") makedepends=() source="https://github.com/FFmpeg/$pkgname/archive/refs/tags/$pkgver.tar.gz" @@ -19,23 +19,26 @@ builddir=$pkgname-${pkgver} packagename=$builddir.tar.gz source envset.sh buildhost=true - +checktest=true arch= ldflags= prepare() { if [ $buildhost == true ] then + if [ $checktest == true ] + then tar -zxf $packagename cd $builddir - ./configure --enable-static --enable-shared --disable-doc --disable-htmlpages --target-os=linux --disable-optimizations --prefix=`pwd`/hostbuild > `pwd`/build.log 2>&1 - make -j4 >> `pwd`/build.log 2>&1 - make install >> `pwd`/build.log 2>&1 + ./configure --enable-static --enable-shared --disable-doc --disable-htmlpages --target-os=linux --disable-optimizations --prefix=`pwd`/hostbuild > $publicbuildlog 2>&1 + $MAKE >> $publicbuildlog 2>&1 + $MAKE install >> $publicbuildlog 2>&1 export LD_LIBRARY_PATH=`pwd`/hostbuild/lib:$LD_LIBRARY_PATH sed -i 's/include $(SRC_PATH)\/tests\/fate\/source.mak/#include $(SRC_PATH)\/tests\/fate\/source.mak/g' tests/Makefile - make check -j4 >> `pwd`/build.log 2>&1 + $MAKE check >> $publicbuildlog 2>&1 ret=$? buildhost=false cd $OLDPWD + fi fi mkdir $pkgname-$ARCH-build @@ -49,12 +52,14 @@ prepare() { setarm32ENV arch=arm ldflags="-L${OHOS_SDK}/native/sysroot/usr/lib/arm-linux-ohos" - fi - if [ $ARCH == "arm64-v8a" ] + elif [ $ARCH == "arm64-v8a" ] then setarm64ENV arch=aarch64 ldflags="-L${OHOS_SDK}/native/sysroot/usr/lib/aarch64-linux-ohos" + else + echo "${ARCH} not support" + return -1 fi return $ret @@ -62,26 +67,33 @@ prepare() { build() { cd $pkgname-$ARCH-build/$builddir - PKG_CONFIG_LIBDIR=$pkgconfigpath ./configure "$@" --enable-asm --enable-cross-compile --enable-openssl --enable-neon --disable-vulkan --disable-x86asm --enable-static --enable-shared --disable-doc --disable-htmlpages --target-os=linux --disable-optimizations --arch=$arch --cc=${CC} --ld=${CC} --strip=${STRIP} --host-cc="${CC}" --host-ld="${CC}" --host-os=linux --host-ldflags=${ldflags} --sysroot=${OHOS_SDK}/native/sysroot > `pwd`/build.log 2>&1 - make -j4 >> `pwd`/build.log 2>&1 + PKG_CONFIG_LIBDIR="${pkgconfigpath}" ./configure "$@" --enable-neon --enable-asm --enable-network \ + --disable-vulkan --enable-cross-compile --enable-librtmp --disable-x86asm --enable-openssl --enable-protocols \ + --enable-static --enable-shared --disable-doc --disable-htmlpages --target-os=linux --arch=$arch \ + --cc=${CC} --ld=${CC} --strip=${STRIP} --host-cc="${CC}" --host-ld="${CC}" --host-os=linux \ + --host-ldflags=${ldflags} --sysroot=${OHOS_SDK}/native/sysroot > $buildlog 2>&1 + $MAKE >> $buildlog 2>&1 ret=$? cd $OLDPWD return $ret } + package() { cd $pkgname-$ARCH-build/$builddir - make install >> `pwd`/build.log 2>&1 + $MAKE install >> $buildlog 2>&1 cd $OLDPWD + unset arch + unset ldflags if [ $ARCH == "armeabi-v7a" ] then unsetarm32ENV - fi - if [ $ARCH == "arm64-v8a" ] + elif [ $ARCH == "arm64-v8a" ] then unsetarm64ENV + else + echo "${ARCH} not support" + return -1 fi - unset arch - unset ldflags } checktestfiles() { cd $pkgname-$ARCH-build/$builddir/tests/ref @@ -115,6 +127,10 @@ copyhostbin() { } check() { + if [ $checktest == false ] + then + return 0 + fi cd $pkgname-$ARCH-build/$builddir # disable running cmd sed -i 's/ $(Q)$(SRC_PATH)\/tests\/fate-run.sh/# $(Q)$(SRC_PATH)\/tests\/fate-run.sh/g' tests/Makefile @@ -130,7 +146,7 @@ check() { ret=0 while true do - make check -j4 >> `pwd`/build.log 2>&1 + $MAKE check >> $buildlog 2>&1 if [ $? -eq 0 ] then break; @@ -173,6 +189,6 @@ check() { } # 清理环境 -cleanbuild(){ +cleanbuild() { rm -rf ${PWD}/${builddir} ${PWD}/$pkgname-arm64-v8a-build ${PWD}/$pkgname-armeabi-v7a-build #${PWD}/$packagename } diff --git a/thirdparty/FFmpeg/docs/hap_integrate.md b/thirdparty/FFmpeg/docs/hap_integrate.md index 63f715de..3c762954 100644 --- a/thirdparty/FFmpeg/docs/hap_integrate.md +++ b/thirdparty/FFmpeg/docs/hap_integrate.md @@ -56,7 +56,7 @@ ![thirdparty_install_dir](pic/FFmpeg_install_dir.png) -- 在最外层(cpp目录下)CMakeLists.txt中添加如下语句 +- 在最外层(cpp目录下)CMakeLists.txt中添加如下语句,libz.a需要自己编译仓库里面的 ```cmake #将三方库加入工程中 @@ -67,11 +67,15 @@ target_link_libraries(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/FFmpeg/${OHOS_ARCH}/lib/libavutil.a) target_link_libraries(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/FFmpeg/${OHOS_ARCH}/lib/libswresample.a) target_link_libraries(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/FFmpeg/${OHOS_ARCH}/lib/libswscale.a) + target_link_libraries(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/zlib/${OHOS_ARCH}/lib/libz.a) + + target_link_libraries(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/openssl_1_0_2u/${OHOS_ARCH}/lib/libcrypto.a) + target_link_libraries(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/openssl_1_0_2u/${OHOS_ARCH}/lib/libssl.a) + target_link_libraries(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/rtmpdump/${OHOS_ARCH}/lib/librtmp.a) #将三方库的头文件加入工程中 target_include_directories(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/FFmpeg/${OHOS_ARCH}/include) ``` - - ![FFmpeg_usage](pic/FFmpeg_usage.png) + ## 测试三方库 diff --git a/thirdparty/FFmpeg/docs/pic/FFmpeg_install_dir.png b/thirdparty/FFmpeg/docs/pic/FFmpeg_install_dir.png index 2c128490c06c534271006e78b3c6d668dd05b712..d46de79e1645eeb7a81165d3e3d24b636b3a9173 100644 GIT binary patch literal 15293 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