[2].FFMpeg入门之 - Android使用FFMpeg命令

1.编译ffmpeg源码生成对应android平台下的so文件。我的编译脚本:

export NDK=/home/dengxuan/Android/Sdk/ndk-bundle
export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt
export PLATFORM=$NDK/platforms/android-15/arch-arm
export PREFIX=$(pwd)/android/build2
build_one(){
  ./configure --target-os=linux --prefix=$PREFIX \
--enable-cross-compile \
--enable-runtime-cpudetect \
--disable-asm \
--arch=arm \
--cc=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi-gcc \
--cross-prefix=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi- \
--disable-stripping \
--nm=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi-nm \
--sysroot=$PLATFORM \
--enable-gpl --enable-shared --disable-static --enable-small \
--disable-ffprobe --disable-ffplay --disable-ffmpeg --disable-ffserver --disable-debug \
--extra-cflags="-fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -marm -march=armv7-a"
}
build_one
make
make install

编译成功后,会在生成android文件夹,其中build2文件夹下面的就是本次编译生成的。

image.png

拷贝这些到你的工程中。

image.png

其中config.h是编译后生成的,这个也要加上。在cpp目录下 加上对应的头文件

image.png

在ffmpeg.c的main函数(前面被改名了run)return 前面加上

    nb_filtergraphs = 0;
    progress_avio = NULL;
    input_streams = NULL;
    nb_input_streams = 0;
    input_files = NULL;
    nb_input_files = 0;
    output_streams = NULL;
    nb_output_streams = 0;
    output_files = NULL;
    nb_output_files = 0;

在native-lib.cpp中添加执行命令的jni方法

JNIEXPORT jint JNICALL
Java_com_xxx_svsdk_tools_FFMpegUtils_execute(
        JNIEnv *env,
        jobject /* this */, jobjectArray commands) {

        int argc = env->GetArrayLength(commands);
        char *argv[argc];
        int i;
        for (i = 0; i < argc; i++) {
            jstring js = (jstring) env->GetObjectArrayElement(commands, i);
            argv[i] = (char *) env->GetStringUTFChars(js, 0);
        }
        return execute(argc, argv);
    }
}

在对应的java文件中添加对应的方法,这里我加了一个对应的裁剪方法

public class FFMpegUtils {

    public static int cutVideo(String in,String out,long start,long duration){
        StringBuilder builder = new StringBuilder("ffmpeg -ss ");
        builder.append(ViewUtil.parseTimeToString(start)).append(" ")
                .append("-t ").append(ViewUtil.parseTimeToString(duration))
                .append(" -i ").append(in)
                .append(" -vcodec copy -acodec copy ")
                .append(out);
        Logger.i(builder.toString());
        return execute(builder.toString().split(" "));
    }

    public static native String avcodecinfo();
    public static native int execute(String[] cmd);
    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
        System.loadLibrary("avutil55");
        System.loadLibrary("swresample2");
        System.loadLibrary("avcodec57");
        System.loadLibrary("avfilter6");
        System.loadLibrary("swscale4");
        System.loadLibrary("avformat57");
        System.loadLibrary("postproc54");
        System.loadLibrary("avdevice57");
    }
}

对应的CMakeLists.txt文件

# Sets the minimum version of CMake required to build the native
# library. You should either keep the default value or only pass a
# value of 3.4.0 or lower.

cmake_minimum_required(VERSION 3.4.1)

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 )

#set(distribution_DIR ${CMAKE_SOURCE_DIR}/../../../../libs)



add_library( avutil55
             SHARED
             IMPORTED )
set_target_properties( avutil55
                       PROPERTIES IMPORTED_LOCATION
                       ../../../../libs/armeabi-v7a/libavutil55.so )

add_library( swresample2
             SHARED
             IMPORTED )
set_target_properties( swresample2
                       PROPERTIES IMPORTED_LOCATION
                       ../../../../libs/armeabi-v7a/libswresample2.so )
add_library( avcodec57
             SHARED
             IMPORTED )
set_target_properties( avcodec57
                       PROPERTIES IMPORTED_LOCATION
                       ../../../../libs/armeabi-v7a/libavcodec57.so )
add_library( avfilter6
             SHARED
             IMPORTED)
set_target_properties( avfilter6
                       PROPERTIES IMPORTED_LOCATION
                       ../../../../libs/armeabi-v7a/libavfilter6.so )
add_library( swscale4
             SHARED
             IMPORTED)
set_target_properties( swscale4
                       PROPERTIES IMPORTED_LOCATION
                       ../../../../libs/armeabi-v7a/libswscale4.so )

add_library( avformat57
             SHARED
             IMPORTED)
set_target_properties( avformat57
                       PROPERTIES IMPORTED_LOCATION
                       ../../../../libs/armeabi-v7a/libavformat57.so )

add_library( postproc54
             SHARED
             IMPORTED)
set_target_properties( postproc54
                       PROPERTIES IMPORTED_LOCATION
                       ../../../../libs/armeabi-v7a/libpostproc54.so )

add_library( avdevice57
             SHARED
             IMPORTED)
set_target_properties( avdevice57
                       PROPERTIES IMPORTED_LOCATION
                       ../../../../libs/armeabi-v7a/libavdevice57.so )

add_library( native-lib
             SHARED
             src/main/cpp/native-lib.cpp
             src/main/cpp/cmdutils.c
             src/main/cpp/ffmpeg.c
             src/main/cpp/ffmpeg_filter.c
             src/main/cpp/ffmpeg_opt.c

              )

include_directories(libs/include)

#target_include_directories(native-lib PRIVATE libs/include)

target_link_libraries( native-lib avutil55 swresample2 avcodec57 avfilter6 swscale4 avformat57 postproc54 avdevice57 -landroid # Add this.
                       ${log-lib} )

选择一个视频去裁剪,可以看到log打出来的对应的裁剪命令:

image.png
ffmpeg -ss 00:00 -t 00:10 -i /storage/sdcard0/DCIM/Camera/VID_20170817_140402.mp4 -vcodec copy -acodec copy /storage/sdcard0/Movies/svsdk/svsdk_1505267724271.mp4
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容