美文网首页Android开发部落直播音视频
使用Android Studio开发FFmpeg的正确姿势

使用Android Studio开发FFmpeg的正确姿势

作者: Coopsrc | 来源:发表于2017-07-21 16:45 被阅读1254次

2018-04-21: 更新至 ffmpeg-4.0

使用AndroidStudio 开发 FFmpeg
Keywords: gradle, cmake
关键步骤,编译FFmpeg,Android Studio 集成。

abi support: armeabi armeabi-v7a arm64-v8a x86 x86_64
ndk version android-ndk-r14b

export NDK_HOME=/opt/android/android-ndk-r14b
export NDK_HOST_PLATFORM=linux-x86_64

第一步,编译ffmpeg


首先下载并解压

wget https://ffmpeg.org/releases/ffmpeg-4.0.tar.bz2
tar xvf ffmpeg-4.0.tar.bz2

然后编写编译脚本

#!/bin/sh

PREFIX=android-build

COMMON_OPTIONS="\
    --prefix=android/ \
    --target-os=android \
    --disable-static \
    --enable-shared \
    --enable-small \
    --disable-programs \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-doc \
    --disable-symver \
    --disable-asm \
    "

function build_android {
    ./configure \
    --libdir=${PREFIX}/libs/armeabi-v7a \
    --incdir=${PREFIX}/includes/armeabi-v7a \
    --pkgconfigdir=${PREFIX}/pkgconfig/armeabi-v7a \
    --arch=arm \
    --cpu=armv7-a \
    --cross-prefix="${NDK_HOME}/toolchains/arm-linux-androideabi-4.9/prebuilt/${NDK_HOST_PLATFORM}/bin/arm-linux-androideabi-" \
    --sysroot="${NDK_HOME}/platforms/android-19/arch-arm/" \
    --extra-cflags="-march=armv7-a -mfloat-abi=softfp -mfpu=neon" \
    --extra-ldexeflags=-pie \
    ${COMMON_OPTIONS}
    make clean
    make -j8 && make install

    ./configure \
    --libdir=${PREFIX}/libs/arm64-v8a \
    --incdir=${PREFIX}/includes/arm64-v8a \
    --pkgconfigdir=${PREFIX}/pkgconfig/arm64-v8a \
    --arch=aarch64 \
    --cpu=armv8-a \
    --cross-prefix="${NDK_HOME}/toolchains/aarch64-linux-android-4.9/prebuilt/${NDK_HOST_PLATFORM}/bin/aarch64-linux-android-" \
    --sysroot="${NDK_HOME}/platforms/android-21/arch-arm64/" \
    --extra-ldexeflags=-pie \
    ${COMMON_OPTIONS} 
    make clean
    make -j8 && make install

    ./configure \
    --libdir=${PREFIX}/libs/x86 \
    --incdir=${PREFIX}/includes/x86 \
    --pkgconfigdir=${PREFIX}/pkgconfig/x86 \
    --arch=x86 \
    --cpu=i686 \
    --cross-prefix="${NDK_HOME}/toolchains/x86-4.9/prebuilt/${NDK_HOST_PLATFORM}/bin/i686-linux-android-" \
    --sysroot="${NDK_HOME}/platforms/android-19/arch-x86/" \
    --extra-ldexeflags=-pie \
    ${COMMON_OPTIONS} 
    make clean
    make -j8 && make install

    ./configure \
    --libdir=${PREFIX}/libs/x86_64 \
    --incdir=${PREFIX}/includes/x86_64 \
    --pkgconfigdir=${PREFIX}/pkgconfig/x86_64 \
    --arch=x86_64 \
    --cpu=x86_64 \
    --cross-prefix="${NDK_HOME}/toolchains/x86_64-4.9/prebuilt/${NDK_HOST_PLATFORM}/bin/x86_64-linux-android-" \
    --sysroot="${NDK_HOME}/platforms/android-21/arch-x86_64/" \
    --extra-ldexeflags=-pie \
    ${COMMON_OPTIONS}
    make clean
    make -j8 && make install

};

build_android

此脚本实现了armeabi-v7a,arm64-v8a,x86,x86_64 4个平台的编译。

  • 需要添加系统环境变量 $NDK_PATH
  • --target-os=android指定android平台。
  • make install-libs 表示只安装so文件

