2012-02-20 19 views
3

JPEG(サイズを縮小する)に変換するカメラから取得したRAW画像バッファ(メモリ内)があります。問題は、これらの画像を.pgm形式で保存すると、このサイズの巨大なファイルを保存する際のメモリの制限と待ち時間のために余裕がない膨大なファイルサイズになります(私が作業しているアプリケーションの制約) 。LIBAVCODECを使用してRAW RAW画像バッファをJPEGに変換する

LIBAVCODECを使用してイメージバッファを.jpg形式に圧縮/エンコードするにはどうすればよいですか?私の画像キャプチャコードはC言語です。

+0

をYUVへRGBを変換するswscale()を使用することができますか? – blahdiblah

答えて

6

このコードはYUV生画像で動作します。私は、RGB生画像をエンコードしようとするsegfaultを得ました。しかし、あなたは、あなたがイメージ固有の、あるいはJPEG特有の、ライブラリーの代わりにのLibav使用する必要がある理由があります

int main() 
{ 
    int ret; 
    AVFrame *frame; 
    AVPacket pkt; 

    av_register_all(); 

    AVCodec* codec = avcodec_find_encoder(AV_CODEC_ID_MJPEG); 
    if (!codec) 
    { 
     printf("Codec not found\n"); 
     exit(1); 
    } 

    AVCodecContext* c = avcodec_alloc_context3(codec); 
    if (!c) 
    { 
     printf("Could not allocate video codec context\n"); 
     exit(1); 
    } 

    c->bit_rate = 400000; 
    c->width = 320; 
    c->height = 200; 
    c->time_base= (AVRational){1,25}; 
    c->pix_fmt = AV_PIX_FMT_YUVJ420P; 

    if (avcodec_open2(c, codec, NULL) < 0) 
    { 
     printf("Could not open codec\n"); 
     exit(1); 
    } 

    frame = avcodec_alloc_frame(); 
    if (!frame) 
    { 
     printf("Could not allocate video frame\n"); 
     exit(1); 
    } 
    frame->format = c->pix_fmt; 
    frame->width = c->width; 
    frame->height = c->height; 

    ret = av_image_alloc(frame->data, frame->linesize, c->width, c->height, c->pix_fmt, 32); 
    if (ret < 0) 
    { 
     printf("Could not allocate raw picture buffer\n"); 
     exit(1); 
    } 

    av_init_packet(&pkt); 
    pkt.data = NULL; 
    pkt.size = 0; 

    /* prepare a dummy image */ 
    /* Y */ 
    for(int y=0;y<c->height;y++) { 
     for(int x=0;x<c->width;x++) { 
      frame->data[0][y * frame->linesize[0] + x] = x + y; 
     } 
    } 

    /* Cb and Cr */ 
    for(int y=0;y<c->height/2;y++) { 
     for(int x=0;x<c->width/2;x++) { 
      frame->data[1][y * frame->linesize[1] + x] = 128 + y; 
      frame->data[2][y * frame->linesize[2] + x] = 64 + x; 
     } 
    } 


    frame->pts = 1; 

    int got_output = 0; 
    ret = avcodec_encode_video2(c, &pkt, frame, &got_output); 
    if (ret < 0) 
    { 
     printf("Error encoding frame\n"); 
     exit(1); 
    } 

    if (got_output) 
    { 
     printf("got frame\n"); 
     FILE* f = fopen("x.jpg", "wb"); 
     fwrite(pkt.data, 1, pkt.size, f); 
     av_free_packet(&pkt); 
    } 

    avcodec_close(c); 
    av_free(c); 
    av_freep(&frame->data[0]); 
    avcodec_free_frame(&frame); 
    printf("\n"); 

    return 0; 
} 
関連する問題