1、在ffmpeg给的例子metadata example中,使用avformat_open_input(&fmt_ctx, argv[1], NULL, NULL)来获得输入文件的metadata,然而在调试的过程中出现内存写错误,查看av_format_open_input()源码发现它会首先判断fmt_ctx是否为空,若为NULL则调用avformat_alloc_context()为fmt_ctx分配内存,调试中发现问题就处在分配内存这里。
将分配内存过程调出来,在将fmt_ctx传给avformat_open_input之前手动为其分配内存:
AVFormatContext *fmt_ctx = NULL;
fmt_ctx = avformat_alloc_context();
发现出现错误(0xC0000005: 读取位置 0x000004cc 时发生访问冲突),问题出现在malloc.c中堆分配时。经调试,问题为:导入的头文件及相应的.lib文件不一致,avdormat_alloc_context()实现机制不一样,调用方法可能不一样。
2、ffmpeg采用的是C99,而微软的vs采用的C89,两个标准显然有一定的差异,如C99中的snprintf,该函数在vs中就未定义,因此采用如下方法解决:
在源文件中加入一下代码,用_snprintf代替snprintf
#if _MSC_VER
#define snprintf _snprintf
#endif
这样做其实是存在缺陷的,snprintf更加强大,若拷贝时溢出,则snprintf返回需要拷贝数据的大小,该返回值其实是很有用的。
3、“INT64_C”: 找不到标识符。
毕竟标准相差太大,在libavutil\common.h中有~INT64_C,vs是无法识别它的,将一下代码加载common.h开头。
#ifndef INT64_C
#define INT64_C(c) (c ## LL)
#define UINT64_C(c) (c ## ULL)
#endif
将分配内存过程调出来,在将fmt_ctx传给avformat_open_input之前手动为其分配内存:
AVFormatContext *fmt_ctx = NULL;
fmt_ctx = avformat_alloc_context();
发现出现错误(0xC0000005: 读取位置 0x000004cc 时发生访问冲突),问题出现在malloc.c中堆分配时。经调试,问题为:导入的头文件及相应的.lib文件不一致,avdormat_alloc_context()实现机制不一样,调用方法可能不一样。
2、ffmpeg采用的是C99,而微软的vs采用的C89,两个标准显然有一定的差异,如C99中的snprintf,该函数在vs中就未定义,因此采用如下方法解决:
在源文件中加入一下代码,用_snprintf代替snprintf
#if _MSC_VER
#define snprintf _snprintf
#endif
这样做其实是存在缺陷的,snprintf更加强大,若拷贝时溢出,则snprintf返回需要拷贝数据的大小,该返回值其实是很有用的。
3、“INT64_C”: 找不到标识符。
毕竟标准相差太大,在libavutil\common.h中有~INT64_C,vs是无法识别它的,将一下代码加载common.h开头。
#ifndef INT64_C
#define INT64_C(c) (c ## LL)
#define UINT64_C(c) (c ## ULL)
#endif