rtsp视频在使用unity三维融合播放后的修正

这篇具有很好参考价值的文章主要介绍了rtsp视频在使用unity三维融合播放后的修正。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 rtsp 接入

我们使用unity UE 等三维渲染引擎中使用c++编写插件来接入rtsp 视频。同时做融合的时候,和背景的三维颜色要一致,这就要使用视频融合修正技术。包括亮度,对比度,饱和度的修正。在单纯颜色上的修正可以简单使用rgb->hsv去修改,这里不做累赘说明了。

2 播放技术

使用unity 的纹理渲染来播放多路 视频,视频接入最大可达到30路,同时在untiy , UE5 中渲染。播放后有很多视频的颜色不一致,如何调整颜色成了一个问题

3 untiy 渲染过程

建立一个材质,如命名为m2
unity视频融合,三维,unity c#,IoT 物联网,音视频,unity,游戏引擎
将m2 赋值给我们的面片,如pp
unity视频融合,三维,unity c#,IoT 物联网,音视频,unity,游戏引擎
接下来创建一个shader,控制渲染的亮度,对比度,饱和度,分别是 Brightness, Saturation, Contrast, unity shader的基础不再啰嗦,各位可以稍稍看一下,不难。

Shader "self/BrightnessSaturationAndContrast"
{
    Properties
    {
        _MainTex ("Base(RGB", 2D) = "white" {}
        //从脚本传递更好,这里可以直接省略这些值的展示
        _Brightness ("Brightness", float) = 1
        _Saturation ("Saturation", float) = 1
        _Contrast ("Contrast", float) = 1
    }
    SubShader
    {
        Pass
        {
            //关闭深度写入
            //ZTest Always Cull Off Zwrite Off

            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            
            //properties
            sampler2D _MainTex;
            half _Brightness;
            half _Saturation;
            half _Contrast;

            struct v2f {
                float4 pos : SV_POSITION;
                half2 uv : TEXCOORD0; 
            };

            //使用了内置的appdata_img结构体作为顶点着色器的输入
            v2f vert(appdata_img  v) {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv = v.texcoord;
                return o;
            }

            fixed4 frag(v2f i) : SV_Target {
                //获得屏幕图像的采样
                fixed4 renderTex = tex2D(_MainTex, i.uv);

                //亮度
                fixed3 finalColor = renderTex.rgb * _Brightness;

                //饱和度
                fixed luminance = 0.2125 * renderTex.r + 0.7154 * renderTex.g + 0.0721 * renderTex.b;  //计算该像素的亮度值
                fixed3 luminanceColor = fixed3(luminance, luminance, luminance);  //创建饱和度为0的颜色
                finalColor = lerp(luminanceColor, finalColor, _Saturation);

                //contrast
                fixed3 avgColor = fixed3(0.5, 0.5, 0.5);
                finalColor = lerp(avgColor, finalColor, _Contrast);

                return fixed4(finalColor, renderTex.a);
            }
            ENDCG
        }
    }
    FallBack  Off
}

写好shader以后, 写一个脚本,调入我们的c#脚本,脚本一为控制我们的c++插件,二是可以修改,以下的插件脚本负责调入c++ 的插件,插件会在线程里面启动,获取图像,赋值给面片。插件本身可以接入实时视频,播放视频,倒放视频,支持国标gb28181和onvif协议,可以支持矫正视频,支持多组矫正参数,同时增加三个变量,改变亮度,对比度,饱和度,便于在里面实时修改观察。

//author: 钱波
using System;
using System.Text;
using System.Threading;
using System.Collections;
using UnityEngine;
using System.Runtime.InteropServices;
using UnityEngine.UI;
using System.Linq;
using System.Collections.Generic;
using Unity.VisualScripting;
using System.IO;


[StructLayout(LayoutKind.Sequential)]
public struct FRAME
{
    public int width;
    public int height;
    public int len;
    public IntPtr Frame;
    public IntPtr data;
    //public byte[] data;
    //[MarshalAs(UnmanagedType.LPArray)]
}
[StructLayout(LayoutKind.Sequential)]
public struct PARAM
{
    public double p1;
    public double p2;
    public double p3;
    public double p4;
    public double p5;
    public double p6;
    public double p7;
    public double p8;
    public double p9;
    public double c1;
    public double c2;
    public double c3;
    public double c4;
    public double c5;
}


