7

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

所以我花了三天时间寻找这个问题的解决方案,大多数答案都说 ffmpeg.c 中的静态变量存在问题,并创建一个加载和卸载类的库来解决问题(answer1answer2)。因此,我尝试将基于答案的解决方案和github 存储库应用于 video-trimmer 项目,但我所有的尝试都失败了。

有没有人知道解决问题的“视频修剪器”项目的一个分支?或者任何人都可以提供有关如何在“视频修剪器”项目中实施解决方案的逐步答案(因为我试图遵循网络上的所有解决方案并将它们应用于该项目但没有运气)。

4

4 回答 4

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()
      • 例如,这些可以包装在一个布尔控制的方法中,这样如果它们以前运行过,它们就不能再次运行。
  • 另一种控制事物的方法是手动强制在后续运行中重新初始化的变量值(通过使用类或结构来控制 ffmpeg 全局变量),例如在运行当前导致代码失败的方法时,第一步可能是手动将变量设置回其默认设置,以便它们正确运行,因为我怀疑您在迭代之间保留了数据,这就是导致问题的原因。
  • 您可以使用互斥锁来确保上述方法在与线程一起使用时表现得更负责任。

附录:

  • 如果您要多次调用 main()也(在 C 级别)libffmpeginvoke优先使用libffmpeg
  • 在调用加载 ffmpeg 库时强行调用垃圾收集(是的,这是另一个“丑陋”修复),然后它会清理一切,允许您调用另一个实例

如果您需要更深入的内容,请告诉我:我可以尝试制作一个测试框架来复制您的问题并查看我得到的结果,尽管这需要访问我的家用 PC,因为我在工作时没有 Android SDK。

于 2013-01-16T15:33:11.590 回答
1

帮助我们帮助您,请提供您实现的代码或其中的一部分。崩溃日志也会有所帮助。

提示:初始化 ffmpeg 对象/线程。然后使用回调接口。一旦 VideoTrimmer 结束,请进行回调。在该回调中调用 ffmpeg 对象/线程的销毁/终止。

可能这个链接可以帮助你。

我最近使用了来自 github 的“android-ffmpeg-java”项目,这是一个工作库,我可以保证。您只需要实现一个可以完成工作的包装器(测试应用程序)。
检查此链接的来源:android-ffmpeg-java
检查此链接,例如: android-ffmpeg-cmdline。看看你能不能解决这个问题。

于 2013-01-04T11:48:01.277 回答
0

虽然有些粗糙,但潜在的解决方法可能是利用/链接到来自服务的 ffmpeg(无论如何你最好这样做),该服务在清单中声明为在其自己的进程中运行,而不是在客户端活动中运行。然后让该进程自行终止 - 如果需要,调用本机 exit() - 当任务完全完成时。Android 不会特别喜欢这种情况——这不是一个好习惯——但你可以让它工作。

重新设计库以使其能够将自身重置为新状态(甚至使其完全与上下文相关)会更好,但对于庞大的遗留代码库可能会被证明是一个大型项目。

于 2013-01-16T18:35:49.553 回答
0

我不确定这是否会有所帮助,但 C 文件通常有一个可以使用的标题

ifndef

请参阅以下内容: http ://www.cprogramming.com/reference/preprocessor/ifndef.html

使用该语法对相关 .h 文件中的声明进行沙化处理,以确保多次导入不会导致导入代码崩溃。

祝你好运!

编辑:好的,看起来这意味着将 ffmpeg 重新编译为 .so 文件。您应该尝试验证它在代码库中是否具有上述机制,并尝试确认它没有以某种方式被加载两次。

于 2013-01-16T17:18:08.540 回答