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

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

问题描述

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



我的环境



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



参考。页





我建立了我的项目。



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





我可以'解决我的问题。如何在Android Studio上构建和使用FFmpeg库。



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

解决方案

我从来没有在Android Studio中构建ffmpeg,我已经使用了原生的构建,可以在自己的目录中安装libs和头文件,以备使用。



这是我的构建脚本,它使gpl能够访问yadif去隔行过滤器:

 #!/ 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

我的Android Studio中的毕业生脚本可能有助于您启动并运行:

 应用插件:'com.android.model.application'

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

buildToolsVersio n23.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(' - 我'+文件(ffmpeg))

stl =gnustl_static
// stl =stlport_shared

abiFilters.addAll(armeabi-v7a)
}
}

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

库ries {
def loc =src / main / jniLibs / armeabi-v7a /

libs(PrebuiltLibraries){

libavutil {
二进制文件。 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 {
二进制文件.withType(SharedLibraryBinary){
sharedLibraryFile = file(loc +libswresample.so)
}
}

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

android.sources共享
库libavcodec链接共享
库libavfilter {
main {
jni {
依赖关系{
库libavformat 链接共享
库libavutil连接共享
库libswscale链接共享
库libswresample链接共享
库libpostproc链接共享
}
}
}
}
}

依赖关系{
编译fileTree(dir:'libs',include:['* .jar'])
testCompile'junit :junit:4.12'
compile'c​​om.android.support:appcompat-v7:23.3.0'
}

编辑:包含cpp项目中的标题

  #define __STDC_LIMIT_MACROS 
#定义__STDC_CONSTANT_MACROS

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

#ifdef __cplusplus
externC{
#endif

#include #include< libavfilter / buffersink.h>
#include< libavfilter / buffersrc.h>
#includelibavcodec / avcodec.h
#includelibavformat / avformat.h
#includelibavutil / pixfmt.h
#includelibavutil / mathematics。 h
#includelibavutil / samplefmt.h
#includelibavfilter / avfilter.h
#includelibavfilter / avfiltergraph.h
#ifdef __cplusplus
}
#endif

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

#includepthread.h
#includesched.h
#includeunistd.h
#includestdio.h
#includetime.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上创建FFmpeg(ver 3.1.1)(版本2.1.2)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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