我正在尝试调用 ffmpeg.c 来修剪基于此代码 'video-trimmer' 的视频。因此,当我第一次尝试运行 Activity (加载并使用 native 库)时,我单击 trin 它可以工作并且我可以修剪视频但是当我再次尝试运行它时它崩溃了(并且它只适用于应用程序重新启动).
所以我花了三天时间寻找这个问题的解决方案,大多数答案都说 ffmpeg.c 中的静态变量存在问题,并创建一个加载和卸载类的库修复了这个问题( answer1 , answer2 )。所以我尝试在视频修剪器项目上应用基于答案和 this github repo 的解决方案,但我的所有尝试都失败了。
有没有人知道 'video-trimmer' 项目的一个分支解决了这个问题?或者任何人都可以逐步回答如何在 'video-trimmer' 项目中实现解决方案(因为我试图遵循网络上的所有解决方案并将它们应用于该项目但没有运气)。
最佳答案
问题似乎出在初始化值上(一些变量被声明为全局静态变量,大概是为了便于访问,但违反了 OOP 原则并给我们带来了您所面临的问题),但是,有几种方法可以解决这是我能想到的:
- 编写一个快速函数来手动将静态变量设置回它们正确的初始值(快速但不完善但有效)。以下是不允许在需要时触发的方法列表:
avcodec_register_all(), avdevice_register_all(), av_register_all()
avcodec_find_encoder()、avcodec_find_decoder()、av_find_stream_info()
avcodec_open(), avcodec_close()
- 例如,这些可以包含在 bool 控制方法中,这样如果它们以前运行过,就不能再次运行。
- 另一种控制方式是手动强制变量值(通过使用类或结构来控制 ffmpeg 全局变量)在后续运行中重新初始化,例如在运行当前导致代码失败,第一步可能是手动将变量设置回它们的默认设置,以便它们正确运行,因为我怀疑你有数据在迭代之间保持驻留,这就是导致问题的原因。
- 您可以使用互斥锁来确保上述方法在与线程一起使用时表现得更负责任。
附录:
- 如果要多次调用 main(),也(在 C 级别)优先使用
libffmpeginvoke
而不是libffmpeg
- 在加载 ffmpeg 库的调用中强制调用垃圾收集(是的,这是另一个“丑陋”的修复),然后它会清理一切,允许您调用另一个实例
如果你需要更深入的东西,请告诉我:我可以尝试制作一个测试框架来复制你的问题,看看我得到了什么,尽管这需要访问我的家用电脑,因为当我在工作时我没有 Android开发工具包。
关于android - 两次调用 ffmpeg.c 导致应用程序崩溃时出现问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14050020/