如何在 Android Studio (ver 2.1.2) 上构建 FFmpeg (ver 3.1.1) [英] How to build FFmpeg (ver 3.1.1) on Android Studio (ver 2.1.2)

查看:34
本文介绍了如何在 Android Studio (ver 2.1.2) 上构建 FFmpeg (ver 3.1.1)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试在 Android Studio 上构建和使用 FFmpeg 库.

我的环境

Windows 7 64 位、Cygwin64、Android Studio 2.1.2、FFmpeg 3.1.1、Android NDK r12b

参考.页

我构建了我的项目.

但是,失败并打印此消息.

我无法解决我的问题.如何在 Android Studio 上构建和使用 FFmpeg 库.

不要告诉我其他使用 FFmpeg 的库.

解决方案

我从来没有在 Android Studio 本身中构建过 ffmpeg,我使用了原生构建,它在自己的目录中安装了库和头文件,以备不时之需使用.

这是我的构建脚本,它启用 gpl 以便我可以访问 yadif deinterlace 过滤器:

#!/bin/bashNDK=$HOME/Android/Sdk/ndk-bundleSYSROOT=$NDK/platforms/android-19/arch-arm/TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64CPREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-函数 build_it {./配置 \--prefix=$PREFIX \--disable-static \--启用共享\--disable-doc \--disable-ffmpeg \--disable-ffplay \--disable-ffprobe \--disable-ffserver \--disable-avdevice \--disable-doc \--disable-symver \--cross-prefix=$CPREFIX \--target-os=linux \--arch=手臂 \--启用交叉编译\--启用-gpl \--sysroot=$SYSROOT \--extra-cflags="-Os -fpic $ADDI_CFLAGS" \--extra-ldflags="$ADDI_LDFLAGS" \$ADDITIONAL_CONFIGURE_FLAG清洁制作进行安装}CPU=手臂PREFIX=$(pwd)/android/$CPUADDI_CFLAGS="-marm"构建_it

我在 Android Studio 中的 gradle 脚本可能会帮助您启动和运行:

