一連のCGImageからビデオをディスクに書き出すために使用しているObjective-Cクラスがあります(これはObj-C固有のものではないと思いますが)。(ピクセルデータを取得するために上部で使用しているコードは、Apple から取得したものです: http://developer.apple.com/mac/library/qa/qa2007/qa1509.html )。コーデックとコンテキストを正常に作成しました。EXC_BAD_ACCESS を取得すると、avcodec_encode_video に到達するまで、すべてがうまくいきます。これは簡単な修正だと思いますが、どこが間違っているのかわかりません。
簡潔さのためにいくつかのエラーチェックを行いました。「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
- picture_buff = 0x5c85000
- picture->data[0] = 0x5c85000 -- avpicture_fill が機能したことを意味します...
- outbuf_size = 408960
そして、avcodec_encode_video で EXC_BAD_ACCESS を取得します。関連性があるかどうかはわかりませんが、このコードのほとんどは api-example.c からのものです。XCode を使用して、Snow Leopard で armv6/armv7 用にコンパイルしています。
助けてくれてありがとう!