public class rtspin : MonoBehaviour
{
    [DllImport("rtspPlugin")]
    public static extern bool rtsp_test([MarshalAs(UnmanagedType.LPStr)] string url, int isnv12);

    [DllImport("rtspPlugin")]
    public static extern bool rtsp_test_data([MarshalAs(UnmanagedType.LPStr)] string url,
        [MarshalAs(UnmanagedType.LPArray)] byte[] data, ref FRAME frame);

    [DllImport("rtspPlugin")]
    public static extern bool rtsp_test_data_nv12([MarshalAs(UnmanagedType.LPStr)] string url,
        [MarshalAs(UnmanagedType.LPArray)] byte[] data0, [MarshalAs(UnmanagedType.LPArray)] byte[] data1);

    [DllImport("rtspPlugin")]
    public static extern void rtsp_test_stop([MarshalAs(UnmanagedType.LPStr)] string url);

    [DllImport("rtspPlugin")]
    public static extern void rtsp_test_setparam([MarshalAs(UnmanagedType.LPStr)] string url, ref PARAM param);


    static string[] stringArray = {"rtsp://127.0.0.1/front.mkv" };
    static string[] stringPlanes = { "pp"};

    //Texture2D[] texture2Ds;
    int w1 = 1920;
    int h1 = 1080;
    int number = 1;


    [Range(0.0f, 3.0f)]
    public float brightness = 1.0f;

    [Range(0.0f, 3.0f)]
    public float saturation = 1.0f;

    [Range(0.0f, 3.0f)]
    public float contrast = 1.0f;
    public Material briSatConMaterial;
    class cmd
    {
        public int v_w1 = 1920;
        public int v_h1 = 1080;
        public byte[] v_data;
        public Texture2D v_texture2Ds;
        public cmd()
        {
            v_data = new byte[v_w1 * v_h1 * 3];
            v_texture2Ds = new Texture2D(v_w1, v_h1, TextureFormat.RGB24, false);//RGB24
        }
    }


    PARAM v_param;
    //byte[][] v_datas;
    Dictionary<int, cmd> hashMap_datas = new Dictionary<int, cmd>();
    //byte[][] hashMap_datas;


    void rtspThreading(string url)
    {
        Debug.Log(url);
        rtsp_test(url, 1);
    }


    void Start()
    {

        //string path = Application.dataPath + "/rtsp.txt";

        //path = path.Replace("/", "\\");
        //if (File.Exists(path))
        //{
        //    Debug.Log("FileExists");
        //    stringArray = File.ReadAllLines(path);
        //}
        //else
        //{
        //    Debug.Log("FileNotExists");
        //    File.CreateText(path);
        //}

        stringArray[0] = "rtsp://127.0.0.1/front.mkv";
        for (int i = 0; i < number; i++)
        {
            cmd c1 = new cmd();
            hashMap_datas.Add(i, c1);
        }
        v_param = new PARAM();

        //v_param.p1 = 6.5746697810243404e+002;
        //v_param.p2 = 0.0;
        //v_param.p3 = 3.1950000000000000e+002;
        //v_param.p4 = 0.0;
        //v_param.p5 = 6.5746697810243404e+002;
        //v_param.p6 = 2.3950000000000000e+002;
        //v_param.p7 = 0.0;
        //v_param.p8 = 0.0;
        //v_param.p9 = 1.0;
        //v_param.c1 = -0.5180232701824102559;
        //v_param.c2 = 0.5071524380583312119;
        //v_param.c3 = 0.0;
        //v_param.c4 = 0.0;
        //v_param.c5 = -0.5784359684793970446;

        //1281.48 0 975.5 0 1997.48 0 0 0 1 -0.6 0.4 0.1 0 -0.198
        v_param.p1 = 1281.48;
        v_param.p2 = 0.0;
        v_param.p3 = 975.5;
        v_param.p4 = 0.0;
        v_param.p5 = 1997.48;
        v_param.p6 = 0.0;
        v_param.p7 = 0.0;
        v_param.p8 = 0.0;
        v_param.p9 = 1.0;
        v_param.c1 = -0.6;
        v_param.c2 = 0.4;
        v_param.c3 = 0.1;
        v_param.c4 = 0.0;
        v_param.c5 = -0.198;


        GameObject go = GameObject.Find("pp");
        briSatConMaterial = go.GetComponent<MeshRenderer>().material;
    }
    private void OnGUI()
    {

        if (GUI.Button(new Rect(120, 10, 80, 30), "开始线程"))
        {
            Debug.Log("开始rtsp......");

            for (int i = 0; i < number; i++)
            {
                int currentIndex = i;
                Thread rtspthread1 = new Thread(() => rtspThreading(stringArray[currentIndex]));
                rtspthread1.Start();
                Thread.Sleep(1);
            }

        }

        //绘制按钮,以及按下断开连接按钮,发送断开连接请求
        if (GUI.Button(new Rect(210, 10, 80, 30), "结束线程"))
        {
            Debug.Log("结束rtsp......");
            for (int i = 0; i < number; i++)
            {
                int currentIndex = i;
                rtsp_test_stop(stringArray[currentIndex]);
            }
        }

    }


