1.日志
日志不是萬能的纹腌,然而沒有日志是萬萬不能的雾消。debug就指著他了谱姓。
那么瘫寝,怎么才能在Android的環(huán)境下看到ffmpeg執(zhí)行的日志呢爵政。
來慈鸠,我們找一下那些Android相關(guān)的log函數(shù)蓝谨。(我的是在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里的函數(shù)青团。
所以接下來就簡單了譬巫,把這些LOGD什么的添加到你需要打印的地方就好了。
比如這個輸出命令參數(shù)的語句:
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函數(shù)不督笆?之前把其中的exit(ret)
改成了return ret
芦昔。這樣就不會在ffmpeg命令執(zhí)行完畢后就退出導(dǎo)致應(yīng)用關(guān)閉了。
然而娃肿,這又導(dǎo)致了一個新問題咕缎,第一次調(diào)用的時候一切正常珠十,再次調(diào)用命令時卻給了我一個
A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x4 in tid 13510 (AsyncTask #2)
原因大約是指針沒有清零。所以凭豪,就清一個唄焙蹭。
在ffmpeg.c文件中找到ffmpeg_cleanup函數(shù)。然后在函數(shù)的最后將這幫貨統(tǒng)統(tǒng)置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的地方執(zhí)行ffmpeg_cleanup(0)孔厉。(比如ffmpeg.c文件中run函數(shù)的最后)
看來要做好Android還要復(fù)習(xí)一下C。好有壓力帖努。