投影融合软件 总结系列 视频篇

本文讨论了在公开场合使用的投影融合软件的稳定性要求,强调了D3D11作为Windows系统的首选绘制API。同时介绍了如何理解和定制自己的播放器,包括实现音视频同步、纯硬件解码(HAP格式)和解决大容量视频的IO问题。作者提倡通过实践和深入理解FFPlay来开发播放器。
摘要由CSDN通过智能技术生成

写在前面:

投影融合软件 几乎大部分时间都是运行在公开场合,主机一般都携带的多显示设备,所以对软件的稳定性提出较高的要求。如果融合软件是运行在window系统,一定要选择d3d11做绘制地层api,不要使用OpenGL,,因为 OpenGL的兼容性问题 而用户的主机主机不是你决定的,比如会遇到集成显卡下显示色差严重,hdr显示不正常,显示器缩放等等问题。

如何理解并定制自己的播放器视频播放器:

现在网上播放器播放器的技术介绍很多,推荐硬啃ffplay。

可以先从简化版开始ffmpeg/ffplay vc6 源码剖析 - mcodec - 博客园 (cnblogs.com)

多动手 多读 直到能写一个简单的播放器为止。

对融合播放器的定制一般注意:

1:集群播放功能:

对于超大型投影项目,播放器必须具备主机集群播放的功能,这必须要求开发者对播放器有个通透的理解。特别是音视频轨道同步的问题,PTS和DTS时间戳以及控制流程有个通透的理解。 这部分极强容易出错。

其实同步也特别简单:采用视频轨同步到音频轨的方法,在视频轨上进行多主机同步:

伪代码:

int RenderingProcess(int *delay){
    ......
    ......
    //多主机同步处理
     if(!ifEof){
        if(currFrameId==preFrameId){
            currFrameId++;
            TellServerIReady();
        }
     }
     if ( CanTakeAction()==true){
             preFrameId=currFrameId;

     }else{
        return 正在等待标识 并且不更新纹理
     }
      //音视频同步处理:间隔处理 或 帧丢弃
      (*delay) =time_synchronize_fix()
     ......
     ......
}

2:纯硬件(不经内存)功能:

 纯硬件解码(显卡到显卡,如果还经内存8k 的视频不用做了)是融合软件必不可以少的,而这部分比较难 网上很少能找到线 但从av_hwframe_transfer_data()的源码能找到答案:libavutil/hwcontext_d3d11va.c 仔细分析后 我重写这个函数:最重要的伪代码如下:

ID3D11Texture2D *createTmpTexture(int w, int h, DXGI_FORMAT form,ID3D11Device* dev){
    ID3D11Texture2D *tmp_tex = NULL;
    D3D11_TEXTURE2D_DESC desc;
    ZeroMemory(&desc, sizeof(desc));
    desc.Width = w;
    desc.Height = h;
    desc.MipLevels = 1;
    desc.ArraySize = 1;
    desc.Format = form;//DXGI_FORMAT_NV12;
    desc.SampleDesc.Count = 1;
    desc.SampleDesc.Quality = 0;
    desc.MiscFlags = 0;
    desc.Usage = D3D11_USAGE_DEFAULT;
    desc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
    desc.CPUAccessFlags = 0;
    dev->CreateTexture2D(&desc, NULL, &tmp_tex);
    
}

