2

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

4

2 回答 2

1

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

从同一个 Activity 多次调用 ffmpeg 的 main() 会导致段错误。这仍然是 libffmpeg 的问题,但 libffmpeginvoke 至少应用了此处描述的创可贴解决方案:在 Activity 中调用第三方库的本机方法两次会导致 Android 应用程序关闭

于 2012-10-10T08:09:50.920 回答
1

Hiko制作的这个来自github的例子可以帮助其他人解决问题。 JNI 多次调用 ffmpeg

它的作用是在 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 ...........

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

于 2016-03-27T15:37:31.400 回答