在Android中多次调用ffmpeg main失败



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

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

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

而且效果很好。视频是从12分出来的。秒到22。秒,并且视频被保存,则该方法正常返回(为0)。

然而,如果我在第一个调用完成后立即进行第二个类似的调用(例如,不同的开始时间),则ffmpeg无法处理该请求,并且会引发分段错误。

对于第一个呼叫,它会提供这样的信息:

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

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

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

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

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

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

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

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

通过添加这些行,您将永远不会再得到segfault。

最新更新