编译完成结果:


ffmpeg

第二步,项目集成


  • 新建项目,增加C++支持。手动创建jniLibs文件夹
  • 然后将上一步生成的所有文件复制到jniLibs文件夹下面
    最终目录结构:
project
然后修改CMakeLists.txt文件,集成so
cmake_minimum_required(VERSION 3.4.1)

find_library(log-lib log)

add_library(native-lib
            SHARED
            src/main/cpp/native-lib.cpp )

set(JNI_LIBS_DIR ${CMAKE_SOURCE_DIR}/src/main/jniLibs)

add_library(avutil
            SHARED
            IMPORTED )
set_target_properties(avutil
                      PROPERTIES IMPORTED_LOCATION
                      ${JNI_LIBS_DIR}/${ANDROID_ABI}/libavutil.so )

add_library(swresample
            SHARED
            IMPORTED )
set_target_properties(swresample
                      PROPERTIES IMPORTED_LOCATION
                      ${JNI_LIBS_DIR}/${ANDROID_ABI}/libswresample.so )

add_library(swscale
            SHARED
            IMPORTED )
set_target_properties(swscale
                      PROPERTIES IMPORTED_LOCATION
                      ${JNI_LIBS_DIR}/${ANDROID_ABI}/libswscale.so )

add_library(avcodec
            SHARED
            IMPORTED )
set_target_properties(avcodec
                      PROPERTIES IMPORTED_LOCATION
                      ${JNI_LIBS_DIR}/${ANDROID_ABI}/libavcodec.so )

add_library(avformat
            SHARED
            IMPORTED )
set_target_properties(avformat
                      PROPERTIES IMPORTED_LOCATION
                      ${JNI_LIBS_DIR}/${ANDROID_ABI}/libavformat.so )

add_library(avfilter
            SHARED
            IMPORTED )
set_target_properties(avfilter
                      PROPERTIES IMPORTED_LOCATION
                      ${JNI_LIBS_DIR}/${ANDROID_ABI}/libavfilter.so )

add_library(avdevice
            SHARED
            IMPORTED )
set_target_properties(avdevice
                      PROPERTIES IMPORTED_LOCATION
                      ${JNI_LIBS_DIR}/${ANDROID_ABI}/libavdevice.so )

include_directories(${JNI_LIBS_DIR}/includes)

target_link_libraries(native-lib
                      avutil swresample swscale avcodec avformat avfilter avdevice
                      ${log-lib} )

简要说明:

最后再放出效果图:


avcodec

示例代码:https://github.com/coopsrc/FFPlayerDemo

相关文章

网友评论

  • 我只需要:我想问一下,我把视频放在我的手机
    String videoPath = Environment.getExternalStorageDirectory() + "/Movies/PERU.mp4";
    mVideoView.playVideo(videoPath);
    这个目录下,运行的时候总是报错
    if (avformat_open_input(&formatContext, videoPath, NULL, NULL) != 0) {
    ALOGE("Cannot open video file: %s\n%d\n", videoPath);
    return;
    }
    这是为什么呢?
    Coopsrc:检查一下应用权限,应用空间 权限要有的。demo中没有做动态申请权限,需要手动在设置中开启。
  • 回眸婉约:问一下 jniLibs下面的 include 是怎么来的 我在linux 上按照你给的 .sh 没编译出来
    Coopsrc:@徊眸婉约 我的环境时mac所以用darwin-x86_64,需要按自己的环境修改,严格按照脚本的话,编译结果会和第一张图一致。或者,单独再执行一次make install
    回眸婉约:@Coopsrc 不知道什么问题 我用你这个脚本 第二该行"darwin-x86_64" 我自己的没这个文件夹
    我改成了我看NDK 目录下 有这个 文件夹 "linux-x86_64" 然后就能编译了 ,但是 编译到最后 的时候 cmd 提示 说 倒数第二行 } not found 然后 命令就结束了, 然后 看结果 4个文件夹 都出来了 里面也有so文件 就是缺少include 文件 ···大哥还是这是什么情况吗?
    Coopsrc:make install-libs 只会安装 so文件到目标文件夹,make install会安装所有的,包括include。

本文标题:使用Android Studio开发FFmpeg的正确姿势

本文链接:https://www.haomeiwen.com/subject/aweekxtx.html