应用插件:'com.android.model.application'模型 {安卓 {def ffmpeg = "src/main/android/armeabi-v7a/include"构建工具版本23.0.1"compileSdkVersion 23defaultConfig.with {minSdkVersion.apiLevel = 19}ndk{模块名称 = "ffplayer2jni"ldLibs.addAll("log", "android", "GLESv2", "dl", "atomic", "EGL","z"、"stdc++"、"OpenSLES")cppFlags.addAll("-std=c++11", "-fexceptions", '-I'+file(ffmpeg),"-D __cplusplus=201103L", "-frtti","-D __GXX_EXPERIMENTAL_CXX0X__")CFlags.add('-I'+file(ffmpeg))stl = "gnustl_static"//stl = "stlport_shared"abiFilters.addAll("armeabi-v7a")}}android.buildTypes {释放 {minifyEnabled falseproguardFiles.add(file('proguard-android.txt'))}}存储库{def loc = "src/main/jniLibs/armeabi-v7a/"库(预建库){libavutil {binaries.withType(SharedLibraryBinary) {sharedLibraryFile = file(loc + "libavutil.so")}}libavcodec {binaries.withType(SharedLibraryBinary) {sharedLibraryFile = file(loc + "libavcodec.so")}}库格式{binaries.withType(SharedLibraryBinary) {sharedLibraryFile = file(loc + "libavformat.so")}}库过滤器{binaries.withType(SharedLibraryBinary) {sharedLibraryFile = file(loc + "libavfilter.so")}}libpostproc {binaries.withType(SharedLibraryBinary) {sharedLibraryFile = file(loc + "libpostproc.so")}}libswresample {binaries.withType(SharedLibraryBinary) {sharedLibraryFile = file(loc + "libswresample.so")}}libswscale {binaries.withType(SharedLibraryBinary) {sharedLibraryFile = file(loc + "libswscale.so")}}}}android.sources {主要的 {jni{依赖{库libavformat"链接共享"库libavcodec"链接共享"库libavfilter"链接共享"库libavutil"链接共享"库libswscale"链接共享"库libswresample"链接共享"库libpostproc"链接共享"}}}}}依赖{编译文件树(目录:'libs',包括:['*.jar'])testCompile 'junit:junit:4.12'编译'com.android.support:appcompat-v7:23.3.0'}

在 cpp 项目中包含标题

#define __STDC_LIMIT_MACROS#define __STDC_CONSTANT_MACROS#ifndef INT64_C#define INT64_C(c) (c ## LL)#define UINT64_C(c) (c ## ULL)#万一#ifdef __cplusplus外部C"{#万一#include #include #include #include "libavcodec/avcodec.h"#include "libavformat/avformat.h"#include "libavutil/pixfmt.h"#include "libavutil/mathematics.h"#include "libavutil/samplefmt.h"#include "libavfilter/avfilter.h"#include "libavfilter/avfiltergraph.h"#ifdef __cplusplus}#万一#include <字符串>#include <列表>#include <向量>#include "pthread.h"#include "sched.h"#include "unistd.h"#include "stdio.h"#include "time.h"

I try to build and use FFmpeg Library on Android Studio.

My Environments

Windows 7 64bit, Cygwin64, Android Studtio 2.1.2, FFmpeg 3.1.1, Android NDK r12b

Ref. Page

http://www.roman10.net/2013/08/18/how-to-build-ffmpeg-with-ndk-r9/ I follow this page.

I succeed FFmpeg library build using ./build_android.sh on Cygwin

so I try to use FFmpeg Library's on Android Studio.

Setting Android Studio for use FFmpeg

my project_path/jni/Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := ffmpeg_trim
LOCAL_SRC_FILES := ffmpeg_trim.c

LOCAL_LDLIBS := -lz -ljnigraphics

LOCAL_SHARED_LIBRARIES := libavformat libavcodec libavutil libswscale libswresample

LOCAL_EXPORT_C_INCLUDES := ($LOCAL_PATH)/include

include $(BUILD_SHARED_LIBRARY)

$(call import-module,ffmpeg-3.1.1/android/arm)

my jni/Application.mk

APP_ABI := armeabi-v7a

my project_path/jni/ffmpeg_trim.c

#include "my_package_util_TrimUtil.h"
#include <libavformat/avformat.h>

JNIEXPORT void JNICALL
Java_my_package_videoeditor_util_TrimUtil_registerAll(JNIEnv *env, jobject obj)
{
    av_register_all();
}

my project_path/jni/ffmpeg_trim.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class my_package_videoeditor_util_TrimUtil */

#ifndef _Included_my_package_videoeditor_util_TrimUtil
#define _Included_my_package_videoeditor_util_TrimUtil
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     my_package_videoeditor_util_TrimUtil
 * Method:    registerAll
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_my_package_util_TrimUtil_registerAll
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

my project_path/build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "24.0.0"

    defaultConfig {
        applicationId "my.package.videoeditor"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors {
        mp4parser {
            applicationIdSuffix ".mp4parser"
        }
        ffmpeg {
            applicationIdSuffix ".ffmpeg"
            ndk {
                moduleName "ffmpeg_trim"
                cFlags "-std=c99 -I${project.buildDir}/../src/ffmpeg/jni/include"
            }

            sourceSets.main {
                jni.srcDirs = []
                jniLibs.srcDir 'src/ffmpeg/libs'
            }
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.googlecode.mp4parser:isoparser:1.1.21'
}

my project_path/jni folder

I build my Project.

But, failed and print this message.

I can't solve my problem. How to build and use FFmpeg Library on Android Studio.

Don't tell me other libraries using FFmpeg.

解决方案

I've never built ffmpeg in Android Studio itself, I've used the native build for that which install the libs and the headers in their own directories ready for use.

Here's my build script which enables gpl so I could access the yadif deinterlace filter:

#!/bin/bash

NDK=$HOME/Android/Sdk/ndk-bundle
SYSROOT=$NDK/platforms/android-19/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
CPREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-

function build_it {
./configure \
    --prefix=$PREFIX    \
    --disable-static    \
    --enable-shared     \
    --disable-doc       \
    --disable-ffmpeg    \
    --disable-ffplay    \
    --disable-ffprobe   \
    --disable-ffserver  \
    --disable-avdevice  \
    --disable-doc       \
    --disable-symver    \
    --cross-prefix=$CPREFIX \
    --target-os=linux   \
    --arch=arm      \
    --enable-cross-compile  \
    --enable-gpl        \
    --sysroot=$SYSROOT  \
    --extra-cflags="-Os -fpic $ADDI_CFLAGS" \
    --extra-ldflags="$ADDI_LDFLAGS" \
    $ADDITIONAL_CONFIGURE_FLAG
    make clean
    make
    make install
}

CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"

build_it

My gradle script in Android Studio might help get you up and running:

apply plugin: 'com.android.model.application'

model {
    android {
        def ffmpeg = "src/main/android/armeabi-v7a/include"

        buildToolsVersion "23.0.1"
        compileSdkVersion 23

        defaultConfig.with {
            minSdkVersion.apiLevel = 19
        }

        ndk {
            moduleName = "ffplayer2jni"

            ldLibs.addAll("log", "android", "GLESv2", "dl", "atomic", "EGL",
                    "z", "stdc++", "OpenSLES")

            cppFlags.addAll("-std=c++11", "-fexceptions", '-I'+file(ffmpeg),
                    "-D __cplusplus=201103L", "-frtti",
                    "-D __GXX_EXPERIMENTAL_CXX0X__")
            CFlags.add('-I'+file(ffmpeg))

            stl = "gnustl_static"
            //stl = "stlport_shared"

            abiFilters.addAll("armeabi-v7a")
        }
    }

    android.buildTypes {
        release {
            minifyEnabled false
            proguardFiles.add(file('proguard-android.txt'))
        }
    }

    repositories {
        def loc = "src/main/jniLibs/armeabi-v7a/"

        libs(PrebuiltLibraries) {

            libavutil {
                binaries.withType(SharedLibraryBinary) {
                    sharedLibraryFile = file(loc + "libavutil.so")
                }
            }

            libavcodec {
                binaries.withType(SharedLibraryBinary) {
                    sharedLibraryFile = file(loc + "libavcodec.so")
                }
            }

            libavformat {
                binaries.withType(SharedLibraryBinary) {
                    sharedLibraryFile = file(loc + "libavformat.so")
                }
            }

            libavfilter {
                binaries.withType(SharedLibraryBinary) {
                    sharedLibraryFile = file(loc + "libavfilter.so")
                }
            }

            libpostproc {
                binaries.withType(SharedLibraryBinary) {
                    sharedLibraryFile = file(loc + "libpostproc.so")
                }
            }

            libswresample {
                binaries.withType(SharedLibraryBinary) {
                    sharedLibraryFile = file(loc + "libswresample.so")
                }
            }

            libswscale {
                binaries.withType(SharedLibraryBinary) {
                    sharedLibraryFile = file(loc + "libswscale.so")
                }
            }
        }
    }

    android.sources {
        main {
            jni {
                dependencies {
                    library "libavformat" linkage "shared"
                    library "libavcodec" linkage "shared"
                    library "libavfilter" linkage "shared"
                    library "libavutil" linkage "shared"
                    library "libswscale" linkage "shared"
                    library "libswresample" linkage "shared"
                    library "libpostproc" linkage "shared"
                }
            }
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.3.0'
}

EDIT: including the headers in a cpp project

#define __STDC_LIMIT_MACROS
#define __STDC_CONSTANT_MACROS

#ifndef INT64_C
#define INT64_C(c) (c ## LL)
#define UINT64_C(c) (c ## ULL)
#endif

#ifdef __cplusplus
extern "C" {
#endif

#include <libavutil/frame.h>
#include <libavfilter/buffersink.h>
#include <libavfilter/buffersrc.h>
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libavutil/pixfmt.h"
#include "libavutil/mathematics.h"
#include "libavutil/samplefmt.h"
#include "libavfilter/avfilter.h"
#include "libavfilter/avfiltergraph.h"
#ifdef __cplusplus
}
#endif

#include <string>
#include <list>
#include <vector>

#include "pthread.h"
#include "sched.h"
#include "unistd.h"
#include "stdio.h"
#include "time.h"

这篇关于如何在 Android Studio (ver 2.1.2) 上构建 FFmpeg (ver 3.1.1)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