    //float delta_x, delta_y, delta_z;            //计算移动量
    //float distance = 5;
    //float ZoomSpeed = 5f;                  //拉近拉远速度
    //public bool isFar = true;
    void Update()
    {
        FRAME frame = new FRAME();
        if (briSatConMaterial != null)
        {
            briSatConMaterial.SetFloat("_Brightness", brightness);
            briSatConMaterial.SetFloat("_Saturation", saturation);
            briSatConMaterial.SetFloat("_Contrast", contrast);
        }
        for (int i = 0; i < number; i++)
        {
            if (rtsp_test_data(stringArray[i], hashMap_datas[i].v_data, ref frame))
            {
                 rtsp_test_setparam(stringArray[i], ref v_param);


                //Texture2D original = new Texture2D(w1, h1, TextureFormat.RGB24, false);
                //original.LoadRawTextureData(hashMap_datas[i].v_data);
                //FlipTexture(original, hashMap_datas[i].v_texture2Ds);
                hashMap_datas[i].v_texture2Ds.LoadRawTextureData(hashMap_datas[i].v_data);
                hashMap_datas[i].v_texture2Ds.Apply();
                GameObject go = GameObject.Find(stringPlanes[i]);
                go.GetComponent<MeshRenderer>().material.mainTexture = hashMap_datas[i].v_texture2Ds;
            }
        }
    }

    void OnDestroy()
    {
        Debug.Log("Destory, 结束rtsp......");
        for (int i = 0; i < number; i++)
        {
            int currentIndex = i;
            rtsp_test_stop(stringArray[currentIndex]);
        }
    }
}

结果

点击开始播放,rtsp线程开始播放,inspector里面可以调整三个值,可以直观地看到视频播放的亮度和对比度饱和度的改变。
unity视频融合,三维,unity c#,IoT 物联网,音视频,unity,游戏引擎
修改一下亮度
unity视频融合,三维,unity c#,IoT 物联网,音视频,unity,游戏引擎
同时修改三个参数的变化
unity视频融合,三维,unity c#,IoT 物联网,音视频,unity,游戏引擎文章来源地址https://www.toymoban.com/news/detail-850124.html

