2012-08-10 128 views
7

我已经从github上下载了视频裁剪代码,从this link通过ffmpeg进行Android视频裁剪

这是第一次完美的工作,但是当我第二次尝试运行它时,代码崩溃,没有任何异常,然后再次尝试第三次运行崩溃后,它的工作原理! 有没有人有这种行为的想法?

我也在开发一个应用程序,它有一个修剪视频模块。 我真的很感激它,如果有人能帮助我。

+1

任何运气得到这个工作,我面临同样的问题,任何帮助将不胜感激。谢谢.. – 2012-08-23 07:22:58

+0

我面临同样的问题,如果你解决了它,请帮助我。谢谢 – 2015-04-17 07:31:42

+0

尽量不要清理项目,然后运行没有任何问题。 – 2015-04-27 17:49:34

回答

0

我认为你可以完成你的活动,并在代码中的视频剪辑调用后重新启动应用程序。

如果在第二次应用程序崩溃之后,并且在第三个作品中,应用程序可能会在其崩溃后初始化并重新启动应用程序。

尝试加载和卸载了解,在 'ffmpeg.c' 静态瓦尔问题库link

+0

你可以请你重新解释你的答案,我正面临同样的问题,如问题中所述。 – 2012-08-23 07:26:21

+0

好吧,我会试试看。在VideoTrimmingService.java中,您可以在OnCreate中加载您的本地库。我认为如果您在第一次剪裁视频后重新开始活动,第二次不会崩溃。也许这就解释了为什么第三次工作,每次使用它时都必须加载库。 – 2012-08-23 10:26:43

4

https://lists.ffmpeg.org/pipermail/libav-user/2012-May/001964.html

Calling native method twice of third party library in an Activity causes the Android application to close down

当地人...

我敢打赌你有同样的问题,需要做一些事情(3种选择)来重置或GC这些变量:

  1. 获取加载的lib和GC的Java类加载器它

  2. 在C层

    做什么OP上面的链接确实在

  3. 编写使用“的dlsym”第2个共享库和每个呼叫周期

github上期间在所述第一库 'dlclose',请参阅 '自述' here

相同是那乌尔其

+0

优秀的答案队友,来自github链接的自述文件非常有用,您能否请您提供示例演示以解答您的答案1,2和3?由OP给出的第三个答案仅仅是象征性的,并且在C编程中是新手,我无法弄清楚他在做什么,所以有没有其他的链接可以更好地解释它? – 2012-08-29 08:21:11

+1

go with 3.在C语言中构建第二个共享模块,获取字符串中的变量ffmpeg,然后使用dlsym获取句柄,然后调用 - Java_net_video_trimmer_natives_VideoTrimmer_trim,然后执行DLCLOSE .. dlclose清除第一次调用中的所有残留。我的原始ANS HAS CODE中的第三个链接解释了它。克隆它,看看'ffmpeg_invoke' – 2012-08-29 13:54:24

+0

我想知道你是如何得到dlclose工作的,在ndk-documentation中明确指出:“静态析构函数在程序退出时或调用dlclose()时不会被调用。请参阅系统的问题的文件在你的NDK文件夹 – 2012-09-06 07:35:48

3

只要能使你的ffmpeg.c一个方法,它将看起来这

void exitmycode(){ 
     ffmpeg_exit(0); 

} 

ffmpeg_exit(0)方法已经存在在起诉ffmpeg.c你只需要调用exitmycode();后从你的主C文件视频修整完成。

现在发生的情况是,当您使用ffmpeg修剪视频或其他任何内容时,它不会完全退出,因此下次运行该命令时会退出,但它也不会运行您的修剪如果你第三次运行,命令可以完美执行。所以,我所做的是在处理完成后手动调用ffmpeg_exit(0)

+0

我认为这会导致整个应用程序退出 - 即包括Android Java调用代码?另外,据我所见,ffmpeg_exit()已经被最新的ffmpeg源代码中的exit_program()所取代。 – Mick 2015-02-23 19:32:50

-1

做一件事

如果您已经安装ffmpeg4android_os lib中,那么你只需要注释1线法的 StopTranscoding这样

public void stopTranscoding() { 
     Log.d(Prefs.TAG, "stopTranscoding called"); 
     if (_transcodeBackground != null) { 
      //_transcodeBackground.forceCancel(); 
     } 
    } 

所有....