简单的GDI+ffmpeg视频播放

原创 2018年04月17日 14:41:14
简单的GDI+ffmpeg视频播放

这里直接贴代码

  
 
    CMainFramWnd* pMain = (CMainFramWnd*)p;
    const MediaParam *pmediaParam = pMain->getMediaParam();
    unsigned char *out_bufRgb;
    AVFrame *pFrame = NULL;
    AVFrame *pFrameYUV = NULL;
    HDC      hdcsrc;
    HDC      hdcdst;

    pFrame = av_frame_alloc();
    pFrameYUV = av_frame_alloc();

    const CControlWndUI *pWnd = pMain->GetPlayWnd();
    RECT rc;
    GetWindowRect(pWnd->GetHWND(), &rc);

    hdcdst = GetDC((HWND)pWnd->GetHWND());
    hdcsrc = CreateCompatibleDC(hdcdst);

    //申请用于存储RGB数据的buffer
    out_bufRgb = (unsigned char *)av_malloc(av_image_get_buffer_size(AV_PIX_FMT_BGR24
        , rc.right - rc.left
        , rc.bottom - rc.top
        , 1));

    //将out_bufRGB与pFrameYUV->data绑定pFrameYUV->data = out_bufRGB
    av_image_fill_arrays(pFrameYUV->data
        , pFrameYUV->linesize, out_bufRgb
        , AV_PIX_FMT_BGR24, rc.right - rc.left
        , rc.bottom - rc.top, 1);

    SwsContext* img_convert_ctx = sws_getContext(pmediaParam->pcodecCtx->width, pmediaParam->pcodecCtx->height
        , pmediaParam->pcodecCtx->pix_fmt, rc.right - rc.left, rc.bottom - rc.top
        , AV_PIX_FMT_BGR24, SWS_BICUBIC, NULL, NULL, NULL);

    PVOID pbit = NULL;
    BITMAP bmp = { 0 };
    HBITMAP hBitmap = NULL;
    BITMAPINFO bmpinfo = { 0 };
    bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmpinfo.bmiHeader.biWidth = rc.right - rc.left;
    bmpinfo.bmiHeader.biHeight = -rc.bottom + rc.top;
    bmpinfo.bmiHeader.biPlanes = 1;
    bmpinfo.bmiHeader.biBitCount = 24;
    bmpinfo.bmiHeader.biCompression = BI_RGB;

    int  errcode1 = 0;
    int  errcode2 = 0;
    while (true)
    {
        AVPacket* pkt = pMain->m_MediaParam.pvpq->GetPkt();
        errcode1 = avcodec_send_packet(pMain->m_MediaParam.pcodecCtx, pkt);
        if( errcode1 == 0)
        {
            errcode2 = avcodec_receive_frame(pMain->m_MediaParam.pcodecCtx, pFrame);
            if ( errcode2 == 0 )
            {
                sws_scale(img_convert_ctx, (const unsigned char* const*)pFrame->data, pFrame->linesize
                    , 0, pmediaParam->pcodecCtx->height,
                    pFrameYUV->data, pFrameYUV->linesize);

                hBitmap = CreateDIBSection(hdcsrc, &bmpinfo, DIB_RGB_COLORS, &pbit, NULL, 0);
                GetObject( hBitmap, sizeof(BITMAP), &bmp);
                memcpy(pbit, out_bufRgb, (rc.right - rc.left)*(rc.bottom-rc.top)*3 );
                SelectObject(hdcsrc, hBitmap);
                BitBlt(hdcdst, 0, 0, rc.right - rc.left, rc.bottom - rc.top, hdcsrc, 0, 0, SRCCOPY);
                DeleteObject(hBitmap);
            }
            else if( AVERROR_EOF == errcode2 )
            {
                break;
            }
        }
        else if (AVERROR_EOF == errcode1)
        {
            break;
        }
    }
效果:

链接地址:https://github.com/KaiWenK
少了一个commen文件夹,GITHUB超过100文件无法上传,都是一些ffmpeg的头文件和lib




Android视频播放 广告

  • 2015年12月28日 18:36
  • 31B
  • 下载

js简易的图片自动轮播

对于图片轮播,主要
  • u010793590
  • u010793590
  • 2014-06-06 14:00:19
  • 1127

怎么看VB.NET的视频

怎么看VB.NET的视频              也许你会说这很简单嘛,没必要写在博客里,但是,我当时开始学习VB.NET   时,的确不知道怎么打开着视频,不想UML一样,安全一下播放器,点击打开...
  • u013067756
  • u013067756
  • 2015-01-16 22:16:07
  • 1380

网页视频播放器flash+js,简单好用,外观多种多样

  • 2011年10月13日 13:20
  • 2.53MB
  • 下载

jsp,html中视频播放组件

  • 2012年12月27日 15:21
  • 6.25MB
  • 下载

最简单的VideoView视频播放器

本文介绍使用VideoView控件实现一个最简单的安卓视频播放器
  • ls1792304830
  • ls1792304830
  • 2016-09-22 18:31:58
  • 1098

Android_视频播放的简单使用方法

在页面中播放视频的步骤: 1.在页面布局中放置SurfaceView控件 2.让Activity实现SurfaceHolder.Callback. 3.获取SurfaceView控件的Surfa...
  • aabbcczlk
  • aabbcczlk
  • 2013-03-30 11:25:26
  • 425

HTML播放视频代码

  • 2012年06月13日 09:30
  • 8KB
  • 下载

【Android】如何用MediaPlayer实现一个简单的音视频播放器

我们在上一篇文章 如何实现一个简单的文件浏览器的基础上,使用MeidaPlayer实现对音视频文件的播放功能。 主要代码如下: Manifest文件 ...
  • loushuai
  • loushuai
  • 2016-04-04 15:37:25
  • 1298

一个简单的web视频播放器

  • 2010年06月28日 23:57
  • 423KB
  • 下载
收藏助手
不良信息举报
您举报文章:简单的GDI+ffmpeg视频播放
举报原因:
原因补充:

(最多只允许输入30个字)