2016-10-25 56 views
0

我使用ffmpeg在C++中提取視頻幀。我想在C++中獲得框架的array<unsigned char>,但是我從此行代碼中獲得AVFrame將AVPicture轉換爲數組<unsigned char>

avcodec_decode_video2(codecContext, DecodedFrame, &gotPicture, Packet); 

所以我用sws_scale轉換AVFrameAVPicture而且我不能接到框架array<unsigned char>

sws_scale(convertContext, DecodedFrame->data, DecodedFrame->linesize, 0, (codecContext)->height, convertedFrame->data, convertedFrame->linesize); 

因此,誰能幫我AVFrameAVPicturearray<unsigned char>轉換?

+0

解碼的幀通常是YUV,並且圖像以平面形式存儲在AVFrame.data [0-2]中。對於使用swscale後的RGB轉換,這將會有所不同,但仍然是AVFrame.data []中的像素數據。 AVFrame.linesize []通常與寬度不同,所以請記住。 – WLGfx

回答

1

AVPicture已棄用。轉換成它是沒有意義的,因爲AVFrame是它的替代品。

如果我正確地理解了這個問題,您試圖將原始圖片像素值設置爲std::array。如果是這樣,只需將data字段的AVFrame轉儲到其中即可。

avcodec_decode_video2(codecContext, DecodedFrame, &gotPicture, Packet); 

// If you need rgb, create a swscontext to convert from video pixel format 
sws_ctx = sws_getContext(DecodedFrame->width, DecodedFrame->height, codecContext->pix_fmt, DecodedFrame->width, DecodedFrame->height, AV_PIX_FMT_RGB24, 0, 0, 0, 0); 

uint8_t* rgb_data[4]; int rgb_linesize[4]; 
av_image_alloc(rgb_data, rgb_linesize, DecodedFrame->width, DecodedFrame->height, AV_PIX_FMT_RGB24, 32); 
sws_scale(sws_ctx, DecodedFrame->data, DecodedFrame->linesize, 0, DecodedFrame->height, rgb_data, rgb_linesize); 

// RGB24 is a packed format. It means there is only one plane and all data in it. 
size_t rgb_size = DecodedFrame->width * DecodedFrame->height * 3; 
std::array<uint8_t, rgb_size> rgb_arr; 
std::copy_n(rgb_data[0], rgb_size, rgb_arr); 
+0

非類型模板參數必須是constexpr。檢查問題標籤,它不是std數組。 –

相關問題