我的HEVC码流分析工具MFC小笔记:树形控件使用及窗口缩放

大约1个半月前,发布了自己写的HEVC码流分析工具。当时的版本显示语法元素使用是的Edit控件。很多主流分析工具都使用树形控件,看上去觉得比较高端,于是在纠结一天后下定决心自己也实现树形的HEVC语法显示。经历漫长的业余时间,终于完成了,于是便有了此文。

树形控件可展开、折叠内容,无论是显示还是外观,都比较一般的编辑框好,所以最终还是选择树形控件。刚开始了解时,网上完整的资料不多,还以为很复杂,搞完后,其实并不复杂。更多的是工作量,因为要将所有的语法元素一一修改。

在VS中拖一个Tree Control到界面上,其属性可以在资源视图中设置,也可以在代码中设置。在资源视图中,设置“Has Bottons”、“Has Lines”、“Lines At Root”的值为True即可。

下面是一个小示例:

#define AddTreeItem(item, buffer) m_cTree.InsertItem(buffer,item)


    HTREEITEM hItem = m_cTree.InsertItem("根节点NAL",TVI_ROOT);///root
    CString strTemp;
    strTemp.Format("NAL头节点nal_unit_header");
    HTREEITEM hSubItem = AddTreeItem(hItem, strTemp.GetBuffer());

    strTemp.Format("forbidden_zero_bit \t\t:0 (1 bit)");
    AddTreeItem(hSubItem, strTemp.GetBuffer());
    strTemp.Format("nal_unit_type \t\t:32 (6 bit)");
    AddTreeItem(hSubItem, strTemp.GetBuffer());
    strTemp.Format("nal_ref_idc \t\t:0 (6 bit)");
    AddTreeItem(hSubItem, strTemp.GetBuffer());
    strTemp.Format("nuh_temporal_id_plus1 \t\t:0 (3 bit)");
    AddTreeItem(hSubItem, strTemp.GetBuffer());

    strTemp.Format("VPS节点video_parameter_set_rbsp()");
    HTREEITEM hItem1 = AddTreeItem(hItem, strTemp.GetBuffer());

    strTemp.Format("header()");
    HTREEITEM hItem2 = AddTreeItem(hItem1, strTemp.GetBuffer());
    strTemp.Format("fist slice)");
    AddTreeItem(hItem2, strTemp.GetBuffer());
    strTemp.Format("no output");
    AddTreeItem(hItem2, strTemp.GetBuffer());

    strTemp.Format("data()");
    AddTreeItem(hItem1, strTemp.GetBuffer());
代码很简单,主要调用InsertItem函数,该函数有很多个重载函数,这里用的是两个参数,第一个要显示的字符串,第二个是要在哪个节点上插入,根节点的值为TVI_ROOT。

下面是上述代码在不同的外观风格的图示:

可见,下图具有明显优势。

在文章《我的YUV播放器MFC小笔记:设置picture控件背景为黑色、窗口缩放》中简单记录了如何实现窗口缩放。这个工具有一点不同,就是使用缩放比例对各控件进行缩放。

首先在对话框初始化中获取主窗口坐标:

// 主窗口大小
    GetClientRect(&m_rectMainWnd);

在窗口缩放的响应函数OnSize中通过中cx和主窗口的Width计算X轴比例,cy和Height计算Y轴比例:

    float fXRatio = (float)cx / (float)(m_rectMainWnd.Width());
    float fYRatio = (float)cy / (float)(m_rectMainWnd.Height());

在实际测试发现,只有用GetClientRect获致的坐标、宽高,才能与OnSize函数的参数cx、cy对应起来。另外使用GetWindowRect和ScreenToClient用于确定控件的坐标和大小。真正调整位置的函数为MoveWindow。下面以工具左上角的列表框控件为例给出示例代码:

    // 获取列表框坐标
    CRect rectList;
    GetDlgItem(IDC_H264_NALLIST)->GetWindowRect(&rectList);
    ScreenToClient(rectList);
    
    // 计算比例
    float fXRatio = (float)cx / (float)(m_rectMainWnd.Width());
    float fYRatio = (float)cy / (float)(m_rectMainWnd.Height());
    
    int nNewWidth = 0;
    int nNewHeight = 0;

    // 重新移动列表框
    pWnd = GetDlgItem(IDC_H264_NALLIST);
    nNewWidth = (int)(fXRatio * (float)rectList.Width());
    nNewHeight = (int)(fYRatio * (float)rectList.Height());
    pWnd->MoveWindow(rectList.left, rectList.top, nNewWidth, nNewHeight);
    pWnd->Invalidate();
    pWnd->UpdateData();
    // 更新,以便下面的控件可参考
    pWnd->GetWindowRect(&rectList);
    ScreenToClient(rectList);


具体的代码,可以参考代码仓库: https://github.com/latelee/H264BSAnalyzer


李迟 2015.11.18 晚

### 回答1: HEVC码流播放工具是一种可以播放高效视频编码(HEVC)裸码流的软件工具HEVC是一种最新的视频压缩标准,它可以比以前的标准更有效地压缩视频,从而使视频内容更高质量的同时节省存储空间和带宽。 裸码流是指只含音频和视频数据的原始文件,没有任何包装格式或容器格式。HEVC码流播放工具可以直接解码这些裸码流并播放出来,同时提供多种调节画质和音频效果的功能。这种工具可以很好地支持HEVC编码的高清视频,特别是4K、8K等超高清分辨率的视频播放。 HEVC码流播放工具的主要适用场景是当用户需要查看纯粹的HEVC视频原始数据时,如便携式存储录像机或者IP摄像机等设备存储的HEVC码流文件,或者用于学习HEVC编码技术等应用方面。同时,也提供了一种有效的测试工具,用于测试HEVC编码的效果、带宽占用以及视频质量等方面的性能。 ### 回答2: HEVC码流播放工具是一种用于播放HEVC(或H.265)视频编码格式的工具HEVC是一种视频压缩标准,旨在提供高质量视频的同时,减少使用的带宽和磁盘空间。但是,由于HEVC视频编码格式相对较新,因此它需要使用专门的软件来播放。 HEVC码流播放工具是一种为HEVC视频编码格式而设计的视频播放器,它可以播放HEVC编码格式的各种媒体文件,例如电影、电视节目、录像文件等。与其他视频播放器不同,HEVC码流播放工具直接将视频编码数据传输到计算机系统,而无需进行解码或解压缩。这可以帮助提高视频的播放质量和稳定性。 HEVC码流播放工具使用也相对简单,用户只需要从计算机硬盘或其他储存设备选择一个HEVC编码的文件,并在播放器加载该文件,即可开始观看视频。由于技术原因,HEVC视频的解码需要更高的处理能力和更好的显卡,因此在使用播放器时,需要确保计算机的GPU和CPU资源足够强大,以此确保视频的流畅播放。 综上所述,HEVC码流播放工具是一种专门用于播放HEVC视频编码格式的工具,它可以提供更高质量和更稳定的播放体验,但需要计算机设备足够强大才能获得最佳效果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值