MFC 搭建多视频播放界面模板(专栏篇)

1、背景

因最近须做一个大华、海康摄像机的播放工具,使用MFC开发了一个客户端程序,自适应窗体大小的视频播放多界面程序,后续会一步步的说明实现的方法,以及给出对应每章节的代码链接。如果是需要用到IPC播放界面模块的可以参考一下,只是单纯的分享+记录,对于一些高手来说就没必要参考啦。。。

后续会陆续加入大华SDK播放、海康SDK播放、Onvif搜索、RTSP/RTP码流、FFmpeg解码、SDL播放,搭建一个完整的视频播放器模块,凡是总要一步一步来

2、编译环境

  • 1、VS2010 编译器 (X64)
  • 2、VC++(MFC)语言
  • 3、基于对话框开发

3、目录

4、最终效果图

程序最终呈现的界面就是如此,可切换单、二、四窗口
在这里插入图片描述

视频播放时的四画面效果:

在这里插入图片描述

视频播放时的 二画面 效果:
在这里插入图片描述

视频播放时的单画面和全屏时的效果:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC作为微软的图形用户界面应用程序开发框架,可以用来实现RTSP视频播放。我们可以使用Windows Media Player控件(Window Media Player Control)来实现播放过程。 首先需要在MFC应用程序的资源文件中添加Windows Media Player控件,并在代码中引用该控件: ``` #include "afxwin.h" #include <msdxm.tlh> #include <msdxm.tli> CWnd* pWnd = GetDlgItem(IDC_WMP_CONTROL); CComPtr<IWMPPlayer> pPlayer = NULL; pPlayer.CoCreateInstance(__uuidof(WindowsMediaPlayer), NULL, CLSCTX_INPROC_SERVER); pPlayer->put_enableContextMenu(VARIANT_FALSE); pPlayer->put_uiMode(L"none"); pPlayer->put_fullScreen(VARIANT_FALSE); pPlayer->put_windowlessVideo(VARIANT_TRUE); pPlayer->SetClientSite(pWnd->GetOleWindow()); pPlayer->put_URL(file_path); pPlayer->controls.play(); ``` 其中,`IDC_WMP_CONTROL`为Windows Media Player控件ID,在资源文件中设置;`IWMPPlayer`定义了Windows Media Player接口,必须引用`msdxm.tlh`和`msdxm.tli`头文件。 接下来,我们需要将RTSP视频的地址传递给Windows Media Player控件并开始播放。可以使用FFmpeg的libavcodec库来解码网络摄像头的视频,然后将解码后的数据传递给Windows Media Player控件进行播放: ``` av_register_all(); AVFormatContext *pFormatCtx = avformat_alloc_context(); int ret = avformat_open_input(&pFormatCtx, rtsp_url, nullptr, nullptr); if (ret < 0) { printf("can not open input url\n"); return -1; } ret = avformat_find_stream_info(pFormatCtx, nullptr); if (ret < 0) { printf("can not find stream info\n"); return -1; } AVCodecParameters *pCodecPara = nullptr; int videoIndex = -1; for (int i = 0; i < pFormatCtx->nb_streams; i++) { if (pFormatCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { videoIndex = i; pCodecPara = pFormatCtx->streams[i]->codecpar; break; } } if (videoIndex == -1 || pCodecPara == nullptr) { printf("can not find video stream\n"); return -1; } AVCodec *pCodec = avcodec_find_decoder(pCodecPara->codec_id); if (pCodec == nullptr) { printf("can not find codec\n"); return -1; } AVCodecContext *pCodecCtx = avcodec_alloc_context3(pCodec); if (pCodecCtx == nullptr) { printf("avcodec_alloc_context3 allocate failed\n"); return -1; } ret = avcodec_parameters_to_context(pCodecCtx, pCodecPara); ret = avcodec_open2(pCodecCtx, pCodec, nullptr); if (ret < 0) { printf("can not open codec\n"); return -1; } AVPacket *packet = av_packet_alloc(); if (packet == nullptr) { printf("can not allocate packet\n"); return -1; } AVFrame *frame = av_frame_alloc(); if(frame == nullptr){ printf("can not allocate frame\n"); return -1; } while (av_read_frame(pFormatCtx, packet) >= 0) { if (packet->stream_index == videoIndex) { ret = avcodec_send_packet(pCodecCtx, packet); if (ret == 0) { ret = avcodec_receive_frame(pCodecCtx, frame); while (ret == 0) { CComSafeArray<BYTE> p(frame->data[0], frame->linesize[0] * frame->height); HRESULT hr = pPlayer->put_CurrentMedia(new CComObject<CMediaItem>(&p, pCodecCtx->width, pCodecCtx->height)); av_frame_unref(frame); ret = avcodec_receive_frame(pCodecCtx, frame); } } } av_packet_unref(packet); } ``` 以上的代码片段演示了如何使用FFmpeg的libavcodec库解码RTSP视频,并将解码后的数据传递给Windows Media Player控件进行播放。当有新的帧可供播放时,我们将使用它的宽度,高度和基地址创建一个新的`CMediaItem`对象。然后,我们可以将`CMediaItem`对象传递给`put_CurrentMedia`方法来将其与Windows Media Player控件关联起来并开始播放。在这里,我们使用了CComSafeArray类来处理解码后的视频帧。 总之,这是一个简单的办法来使用MFC播放RTSP视频。该代码只是一个示例,并且可能需要根据具体情况进行修改才能适应实际需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值