handleInDecThread(){
    int ret = avcodec_send_packet(video_ctx, packet);
    if (ret < 0) {
        if (ret == AVERROR(EAGAIN)) {
        }

    }else {
        while (1) {
            AVFrame* frame1 = av_frame_alloc();
            frame1->opaque = NULL;
            ret = avcodec_receive_frame(video_ctx, frame1);
            if (ret<0){

            }else{
                if (ret == AVERROR(EAGAIN) ) {  
                 }else if(ret == AVERROR_EOF){}

            }else{
                AVHWFramesContext* ctx = (AVHWFramesContext*)(frame1->hw_frames_ctx->data);
                AVD3D11VADeviceContext* device_hwctx = (AVD3D11VADeviceContext*)ctx->device_ctx->hwctx;
                D3D11VAFramesContext* s = (D3D11VAFramesContext*)ctx->internal->priv;
                //这里就是需要
                if (tmp_tex==NULL){
                        tmp_tex=createTmpTexture(frame1->width, frame1->height, s->format,  device_hwctx->device)
                }
                device_hwctx->lock(device_hwctx->lock_ctx);
                ID3D11Resource* texture = (ID3D11Resource*)(ID3D11Texture2D*)frame1->data[0];
                int ind = (intptr_t)frame1->data[1];
                D3D11_BOX sourceRegion;
                sourceRegion.left = 0;
                sourceRegion.right = frame1->width;
                sourceRegion.top = 0;
                sourceRegion.bottom = frame1->height;
                sourceRegion.front = 0;
                sourceRegion.back = 1;
                device_hwctx->device_context->CopySubresourceRegion(tmp_tex, 0, 0, 0, 0, texture, ind, &sourceRegion);
                device_hwctx->device_context->Flush();
                device_hwctx->unlock(device_hwctx->lock_ctx);
            }
        }
    }
  av_packet_unref(packet);
  av_packet_free(&packet);
}

 

3 hap格式 极致高清

hap格式,很多时候如果真要求极致高清的话 往往需要这种格式的视频支持。官网地址如下:HAP Codecs

这个格式其实非常简单,产出是rgba格式 由于几乎没有压缩,导致这种格式的视频非常非常大(7680*2160,3分钟视频,大小320G ),在渲染这种格式的 ,io性能成为了瓶颈,解决办法也很简单,用多线程读取就轻易解决了。

总结:

播放器开发工作其实不难,重要的是能对ffplay有通透的理解。多尝试 ,拆分 ,整合 是理解的不错方法,我就是这样做的。

下面是运行8k 60帧频视频 效果图:

科领投影融合软件,传统情况,我们一个投影仪投射出来的画面是有限的,并且画面是常规的矩形,通过此软件,可以将多个投影仪的画面无缝拼接为一个整体,并且可以对每一个投影仪的光度进行光线补偿,防止投影仪因灯泡衰老而造成颜色不均匀。 科领投影融合软件功能 科领融合参数 ●最多16通道。 ●拥有中英文双语版本,默认中文,全球唯一,可以自行切换 ●支持桌面融合视频融合。 ●内置播放器,播放器可接收其他中控命令(UDP协议), 支持单屏 ,扩展屏或跨屏三个模式 ●拥有安装向导,让安装变得简单,简单三部曲,搞定安装 ●最多支持16通道,且向下兼容,并且可以自定义融合边, 可实现一字型、田字形等融合画面自由组合 ●支持windows7及最新windows8,windows10系统(不支持XP),32位,64位皆可运行 ●支持几何校正,适用于弧幕、360°环幕、异型幕、折幕等 ●支持针对每个信号进行融合,比如可以融主屏信号,融扩展屏信号 ●第一次配置好后,开机自动启动融合拼接 ●如果用ATI显卡卡,12通道以内无需购买多屏宝,直接购买ATI多屏显卡。NVIDIA显卡需要购买多屏宝 ●简单友好的操作界面,支持鼠标和快捷键快速校正,并提供简单模式和复杂模式,也可以通过VNC远程调试。 ●超绚的安装向导,跟随向导即可实现傻瓜安装 ●支持调投影仪的偏色 ●支持投影画面的遮罩 ●打击盗版,本产品为最新的v1.99R版,比国内其他版本要新,所以支持win10 ●支持加密狗时间锁,可以自行设置到期时间和解除到期时间,全球唯一开发接口,每个厂商可以自行设定解锁密码 科领投影融合软件截图
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值