伙计们。我是Android JNI开发以及ffmpeg libs的新手。
经过一些努力,我设法解码实时H264数据,但在释放ffmpeg解码器时遇到错误:
12-11 19:54:36.428 27959-27959/com.example.firmament.dji A/libc﹕ invalid address or address of corrupt block 0x6fa13868 passed to dlfree
12-11 19:54:36.430 27959-27959/com.example.firmament.dji A/libc﹕ Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 27959 (e.firmament.dji)
stackoverflow中的一些问题提到这个错误与错误地释放了一些被保护的内存有关(与Segment Fault相同)。
我检查了C JNI代码的次数并且无法修复bug,这是我的代码(发布部分):
jint Java_com_example_firmament_dji_XKZH264_release(JNIEnv *env, jobject obj)
{
if (pFrame != NULL) {
av_free(pFrame);
pFrame = NULL;
}
if (pCodecContext != NULL) {
avcodec_close(pCodecContext);
av_free(pCodecContext);
pCodecContext = NULL;
}
if (pParserContext != NULL) {
av_parser_close(pParserContext);
av_free(pParserContext);
pParserContext = NULL;
}
DeleteYUVTab();
return 1;
}
void DeleteYUVTab()
{
if (colortab != NULL) {
av_free(colortab);
colortab = NULL;
}
if (rgb_2_pix != NULL) {
av_free(rgb_2_pix);
colortab = NULL;
}
}
答案 0 :(得分:2)
哦,经过一番挣扎,我终于解决了这个问题。
av_parser_close(pParserContext);
这个语句好像已经有了免费的avCodecParserContext,所以另一个av_free会导致段错误。只需删除它并解决问题。