ffmepg熟悉api过程中遇到的问题

ffmepg熟悉api过程中遇到的问题  

2012-04-12 09:38:24|  分类: video |  标签:ffmpeg   |字号 订阅

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值