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

export NDK=/home/dengxuan/Android/Sdk/ndk-bundleexport PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuiltexport PLATFORM=$NDK/platforms/android-15/arch-armexport PREFIX=$(pwd)/android/build2build_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_onemakemake 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 JNICALLJava_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

更多相关文章

  1. android判断软件是否第一次运行的方法
  2. Android(安卓)AlertDialog 无法弹出输入法
  3. android获取应用基本信息
  4. android R文件生成错误
  5. android dialog屏蔽back返回键的解决方法
  6. Android(安卓)定制RadioButton样式
  7. Android(安卓)文件下载三种基本方式
  8. Android(安卓)关于@NonNull
  9. Android常用控件-DatePicker以及对话框的两种使用方法

随机推荐

  1. Android——导入已存在的android工程时出
  2. Android窗口机制(三)Window和WindowManager
  3. 用Eclipse开发Android应用程序(2): 开发
  4. Android学习笔记(一)——src和background区
  5. Android异步处理三:Handler+Looper+Messag
  6. Android中gravity与layout_gravity的区别
  7. Android游戏引擎-Rokon
  8. android 设置Button或者ImageButton的背
  9. android:gravity ,和 android:layout_grav
  10. Android(安卓)文字阴影、layer-list、sha