在Android中多次调用ffmpeg main失败

时间:2012-09-30 22:38:37

标签: android ffmpeg main

我已将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的main方法进行多次成功调用的解决方案是什么?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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 ...........

通过添加这些行,您将永远不会再次获得段错误。