android - 两次调用 ffmpeg.c 导致应用程序崩溃时出现问题?

标签 android c android-ndk ffmpeg

我正在尝试调用 ffmpeg.c 来修剪基于此代码 'video-trimmer' 的视频。因此,当我第一次尝试运行 Activity (加载并使用 native 库)时,我单击 trin 它可以工作并且我可以修剪视频但是当我再次尝试运行它时它崩溃了(并且它只适用于应用程序重新启动).

所以我花了三天时间寻找这个问题的解决方案,大多数答案都说 ffmpeg.c 中的静态变量存在问题,并创建一个加载和卸载类的库修复了这个问题( answer1answer2 )。所以我尝试在视频修剪器项目上应用基于答案和 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/

相关文章:

Android - NDK 共享库使用 nm/objdump 提取相关的 JNI Hook

c++ - 如何在 C/C++ 中的 unsigned char 数组中生成 n 个随机 1?

c - 不兼容的指针类型警告

c - 如何从 C 代码调用汇编函数?

android - NDK 错误....在执行 ndk-build 时

android - crystax : sqlite/3/Android. mk:找不到带有标签 'openssl/1.0.2h' 的模块

android - 如何防止在设置中明确共享偏好

android - Camera onPictureTaken() 有时不被调用

java - 如何在带有 firebase 的 android studio 中使用多个过滤器

java - 在android中解析没有名称的json数组