在Android 中使用FFmpeg命令

2019-09-05 20:54:21

参考文章 在Android 中使用FFmpeg命令

如何编译FFmpeg 并且引入Android Studio

如何在Android 中使用FFmpeg命令 ?

Github 项目源码 ffmpeglibrary 如果喜欢😍star走一个。

在FFmpeg目录在找到

cmdutils.c cmdutils.h cmdutils_common_opts.h config.h ffmpeg.c ffmpeg.h ffmpeg_filter.c ffmpeg_opt.c(注意:config.h需要编译后才有)到 cpp 目录下。

把FFmpeg 下面的文件也需要copy 到 cpp下

100011.png

修改部分文件

修改cmdutils.c 和 cmdutils.h
找到cmdutils.c中的exit_program函数
修改前:

int exit_program(int ret)
{
     if (program_exit)
        program_exit(ret);
    exit(ret);
 }

修改后:

int exit_program(int ret)
{
    if (program_exit)
        program_exit(ret);
    return ret;
}

找到cmdutils.h中exit_program的申明,也把返回类型修改为int:如下:

int exit_program(int ret);

修改ffmpeg.c与ffmpeg.h
找到ffmpeg.c,把int main(int argc, char argv) 改名为 int run(int argc, char argv) (名字可以随便起)
找到ffmpeg.h, 在文件末尾添加函数申明: int run(int argc, char **argv);(需要和ffmpeg.c 所起名字保持一致)

编写文件调用:

JNIEXPORT jint JNICALL
Java_com_maiml_ffmpeglibrary_FFmpeg_run(JNIEnv *env, jobject instance, jobjectArray commands) {

    // TODO
    av_log_set_callback(my_logcat);

    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 run_command(argc, argv);
}

到这里就可以运行FFmpeg命令了。一直我也是这样使用,但是我在做这个项目Cut的时候发现连续调用多次FFmpeg命令会报错(在项目需要,先改变分镜头的速度,再合成视频)。
为什么会这样的呢?
FFmpeg每次执行完命令后会调用 ffmpeg_cleanup 函数清理内存,并且会调用exit(0)结束当前进程,但是经过我们的修改,exit()的代码已经被删掉,而我们的App还在运行,不能杀死进程,所以有些变量的值还在内存中,这样就会导致下次执行的时候可能会出错。
打开ffmpeg.c找到刚修改的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;

参考文章
FFmpeg
编译Android下可执行命令的FFmpeg

END。


  • 2018-11-17 21:05:48

    Android ANR发生的原因总结和解决办法

    ANR的全称是application not responding,是指应用程序未响应,Android系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过长,都会造成ANR。一般地,这时往往会弹出一个提示框,告知用户当前xxx未响应,用户可选择继续等待或者Force Close。

  • 2018-11-17 21:08:09

    Android 单个应用的内存限制

    获取Android手机应用内存大小 手机不同其性能也不同,手机本身内存可能有大有小,所以针对每个应用的内存大小也不相同。

  • 2018-11-17 21:11:14

    Android中App可分配内存的大小

     结果:(1)未设定属性android:largeheap = "true"时,可以申请到的最大内存空间为221M。      (2)设定属性android:largeheap = "true"时, 可以申请的最大内存空间为478M,是原来的两倍多一些。

  • 2018-11-17 22:44:53

    LeakCanary,30分钟从入门到精通

    在性能优化中,内存是一个不得不聊的话题;然而内存泄漏,显示已经成为内存优化的一个重量级的方向。当前流行的内存泄漏分析工具中,不得不提的就是LeakCanary框架;这是一个集成方便, 使用便捷,配置超级简单的框架,实现的功能却是极为强大的。

  • 2018-11-17 22:53:01

    gc for alloc freed

    在数组中选择图片然后显示,然后。。。logcat不断显示GC回收。最后程序黑屏。

  • 2018-11-17 23:25:38

    Android高效内存1:一张图片占用多少内存

    在做内存优化的时候,我们发现除了解决内存泄露问题,剩下的就只有想办法减少真实的内存占用。而在App中,大部分内存可能被我们图片占用了,所以减少图片的内存占用可以带来直接的效果。本文就简单介绍一张图片到底占用多少内存,我们先假设我们有一张图片时 600 * 800 的,图片占用空间大小假设是 100KB。另外本文知识点也是面试官喜欢问的一个点,看看自己的回答到什么级别了。