ffmpeg 硬件解码零拷贝unity 播放

news/2024/7/10 21:09:30 标签: ffmpeg, unity, 游戏引擎

ffmpeg_0">ffmpeg硬件解码问题

ffmpeg 在硬件解码,一般来说,我们解码使用cuda方式,当然,最好的方式是不要确定一定是cuda,客户的显卡不一定有cuda,windows 下,和linux 下要做一些适配工作,最麻烦的不是这个,二是ffmpeg解码后,颜色空间的转换,如果使用cuda,那么可以使用cuda去在gpu中直接转码,如果没有cuda,那么我们希望的是不要转颜色空间。

ffmpeg 硬件解码相信下面这一段代码是大家比较熟悉的

if (frame->format == hw_pix_fmt) {
	/* retrieve data from GPU to CPU */
	sw_frame->format = sourcepf; // AV_PIX_FMT_NV12;
	//if ((ret = av_hwframe_transfer_data(sw_frame, frame, 0)) < 0) {
	if ((ret = av_hwframe_map(sw_frame, frame, 0)) < 0) {
	fprintf(stderr, "Error transferring the data to system memory\n");
		av_frame_free(&frame);
		av_frame_free(&sw_frame);
		return -1;
	}
	tmp_frame = sw_frame;
}
else
{
	tmp_frame = frame;
}

如下我们在解码的时候,gpu 一个tesla p40 都占用了42%,实际上是unity渲染占用
在这里插入图片描述
打开tesla p40 的decode,实际上并不多,间歇会有一个峰值,后来稳定在7% 左右,p40的显存不小,但是解码其实不如3080这种gpu。
在这里插入图片描述

回过头来说ffmpeg 函数,av_hwframe_map 函数直接把gpu显存中的数据映射到内存,并且颜色转换从cuda到nv12,实际上cuda中的颜色就是nv12,只是把数据下载到了内存,这个过程是避免不了的,如果我们希望三维软件或者opencv 直接识别这个内存数据,显然是最好是rgb24,或者bgr24 这种颜色空间,那么问题就是
我们熟悉的swscale 函数颜色转换还是比较消耗cpu,那么我们应该怎么做才是最合适的方法

2 最合适的方法

应该是 ffmpeg transfer到内存后,不转换,直接使用三维软件使用shader来转变颜色空间,当然这肯定又是一次内存到显存的上载,但这个也是避免不了的。

2.1 拷贝
使用用户空间自己的内存直接给ffmpeg 的av_hwframe_map 函数 ,让ffmpeg下载时到用户空间指定的内存地址。

2.2 显示
使用shader 显示nv12

Shader"draw/s1"
{
    Properties 
	{
		_MainTex ("Y", 2D) = "white" {}
		_MainTexUV ("UV", 2D) = "white" {}
	}
    SubShader
    {
     Lighting Off
     Pass{
        CGPROGRAM

        sampler2D _MainTex;
        sampler2D _MainTexUV;

#pragma vertex vert

#pragma fragment frag
        struct appdata
        {
            float4 vertex : POSITION;
            float2 uv : TEXCOORD0;
        };
        struct v2f
        {
            float2 uv : TEXCOORD0;
            float4 vertex : SV_POSITION;
        };
        //float4 vert(float4 v : POSITION) : SV_Position
        //{
        //    return UnityObjectToClipPos(v);
        //}
        v2f vert(appdata v)
        {
            v2f o;
            o.vertex = UnityObjectToClipPos(v.vertex);
            o.uv = v.uv;
            return o;
        }

    //    fixed4 frag(v2f i):SV_Target
    //    {
    1 - i.uv.y 左右镜像
    //        fixed2 uv = fixed2(i.uv.x, 1 - i.uv.y);
    //        fixed4 ycol = tex2D(_MainTex, uv);
    //        fixed4 uvcol = tex2D(_MainTexUV, uv);
    //        float y = ycol.r;
    //        float v = uvcol.r - 0.5;
    //        float u = uvcol.g - 0.5;
    //        float r = y + 1.370705 * v;
    //        float g = y - 0.337633 * u - 0.698001 * v;
    //        float b = y + 1.732446 * u;
    //        return fixed4(r,g,b, 1.0);
    //    }
        fixed4 frag(v2f i) : SV_Target
        {
            fixed4 col;
            float y = tex2D(_MainTex, i.uv).a;
            fixed4 uvs = tex2D(_MainTexUV, i.uv);
            float u = uvs.r - 0.5;
            float v = uvs.g - 0.5;
            float r = y + 1.403 * v;
            float g = y - 0.344 * u - 0.714 * v;
            float b = y + 1.770 * u;
            col.rgba = float4(r, g, b, 1.0f);
            return col;
        }
        ENDCG
        }
    }
    FallBack "VertexLit"
}

