我有一个 Objective-C 类(尽管我不相信这是任何特定于 Obj-C 的),我正在使用它从一系列 CGImage 将视频写入磁盘。(我在顶部用来获取像素数据的代码来自 Apple:http: //developer.apple.com/mac/library/qa/qa2007/qa1509.html)。我成功地创建了编解码器和上下文——一切都很好,直到它到达 avcodec_encode_video,当我得到 EXC_BAD_ACCESS 时。我认为这应该是一个简单的解决方法,但我就是不知道哪里出错了。
为了简洁起见,我进行了一些错误检查。'c' 是一个成功创建的 AVCodecContext*。
-(void)addFrame:(CGImageRef)img
{
CFDataRef bitmapData = CGDataProviderCopyData(CGImageGetDataProvider(img));
long dataLength = CFDataGetLength(bitmapData);
uint8_t* picture_buff = (uint8_t*)malloc(dataLength);
CFDataGetBytes(bitmapData, CFRangeMake(0, dataLength), picture_buff);
AVFrame *picture = avcodec_alloc_frame();
avpicture_fill((AVPicture*)picture, picture_buff, c->pix_fmt, c->width, c->height);
int outbuf_size = avpicture_get_size(c->pix_fmt, c->width, c->height);
uint8_t *outbuf = (uint8_t*)av_malloc(outbuf_size);
out_size = avcodec_encode_video(c, outbuf, outbuf_size, picture); // ERROR occurs here
printf("encoding frame %3d (size=%5d)\n", i, out_size);
fwrite(outbuf, 1, out_size, f);
CFRelease(bitmapData);
free(picture_buff);
free(outbuf);
av_free(picture);
i++;
}
我已经经历了几十次。这里有一些数字...
- 数据长度 = 408960
- 图片buff = 0x5c85000
- 图片->数据[0] = 0x5c85000——我认为这意味着 avpicture_fill 工作......
- outbuf_size = 408960
然后我在 avcodec_encode_video 得到 EXC_BAD_ACCESS。不确定它是否相关,但大部分代码来自 api-example.c。我正在使用 XCode,在 Snow Leopard 上为 armv6/armv7 编译。
非常感谢您的帮助!