我正在尝试调用ffmpeg.c来修剪基于此代码'video-trimmer'的视频。所以,当我尝试运行活动(加载并使用本机库)时,我第一次单击它可以工作,我可以修剪视频,但当我再次尝试运行它时崩溃(它只适用于应用程序重启)。
所以我花了三天时间寻找这个问题的解决方案,大多数答案说ffmpeg.c中的静态变量问题,并创建一个加载和卸载类的lib修复了问题(answer1 ,answer2)。所以我尝试在视频修剪器项目中应用基于答案和this github repo的解决方案,但我的所有尝试都失败了。
有没有人知道修复问题的'video-trimmer'项目的分支?或者任何人都可以逐步回答如何在'video-trimmer'项目中实施解决方案(因为我试图在网络上遵循所有解决方案并将其应用于该项目但没有运气)。
答案 0 :(得分:2)
问题似乎是初始化的值(一些变量被声明为全局静态变量,可能是为了便于访问但是破坏了OOP原则并导致我们面临的问题),但是,有几种方法可以这是我能想到的:
avcodec_register_all(), avdevice_register_all(), av_register_all()
avcodec_find_encoder(), avcodec_find_decoder(), av_find_stream_info()
avcodec_open(), avcodec_close()
<强>附录:强>
libffmpeginvoke
而不是libffmpeg
让我知道你是否需要更深入的东西:我可以尝试制作一个测试框架来复制你的问题,看看我得到了什么,虽然这需要访问我的家用电脑,因为我在工作时没有Android SDK。
答案 1 :(得分:1)
帮助我们,请提供您实施的代码或部分代码。此外,崩溃日志也会有所帮助。
提示:初始化ffmpeg对象/线程。 然后使用回叫接口。一旦VideoTrimmer结束,给出一个回调。 在该回调中调用ffmpeg对象/线程的destroy / kill。
可能这个link可以帮到你。
我最近使用了来自github的“android-ffmpeg-java”项目,这是一个工作库,我可以保证。您只需要实现一个可以完成工作的包装器(测试应用程序)
查看此链接以获取来源:android-ffmpeg-java
请查看此链接,例如:android-ffmpeg-cmdline。看看你能否解决这个问题。
答案 2 :(得分:0)
我不确定这是否有帮助,但C文件通常有一个标题,您可以使用
ifndef
请参阅以下内容: http://www.cprogramming.com/reference/preprocessor/ifndef.html
使用该语法对关联的.h文件中的声明进行处理,以确保多次导入不会导致导入代码崩溃。
祝你好运!
编辑:好的,看起来这意味着将ffmpeg重新编译为.so文件。您应该尝试验证它是否具有上述代码库中所述的机制,并尝试确认它不会以某种方式加载两次。
答案 3 :(得分:0)
虽然有些粗糙,但潜在的解决方法可能是利用/链接到服务中的ffmpeg(最好还是这样做),在清单中声明它在自己的进程而不是客户端活动中运行。然后让该进程自行终止 - 如果需要,在任务完成时调用native exit()。 Android不会特别喜欢这种情况 - 这不是一个好习惯 - 但你可能会让它发挥作用。
重新设计库以便能够将自身重置为一个新状态(甚至使其完全上下文)会更好,但是对于一个庞大的遗留代码库可能会被证明是一个大项目。