这已经是目前最快的方法了

其他问题

其他就是怎么直接把显存给pytorch 了,这个也是比较重要的,下次再说吧


http://www.niftyadmin.cn/n/5279854.html

相关文章

Spring MVC 方法中添加参数、HttpServletRequest 和 HttpServletResponse 对象

在这个例子中&#xff0c;我们添加了 HttpServletRequest 和 HttpServletResponse 对象作为控制器方法的参数。这样&#xff0c;你就可以在方法内部同时访问请求参数、请求对象和响应对象&#xff0c;从而进行更灵活的 HTTP 请求和响应处理。 RestController public class MyC…

【Java图解算法】739.每日温度

单调栈 引言 生活中什么东西大的时候会变小&#xff0c;小的时候变大呢&#x1f436;&#xff1f; 答&#xff1a;当然是单调栈 739.每日温度 题目链接&#xff1a; https://leetcode.cn/problems/daily-temperatures/ 给定一个整数数组 temperatures &#xff0c;表示每…

【Linux笔记】文件和目录操作

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Linux学习 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 命令 ls (List): pwd (Print Working Directory): cp (Copy): mv (Move): rm (Remove): 结语 我的其他博客 前言 学习Linux命令…

前端FLV视频直播解决方案

项目背景&#xff1a; 1. 后台给出一个地址&#xff0c;持续不断的推送flv视频流。 2.前端需要接收视频流&#xff0c;并寻找合适的播放插件。 一开始&#xff1a; 其实用的是xgplayer&#xff08;西瓜视频&#xff09;。 官网地址&#xff1a;西瓜播放器 使用的是直播&a…

网安面试三十道题(持续更新)(sql注入系列)

61 给你一个网站&#xff0c;一般怎么做渗透测试的 先确定黑盒测试还是白盒测试 黑盒测试 信息收集&#xff1a; 服务器相关---&#xff1a;系统版本&#xff0c;真实IP&#xff0c;开放端口&#xff0c;使用的中间件 指纹信息---有无cdn加速&#xff0c;dns解析记录&#xff0…

企业“数据入表”之政策及业务模式解读

2023年8月21日&#xff0c;财政部重磅发布了《企业数据资源相关会计处理暂行规定》&#xff08;以下简称“暂行规定”&#xff09;&#xff0c;该规定将于2024年1月1日正式施行。 “暂行规定”发布后&#xff0c;引起全社会的广泛关注&#xff0c;关注的焦点集中在数据入表概念…

54.0/CSS 样式属性(详细版)

目录 54.1 文本属性 54.1.1 设置字体——font-family 54.1.2 设置字号(font-size)和字的颜色(color) 54.1.3 设置字体加粗——font-weight 54.1.4 添加文字修饰——text-decoration 54.1.5 设置文本排列方式——text-align 54.1.6 设置段落首行缩进——text-indent …

​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进

在当今数字化浪潮愈发汹涌的时代&#xff0c;科技公司的发展不仅需要更强大的计算能力和创新性技术&#xff0c;还需要对环境的高度责任感。在这一背景下&#xff0c;亚马逊云科技的海外服务器产品成为了推动清洁、高效数字未来的领导者之一。亚马逊云科技的高级主管阿比谢克夏…