1.日志
日志不是万能的,然而没有日志是万万不能的。debug就指着他了。
那么,怎么才能在Android的环境下看到ffmpeg执行的日志呢。
来,我们找一下那些Android相关的log函数。(我的是在logjam.h文件)
他们大约长这样
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, LOGTAG, __VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , LOGTAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO , LOGTAG, __VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN , LOGTAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , LOGTAG, __VA_ARGS__)
看到了亲切的android字样了吧,__android_log_print就是打印到android的Logcat里的函数。
所以接下来就简单了,把这些LOGD什么的添加到你需要打印的地方就好了。
比如这个输出命令参数的语句:
for (i = 0; i < argc; i++) {
jstring js = (jstring) (*env)->GetObjectArrayElement(env, commands, i);
argv[i] = (char*) (*env)->GetStringUTFChars(env, js, 0);
LOGD("Kit argv %s\n", argv[i]);
}
2.重置ffmpeg
还记得cmdutils.c文件中的exit_program函数不?之前把其中的exit(ret)
改成了return ret
。这样就不会在ffmpeg命令执行完毕后就退出导致应用关闭了。
然而,这又导致了一个新问题,第一次调用的时候一切正常,再次调用命令时却给了我一个
A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x4 in tid 13510 (AsyncTask #2)
原因大约是指针没有清零。所以,就清一个呗。
在ffmpeg.c文件中找到ffmpeg_cleanup函数。然后在函数的最后将这帮货统统置NULL和置0。
filtergraphs = NULL;
nb_filtergraphs = 0;
output_files = NULL;
nb_output_files = 0;
output_streams = NULL;
nb_output_streams = 0;
input_files = NULL;
nb_input_files = 0;
input_streams = NULL;
nb_input_streams = 0;
最后还要记得在exit_program的地方执行ffmpeg_cleanup(0)。(比如ffmpeg.c文件中run函数的最后)
看来要做好Android还要复习一下C。好有压力。
相关:在Android中使用FFmpeg(android studio环境)