2013-02-04 75 views
1

我想拉出一個AVFrame的矩形區域,並已啓動一個函數,將這樣做。我只對使用格式爲PIX_FMT_RGB24的AVFrame感興趣。我可能也會在這裏重新發明輪子,所以如果已經有一個功能可以做到這一點,請跳進去。到目前爲止,我的功能看起來是這樣的:從AVFrame複製一個矩形區域 - ffmpeg

AVFrame * getRGBsection(AVFrame *pFrameRGB, const int start_x, const int start_y, const int w, const int h) { 

AVFrame *pFrameSect; 
int numBytes; 
uint8_t *mb_buffer; 

pFrameSect = avcodec_alloc_frame(); 
numBytes = avpicture_get_size(PIX_FMT_RGB24, w, h); 
mb_buffer = (uint8_t *) av_malloc(numBytes * sizeof(uint8_t)); 
avpicture_fill((AVPicture *) pFrameSect, mb_buffer, PIX_FMT_RGB24, w, h); 

int curY, curX, i = 0; 
for (curY = start_y ; curY < (start_y + h); curY++) { 

    for (curX = start_x; curX < (start_x + w); curX++) { 

     int curIndex = curX * 3 + curY * pFrameRGB->linesize[0]; 

     pFrameSect->data[0][i] = pFrameRGB->data[0][curIndex]; 
     pFrameSect->data[0][i + 1] = pFrameRGB->data[0][curIndex + 1]; 
     pFrameSect->data[0][i + 2] = pFrameRGB->data[0][curIndex + 2]; 

     i += 3; 

    } 

} 

return pFrameSect; 

} 

的功能似乎當我在(0,0)開始工作(我認爲),但是當我在圖像中移動到別處它輸出類似於應該有什麼顏色但是不對。我想我在這裏很親密,任何人都可以提供指導?

+0

vf_crop過濾出於這樣的目的?你還想用自己的方法嗎? – rajneesh

回答

1
  • 有2個選項

    1. 用戶視頻濾波器(vf_crop)。 (filtering_video.c提供了實用的作物示例)
    2. 函數av_picture_crop()in imgconvert.c。此功能尚未完成,但您可以修改它以供您使用。
+0

那麼使用過濾器會很好,但它似乎從同一幀獲取多個區域會很複雜,或者我錯了嗎? – Marty

+0

查看docs/example/filtering_video.c中的示例,我不認爲它很困難。 – rajneesh

1

此代碼對我的作品(僅RGB24)中的ffmpeg提供

#include <libavutil/imgutils.h> 

// ..... 
// left, top 
const int crop_left = 500; 
const int crop_top = 500; 

// output width, height 
const int crop_width = 300; 
const int crop_height = 200; 

AVFrame * rgb24picure; 
AVFrame * output; 
/// .... initialize .... 

const int one_pixel = av_image_get_linesize(PIX_FMT_RGB24, 1, 0); 
const int src_line_size = av_image_get_linesize(PIX_FMT_RGB24, source_width, 0); 
const int copy_line_size = av_image_get_linesize(PIX_FMT_RGB24, crop_width, 0); 

for (int h = crop_top; h < crop_top + crop_height; ++h) 
{ 
    unsigned char * src = rgb24picure->data[0] + src_line_size * h + one_pixel * crop_left; 
    unsigned char * dst = output->data[0] + copy_line_size * (h - crop_top); 
    memcpy(dst, src, copy_line_size); 
} 
相關問題