AS集成FFmpeg

AS集成FFmpeg

项目简介:

AS集成FFmpeg

该项目通过Linux系统编译FFmpeg,并集成到Android Studio项目中。

FFmpeg简介

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL 或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编 解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的 FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X等。这个项目最早由Fabrice Bellard发起,2004年至2015年间由Michael Niedermayer主要负责 维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务 器上。项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"。 多媒体视频处理工具 FFmpeg有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等 。

libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和 读取音视频帧等功能; libavcodec:用于各种类型声音/图像编解码;

libavutil:包含一些公共的工具函 数;

libswscale:用于视频场景比例缩放、色彩映射转换; libpostproc:用于后期效果处理;

ffmpeg:该项目提供的一个工具,可用于格式转换、解码或电视卡即时编码等;

ffsever:一个 HTTP 多媒体即时广播串流服务器;

ffplay:是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显 示;

ffmpeg官网

编译

流程

AS集成FFmpeg

NDK 下载

Android NDK r17c

Linux系统FFmpeg编译

下载NDK r17c

wget https://dl.google.com/android/repository/android-ndk-r17c-linux-x86_64.zip

解压zip

unzip android-ndk-r17c-linux-x86_64

FFmpeg各版本下载

下载FFmpeg

wget http://www.ffmpeg.org/releases/ffmpeg-4.0.2.tar.bz2

解压FFmpeg

tar -xjf ffmpeg-4.0.2.tar.bz2【错误写法,可能导致下一步失败】

tar -jxvf ffmpeg-4.2.2.tar.bz2

编译

./configure 【报错,需要关闭 asm 汇编相关】

./configure --disable-x86asm 【生成 Makefile 已经帮你关闭 asm 】

注意:

  1. 权限 root 必须是root (root # 没有root $)
  2. 手动创建输出的文件夹 /android/arm

在ffmpeg-4.0.2目录下添加文件 build_android.sh

#!/bin/bash

# 首先定义一个NDK目录的变量 NDK_ROOT
NDK_ROOT=/root/study/ndk/android-ndk-r17c

# 此变量执行ndk中的交叉编译gcc所在目录
TOOLCHAIN=$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64

#从as的 externalNativeBuild/xxx/build.ninja,  反正下面的配置,可以压制警告的意思
FLAGS="-isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security  -O0 -fPIC"
INCLUDES=" -isystem $NDK_ROOT/sources/android/support/include"

# 1.定义编译后,所存放的目录
PREFIX=./android/arm

# 2.--enable-small 优化大小 非常重要,必须优化才行的哦
# 3.--disable-programs 不编译ffmpeg程序(命令行工具),我们是需要获取静态、动态库
# 4.--disable-avdevice 关闭avdevice模块,此模块在android中无用
# 5.--disable-encoders 关闭所有编码器(播放不需要编码)
# 6.--disable-muxers 关闭所有复用器(封装器),不需要生成mp4这样的文件,所有关闭
# 7.--disable-filters 关闭所有滤镜
# 8.--enable-cross-compile 开启交叉编译(ffmpeg是跨平台的,注意:并不是所有库都有这么happy的选项)
# 9.--cross-prefix 看右边的值就知道是干嘛的,gcc的前缀..
# 10.disable-shared / enable-static 这个不写也可以,默认就是这样的,(代表关闭动态库,开启静态库)
# 11.--sysroot
# 12.--extra-cflags 会传给gcc的参数
# 13.--arch  --target-os 

./configure \
--prefix=$PREFIX \
--enable-small \
--disable-programs \
--disable-avdevice \
--disable-encoders \
--disable-muxers \
--disable-filters \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--disable-shared \
--enable-static \
--sysroot=$NDK_ROOT/platforms/android-21/arch-arm \
--extra-cflags="$FLAGS $INCLUDES" \
--extra-cflags="-isysroot $NDK_ROOT/sysroot/" \
--arch=arm \
--target-os=android

make clean

make install

sh build_android.sh

结果:在arm文件下生成文件 include lib share

AS 集成FFmpeg

当前配置:

AS 4.1.1

NDK 22.1.7171670

SDK 30.0.3

minSDKVersion 19

  1. 创建Project Native C++
    AS集成FFmpeg

2.将arm文件下相应文件导入

AS集成FFmpeg

3.修改CMakeLists.txt文件

project("ndkdemo")

add_library( # Sets the name of the library.
             native-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             native-lib.cpp )


#引入头文件 FFmpeg
include_directories(${CMAKE_SOURCE_DIR}/include)

#引入库文件FFmpeg
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/${CMAKE_ANDROID_ARCH_ABI}")


find_library( # Sets the name of the path variable.
              log-lib

              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )


target_link_libraries( # Specifies the target library.
                       native-lib

                        #顺序
                        avformat avcodec avfilter avutil swresample swscale

                        #忽略顺序问题
#                        -Wl,--start-group
#                        avformat avcodec avfilter avutil swresample swscale
#                        -Wl,--end-group
                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )
  1. 修改build.gradle
defaultConfig {
        applicationId "com.example.ndkdemo"
        minSdkVersion 19
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags ""
                abiFilters 'armeabi-v7a'
            }
        }
        ndk{
            abiFilters 'armeabi-v7a'
        }
    }

4.修改native-lib.cpp

#include <jni.h>
#include <string>
extern "C"{
#include <libavutil/avutil.h>
}
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_ndkdemo_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "当前的FFmpeg的版本是:";
    hello.append(av_version_info());
    return env->NewStringUTF(hello.c_str());
}

5.run

结果

当前的FFmpeg的版本是:4.0.2

文件

需要.sh文件和编译后文件的可自取

链接:https://pan.baidu.com/s/1-0RLKoZybKx4x4ts8Z9xOw
提取码:ysri

相关问题以及解决方案

XXX:未找到命令

wget

yum -y install wget

unzip

yum list | grep zip/unzip 
yum install zip    (提示输入y)
yum install unzip	    ( 提示输入y)

vim

rpm -qa|grep vim
yum -y install vim-enhanced

tar (child): bzip2:无法 exec: 没有那个文件或目录

yum -y install bzip2

gcc is unable to create an executable file.

gcc is unable to create an executable file.
If gcc is a cross-compiler, use the --enable-cross-compile option.
Only do this if you know what cross compiling means.
C compiler test failed.

If you think configure made a mistake, make sure you are using the latest
version from Git.  If the latest version fails, report the problem to the
ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.
Include the log file "ffbuild/config.log" produced by configure as this will help
solve the problem.

原因:linux系统没有安装gcc编译器

yum install gcc

帮助文档

帮助文档

项目代码

致谢:

如果您觉得我的此项目对您有些帮助,您的star就是对我最大的鼓励!

上一篇:ffmpeg去噪算法


下一篇:unsupported option ‘--noexecstack‘