【问题标题】:Multiple call to ffmpeg main fails in Android在 Android 中多次调用 ffmpeg main 失败
【发布时间】:2012-09-21 20:35:23
【问题描述】:

我已将 ffmpeg 库移植到 Android。使用 JNI 接口,我可以通过向 ffmpeg 的 main 方法提供参数来运行 ffmpeg 命令,就像从命令行一样。

为了获取视频的特定部分,我使用以下命令:

ffmpeg -i /mnt/sdcard/input_video.mp4 -ss 00:00:12 -t 00:00:10 -an /mnt/sdcard/output_video.mp4

而且效果很好。视频从 12. 秒分割到 22. 秒并保存视频,方法正常返回(为 0)。

但是,如果我在第一个调用完成后进行第二次类似的调用(例如不同的开始时间),ffmpeg 将无法处理请求并引发分段错误。

对于第一次通话,它会提供这样的信息:

输入流#0.0 的猜测通道布局:单声道

并且有效。但是对于第二个,消息是这样的:

输入流 #1.0 的猜测通道布局:单声道

它不起作用。我不知道它是否与错误有关。

一般来说,问题应该与静态全局变量有关(我认为),但我无法正确重置它们。对ffmpeg的主要方法进行多次成功调用的解决方案可能是什么?

【问题讨论】:

  • 如何从源代码调用 ffmpeg main()?我可以调用其他 ffmpeg 库(例如 libavcodec 等)方法,但不能调用 ffmpeg main。我正在尝试做与您相同的事情 - 将视频的一部分复制到另一个文件以便能够拆分它。

标签: android ffmpeg main


【解决方案1】:

https://github.com/jhotovy/android-ffmpeg

从同一个 Activity 多次调用 ffmpeg 的 main() 会导致段错误。这仍然是 libffmpeg 的问题,但 libffmpeginvoke 至少应用了此处描述的创可贴解决方案:Calling native method twice of third party library in an Activity causes the Android application to close down

【讨论】:

    【解决方案2】:

    Hiko 制作的这个来自 github 的示例可以帮助其他人解决问题。 JNI invoke ffmpeg more than once

    它的作用是在 main() 方法的开头重新初始化静态变量,如下所示:

    int main(int argc, char **argv)
    {
        LOGI("start run in main.");
        received_sigterm = 0;
        received_nb_signals = 0;
        transcode_init_done = 0;
        ffmpeg_exited = 0;
        main_return_code = 0;
    
        run_as_daemon  = 0;
        nb_frames_dup = 0;
        nb_frames_drop = 0;
    
        nb_input_streams = 0;
        nb_input_files   = 0;
        nb_output_streams = 0;
        nb_output_files   = 0;
        nb_filtergraphs = 0;
        int ret;
        int64_t ti;
    
        register_exit(ffmpeg_cleanup);
        ............................................
        ............................................
        ........... The rest of the code ...........
    

    通过添加这些行,您将永远不会再遇到段错误。

    【讨论】:

      猜你喜欢
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-27
      • 2019-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多