到了这里,关于rtsp视频在使用unity三维融合播放后的修正的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • VUE3 播放RTSP实时、回放(NVR录像机)视频流(使用WebRTC)

    1、下载webrtc-streamer,下载的最新window版本 Releases · mpromonet/webrtc-streamer · GitHub  2、解压下载包  3、webrtc-streamer.exe启动服务 (注意:这里可以通过当前文件夹下用cmd命令webrtc-streamer.exe -o这样占用cpu会很少,直接双击exe文件会占用cpu) cmd  webrtc-streamer.exe -o 启动如下图所示,

    2024年04月12日
    浏览(64)
  • ChatGpt+人工修正 PyQt5 实现简易视频播放器

    支持功能: 1. 视频播放速度调整 2. 视频声音调整 3. 视频当前播放帧截帧(用的ffmpeg 怎么装自己百度去,截取准确度很高,QT自带的截帧那玩意信号不触发,不好使) 4. 视频暂停

    2024年02月16日
    浏览(42)
  • 如何解决html播放rtsp视频,浏览器播放rtsp视频流方案

    最近项目中需要实时播放摄像头rtsp视频流,于是就专门做了些研究。而浏览器不能直接播放,只有通过插件或者转码来实现这个需求。 要实现这个目的,可以采用的方案非常得多,有商业的也有开源的,这里主要列举一些开源的方案。这里的方案都是我尝试过了的,有些成

    2024年02月05日
    浏览(60)
  • 基于开源的Micro-RTSP,使用VLC和ffmpeg拉流播放RTSP视频流,本例使用安信可ESP32 CAM进行推流。

    基于开源的Micro-RTSP,使用VLC和ffmpeg拉流播放RTSP视频流,本例使用安信可ESP32 CAM进行推流。 vlc播放命令为:rtsp://192.168.43.128:8554/mjpeg/1。 ffmpeg播放命令为:ffplay rtsp://192.168.43.128:8554/mjpeg/1。 使用ESP-IDF5.0编译成功。esp-idf-v4.4.2编译不成功,有成功的小伙伴可以分享一下。 git cl

    2024年02月01日
    浏览(47)
  • 使用jsmpeg低延时播放rtsp视频流(注:该方式在websocket服务器搭建好的情况下使用)

    注:本文仅在局域网下验证 1、安装jsmpeg     使用npm方式安装(注:此方式安装无法进行二次开发) npm install jsmpeg -s  2、播放与使用 (1)引入方式(npm方式安装) import  JSMpeg from \\\'jsmpeg\\\' (2)引入方式(使用源码方式) import JSMpeg from \\\'xx/jsmpeg.min.js\\\'         //from后面的引用

    2024年02月09日
    浏览(55)
  • 【vue2】前端如何播放rtsp 视频流,拿到rtsp视频流地址如何处理,海康视频rtsp h264 如何播放

    最近在写vue2 项目其中有个需求是实时播放摄像头的视频,摄像头是 海康 的设备,搞了很长时间终于监控视频出来了,记录一下,放置下次遇到。文章有点长,略显啰嗦请耐心看完。 测试?测试什么?测试rtsp视频流能不能播放。 video mediaplay官网 即(VLC) 下载、安装完VLC后

    2024年02月05日
    浏览(55)
  • 【音视频】如何播放rtsp视频流

    现阶段直播越来越流行,直播技术发展也越来越快。Webrtc和rtsp是比较火热的技术,而且应用也比较广泛。本文通过实践来展开介绍关于rtsp、webrtc的使用过程。 本文重点介绍如何播放rtsp视频流,通过ffplay方式以及VLC media player的方式来播放 可以参考上一篇博文:【音视频】基于

    2024年01月19日
    浏览(97)
  • Java播放海康的RTSP视频

    视频流,一种流媒体传输方式,市面上常用的流媒体传输协议分别有RTSP、FLV、M3U8、HLS和HDS以及WebRTC。像更早一点的通过falsh插件播放的协议就是RTMP。 RTSP(Real-Time Streaming Protocol)是一种实时流媒体传输协议,适用于点对点传输,可以支持高质量的视频流传输,但是需要较高

    2024年02月16日
    浏览(34)
  • vue项目播放rtsp流视频。

    下载webtrc-streamer的压缩包,在github上有 https://github.com/mpromonet/webrtc-streamer/releases 将下载包html文件夹下webrtcstreamer.js文件和html/libs文件夹下adapter.min.js文件复制到VUE项目public/stactic目录下,在index.html文件里引入这两个js文件。 解压之后打开exe文件就可以播放了。(想做到把exe变

    2024年02月02日
    浏览(41)
  • webrtcstreamer实现视频rtsp流播放

    webrtc streamer 大致的了解了一下,就是使用js来播放rtsp视频流的一个技术。目前实现的厂家有很多,但是要收费。我这里是找了一个开源免费的项目,使用起来有一定的局限性,需要根据自己的业务自己去实现逻辑,目前我只做到了播放实时摄像头。 网址:https://github.com/mpr

    2024年04月09日
    浏览(80)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包