• win10 Ubuntu 子系统下编译ffmpeg 和 x264


    编译x264

    • 下载x264源码
    • 下载 并安装 yasm
    • 在源码文件的根目录下传建android_build.sh文件,内容如下:
    export ANDROID_NDK=~/linux_station/android-ndk-r21e ##linux 版ndk的路径
    export TOOLCHAIN=${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64
    export PATH=$TOOLCHAIN/bin:$PATH ##将toolchain 下的bin 添加到系统变量中
    export SYSROOT=${TOOLCHAIN}/sysroot
    export AR=$TOOLCHAIN/bin/aarch64-linux-android-ar
    export CC=$TOOLCHAIN/bin/aarch64-linux-android21-clang
    export CXX=$TOOLCHAIN/bin/aarch64-linux-android21-clang++
    export LD=$TOOLCHAIN/bin/aarch64-linux-android-ld
    export RANLIB=$TOOLCHAIN/bin/aarch64-linux-android-ranlib
    export STRIP=$TOOLCHAIN/bin/aarch64-linux-android-strip
    
    ./configure \
       ## --prefix=./so  \ ## 指定生成的lib和include 文件的路径,若不设置,则默认生成在usr/local下
        --sysroot=${SYSROOT} \
        --enable-shared \
        --enable-pic \
        --host=aarch64-linux-android ##这里指定host的版本,根据需要可以选择 arm 还是arm64(aarch),x86
    
    make clean
    make 
    make install
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 修改x264 configure 文件中的SONAME 命名的code,$API是x264的版本号,如157 否则导入到Android项目中后 编译apk时,.so.157的文件不会加载到apk的lib中

      echo "SONAME=libx264.so.$API" >> config.mak 修改为 echo "SONAME=libx264.so" >> config.mak

    • 在terminal 中执行 sudo ./android_build.sh,编译完成后,terminal中会打印生成的 lib 和 include 的路径

    编译ffmpeg

    • 下载ffmpeg的源码
    • 在源码文件的根目录下传建android_build.sh文件,内容如下:
    
    NDK=~/linux_station/android-ndk-r21e
    
    TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
    SYSROOT=${TOOLCHAIN}/sysroot
    PLATFORMS=$NDK/platforms
    AR=$TOOLCHAIN/bin/aarch64-linux-android-ar
    AS=$TOOLCHAIN/bin/aarch64-linux-android-as
    CC=$TOOLCHAIN/bin/aarch64-linux-android21-clang
    CXX=$TOOLCHAIN/bin/aarch64-linux-android21-clang++
    LD=$TOOLCHAIN/bin/aarch64-linux-android-ld
    RANLIB=$TOOLCHAIN/bin/aarch64-linux-android-ranlib
    STRIP=$TOOLCHAIN/bin/aarch64-linux-android-strip
    NM=$TOOLCHAIN/bin/aarch64-linux-android-nm
    ## 若出现 libm.so找不到的问题时,设置一下试试
    ADDI_LDFLAGS="-Wl,-rpath-link=$SYSROOT/usr/lib/aarch64-linux-android/21"
    
    #arm64 x86 x86_64 对应 aarch64 i686 x86_64 
    PREFIX=./SO/aarch64
    
    ./configure \
    --prefix=$PREFIX \
    --disable-static \
    --enable-shared \
    --enable-small \
    --enable-gpl \
    --enable-version3 \
    --enable-pic \
    --disable-doc \
    --enable-asm \
    --enable-cross-compile \
    --target-os=android \
    --arch=aarch64 \
    --cc=$CC \
    --ar=$AR \
    --cxx=$CXX \
    --ranlib=$RANLIB \
    --strip=$STRIP \
    --nm=$NM \
    --sysroot=$SYSROOT \
    --enable-libx264 \
    --extra-ldflags=$ADDI_LDFLAGS \
    
    
    make clean
    make -j4
    make install
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 安装 pkg-config ,命令如下
      sudo apt-get install pkg-config

    • 在 /etc/profile中将生成的x264的include 和 lib 配置到PATH中 , 如下:

      由于没有设置 --prefix的路径,所有我这边x264生成的include和lib在/usr/local下

      export PATH=/usr/local/bin:$PATH 
      export PATH=/usr/local/lib:$PATH
      export PATH=/usr/local/include:$PATH
      
      
      • 1
      • 2
      • 3
      • 4
    • 在 /etc/profile中将x264 生成的lib/pkgconfig 路径配置到PKG_CONFIG_PATH,如下:
      为了解决ERROR: x264 not found using pkg-config 问题

      export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
      
      • 1
    • 若出现 libm.so找不到的问题时,设置一下-rpath-link 试试

      ADDI_LDFLAGS="-Wl,-rpath-link=$SYSROOT/usr/lib/aarch64-linux-android/21"
      ./configure \
      ...
      --extra-ldflags=$ADDI_LDFLAGS \
      
      • 1
      • 2
      • 3
      • 4
    • 在terminal中执行 sudo ./android_build.sh

    导入Android项目

    • 将ffmpeg和 x264 编译生成 的lib 和include 文件夹copy 到Android项目中,如下图
      在这里插入图片描述

      • CMakeLists.txt code 如下:
    cmake_minimum_required(VERSION 3.10.2)
    SET(CMAKE_BUILD_TYPE "Debug")
    # Declares and names the project.
    add_compile_options(-g)
    
    project("handler")
    
    add_library( # Sets the name of the library.
            handler
    
            # Sets the library as a shared library.
            SHARED
    
            # Provides a relative path to your source file(s).
            image/image_handler.cpp
            image/image_handler.h
            video/video_handler.cpp
            video/video_dealer.cpp
            video/video_dealer.h
            video/video_handler.h)
    message("${CMAKE_CURRENT_SOURCE_DIR}")
    message("${CMAKE_ANDROID_ARCH_ABI}")
    # CMAKE_CURRENT_SOURCE_DIR code source的目录,cpp
    set(distribution_DIR ${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_ANDROID_ARCH_ABI}/lib)
    
    include_directories(${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_ANDROID_ARCH_ABI}/include)
    # 添加 ffmpeg so文件
    add_library( avcodec SHARED IMPORTED)
    set_target_properties( avcodec PROPERTIES IMPORTED_LOCATION ${distribution_DIR}/libavcodec.so)
    
    add_library( avdevice SHARED IMPORTED)
    set_target_properties( avdevice PROPERTIES IMPORTED_LOCATION ${distribution_DIR}/libavdevice.so)
    
    add_library( avfilter SHARED IMPORTED)
    set_target_properties( avfilter PROPERTIES IMPORTED_LOCATION ${distribution_DIR}/libavfilter.so)
    
    add_library( avformat SHARED IMPORTED)
    set_target_properties( avformat PROPERTIES IMPORTED_LOCATION ${distribution_DIR}/libavformat.so)
    
    add_library( avutil SHARED IMPORTED)
    set_target_properties( avutil PROPERTIES IMPORTED_LOCATION ${distribution_DIR}/libavutil.so)
    
    add_library( swscale SHARED IMPORTED)
    set_target_properties( swscale PROPERTIES IMPORTED_LOCATION ${distribution_DIR}/libswscale.so)
    
    add_library( swresample SHARED IMPORTED)
    set_target_properties( swresample PROPERTIES IMPORTED_LOCATION ${distribution_DIR}/libswresample.so)
    
    add_library( postproc SHARED IMPORTED)
    set_target_properties( postproc PROPERTIES IMPORTED_LOCATION ${distribution_DIR}/libpostproc.so)
    
    add_library( x264 SHARED IMPORTED)
    set_target_properties( x264 PROPERTIES IMPORTED_LOCATION ${distribution_DIR}/libx264.so)
    
    find_library(
            log-lib
            log)
    
    target_link_libraries( # Specifies the target library.
            handler
            avcodec
            avdevice
            avfilter
            avformat
            avutil
            swscale
            swresample
            postproc
            x264
            jnigraphics
            ${log-lib}
            android)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
  • 相关阅读:
    java计算机毕业设计足球信息发布平台源码+数据库+系统+部署+lw文档
    大数据开发之数据仓库
    【深度学习 AIGC】stable diffusion webUI 使用过程,参数设置,教程,使用方法
    python中的抽象方法
    INC公司和LLC公司的区别
    beef利用xss漏洞实现攻击
    每日三题 9.28
    【QT教程】QT6 QML在工业控制系统中的应用
    SpringCloud | 单体商城项目拆分(微服务)
    金蝶云星空企业版v8.0如何通过内网穿透实现异地公网远程访问
  • 原文地址:https://blog.csdn.net/genmenu/article/details/126163221