我已将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方法进行多次成功调用的解决方案是什么?
答案 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 ...........
通过添加这些行,您将永远不会再次获得段错误。