gpt4 book ai didi

c++ - FFMPEG - 读取视频文件并转换为位图

转载 作者:行者123 更新时间:2023-12-03 12:51:20 30 4
gpt4 key购买 nike

我可以使用ffmpeg成功读取视频文件

现在我想在我的 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

请告知如何将帧转换为位图

谢谢

最佳答案

过去 3 天我一直在努力,并取得了如此成果

现在帧已成功从 BitBlt 转换为 dc,但它们是颠倒的

如果代码有问题,请告诉我

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);
}

关于c++ - FFMPEG - 读取视频文件并转换为位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15838924/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com