2013-04-05 65 views
0

我可以使用的ffmpegFFMPEG - 讀取視頻文件,並轉換爲位圖

成功讀取視頻文件,現在我想告訴我的MFC MDI這些視頻幀。

對於我需要一個位圖來養活我的CBitmap :: FromHandle()函數

memDC.CreateCompatibleDC(dc); 

CBitmap * bmp = CBitmap::FromHandle(); 

CBitmap * oldBmp = memDC.SelectObject(bmp); 

dc->BitBlt(0,0,320,240,&memDC,0,0,SRCCOPY); 

對於ffmpeg的我使用dranger教程01

http://dranger.com/ffmpeg/tutorial01.html

請告知如何轉換幀到位圖

謝謝

+0

如果您使用較新的源代碼,請參閱本教程的[更新的源代碼](https://github.com/chelyaev/ffmpeg-tutorial)版本。 – LordNeckbeard 2013-04-05 17:53:45

+0

我更新了代碼並刪除了所有棄用的功能。感謝您的詢問 – user1573610 2013-04-05 18:29:47

回答

0

我一直在它的最後3天,得到了這麼遠

現在幀被使用BitBlt到直流成功,但他們是倒掛

請讓我知道,如果有什麼錯誤的代碼

avpicture_fill((AVPicture *)pFrameRGB, buffer, PIX_FMT_RGB24, 
       pCodecCtx->width, pCodecCtx->height); 


int w = pCodecCtx->width; 
int h = pCodecCtx->height; 
img_convert_ctx = sws_getContext(w, h, pCodecCtx->pix_fmt, 
           w, h, PIX_FMT_RGB24, 
           SWS_BICUBIC, NULL, NULL, NULL); 

/*CClientDC dc;*/ 
BITMAPINFO bmi = {0}; 
bmi.bmiHeader.biBitCount = 24; 
bmi.bmiHeader.biCompression = BI_RGB; 
bmi.bmiHeader.biHeight = -pCodecCtx->height; 
bmi.bmiHeader.biWidth = pCodecCtx->width; 
bmi.bmiHeader.biPlanes = 1; 
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
bmi.bmiHeader.biSizeImage = pCodecCtx->height * pCodecCtx->width * 3; 
hbmp = CreateDIBSection(hdcmem, &bmi, DIB_RGB_COLORS, &pbmpdata , NULL, 0); //&pbmpdata 

hdcscr = GetDC(0); 
hdcmem = CreateCompatibleDC(hdcscr); 


i=0; 
while((av_read_frame(pFormatCtx, &packet)>=0)) { 
    // Is this a packet from the video stream? 
    if(packet.stream_index==videoStreamIdx) { 

     /// Decode video frame 
     //avcodec_decode_video(pCodecCtx, pFrame, &frameFinished,packet.data, packet.size); 
     avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &packet); 

     // Did we get a video frame? 
     if(frameFinished) { 
      i++; 
      sws_scale(img_convert_ctx, pFrame->data, 
         pFrame->linesize, 0, pCodecCtx->height, 
         pFrameRGB->data, pFrameRGB->linesize); 


      pFrameRGB->data[0] = (uint8_t*)pbmpdata; 
      pFrameRGB->linesize[0] = pCodecCtx->width * 3; 

      SelectObject(hdcmem, hbmp);//hbmp 


      BitBlt(hdcscr, 0, 0, pCodecCtx->width, pCodecCtx->height, hdcmem , 0, 0, SRCCOPY); 
      Sleep(10); 
     } 
    } 

    // Free the packet that was allocated by av_read_frame 
    av_free_packet(&packet); 
} 
+0

只需將bmi.bmiHeader.biHeight更改爲-pCodecCtx->高度即可正常工作 – user1573610 2013-04-10 16:53:42