2014-04-21 100 views
0

我與MPEG-4,H264工作流如何從AVFrame獲取亮度圖片?

首先我tryed轉換爲RGB24和使用imagemagic使灰度,它亙古不變的工作

while(av_read_frame(pFormatCtx, &packet)>=0) 
    { 
     // Is this a packet from the video stream? 
     if(packet.stream_index==videoStream) 
     { 
      // Decode video frame 
      avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, 
            &packet); 

      // Did we get a video frame? 
      if(frameFinished) 
      { 
       f++; 
       //this->fram->Clear(); 
       // if (pFrame->pict_type == AV_PICTURE_TYPE_I) wxMessageBox("I cadr"); 
       // if (pFrame->pict_type != AV_PICTURE_TYPE_I) 
       // printMVMatrix(f, pFrame, pCodecCtx); 
       pFrameRGB->linesize[0]= pCodecCtx->width*3; // in case of rgb4 one plane 

       sws_scale(swsContext, pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize); 


       Magick::Blob* m_blob = new Magick::Blob(pFrameRGB->data,pCodecCtx->width*pCodecCtx->height*3); 
       Magick::Image* image =new Magick::Image(*m_blob); // this doesnotwork 

       image->quantizeColorSpace(Magick::GRAYColorspace); 
       image->quantizeColors(256); 
       image->quantize(); 

但是ffmpeg的給我YUV圖片?所以只需要Y組件,如何得到它?得到Ypicture [x] [y]

回答

4

我假設你已經配置swscale到YUV420p色彩空間。 420P意味着4:2:0平面。平面意味着顏色通道是分開的。將亮度數據(Y)存儲在pFrame-> data [0]的緩衝點(Cb和Cr分別在pFrame-> data [1]和pFrame-> data [2]中)。在YUV420中,Y平面是每個像素1個字節。

因此:

uint8_t getY(int x, int y, AVFrame *f) 
{ 
    return f->data[0][(y*f->linesize)+x]; 
} 
+0

謝謝!在什麼顏色空間下ffmpeg avcodec_decode_video2默認打包未編碼的視頻幀? – user3177342

+1

無論視頻編碼的顏色空間是多少,並且可以從編解碼器到編解碼器/文件到文件有所不同。由於歷史原因,大多數編解碼器使用YUV420或YUV422。但我相信未來會有更多的人開始使用YUV444。您隨時可以查看AVCodecCtx.pix_fmt以瞭解您所得到的結果。 – szatmary

+0

此外,如果這有助於您請upvote並添加接受答案。 – szatmary