untiy 录制网络摄像头视频并保存到本地文件

网络摄像头使用的是海康威视的,关于如何使用Ump插件播放海康威视rtsp视频流,请参考我的这篇文章
内部有ump插件的下载链接
untiy接入 海康威视网络摄像头

录屏使用的插件是 AVPro movieCapture 4.6.3版, 插件和完整工程的下载链接放在本文的最后

录制摄像头的实现思想为
1 ump通过一个在RenderTexture上绘制图像来播放画面
2 movieCapture支持从纹理中获取画面
3 我们只需要使用Graphics.Blit()函数将一个纹理绘制到另一个纹理即可

核心脚本为以下三个
在这里插入图片描述

RecoderManger是我们自己写的,用于打通ump和AVPro movieCapture之间的连接
CaptureFromTexture是AVPro movieCapture中用于从纹理中录像的脚本,挂上就行,不用做任何调整
UniversalMediaPlayer是Ump插件提供的脚本,用于拉取网络摄像头的视频

Ump里的预制体RawImage用于用于提供一个临时的容器,ump会新建一个RenderTexture并给Rawimge的mainTexture属性赋值(面板上显示的属性名为texture),RecoderManger获取这个RenderTexture,然后将图案绘制到CaptureFromTexture里的_texture属性里,这样就完成了录像

程序打开sampleScene,直接运行即可录屏,停止运行即可保存录像,代码里有详细注释,这里不再赘述

using RenderHeads.Media.AVProMovieCapture;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UMP;

public class RecoderManager : MonoBehaviour
{
	public int _textureWidth = 1024; //视频的宽
	public int _textureHeight = 768; //视频的高
	private CaptureFromTexture movieCapture = null; //录像机
	private UniversalMediaPlayer ump;//ump,用于拉取网络摄像头的视频
	//外部rawImage
	public RawImage rawImage;
	//录像用的渲染纹理
	private RenderTexture _texture;
	/// <summary>
	/// 录像保存的路径
	/// </summary>
	private string filePath = "";
	/// <summary>
	/// 录像保存的文件夹名,追在在路径之后
	/// </summary>
	public string folderName = "";
	/// <summary>
	/// 视频降低多少分辨率,以  _textureWidth  _textureHeight 制定的宽高为基础
	/// </summary>
	public CaptureBase.DownScale downScale = CaptureBase.DownScale.Half;
	/// <summary>
	/// 视频的前缀名
	/// </summary>
	public string fileNamePrefix = "";
	/// <summary>
	/// 视频流的地址
	/// </summary>
	public string RTSPAddress = "";

	private void Start()
	{
		ump = GetComponent<UniversalMediaPlayer>();
		movieCapture = GetComponent<CaptureFromTexture>();
		//如果视频流是空的,直接返回
		if (string.IsNullOrEmpty(RTSPAddress))
		{
			print("视频流地址为空,停止录像");
			return;
		}
		//设置拉取的视频流
		ump.Path = RTSPAddress;
		ump.Play();
		//设置渲染纹理
		_texture = new RenderTexture(_textureWidth, _textureHeight, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear);
        _texture.filterMode = FilterMode.Bilinear;
        _texture.Create();
        if (movieCapture)
		{
			movieCapture.SetSourceTexture(_texture);
		}
		//设置录像机的属性
		filePath = Application.streamingAssetsPath + "/RecoderVideo/"+folderName+"/";
		movieCapture.OutputFolderPath = filePath;//视频的保存路径 路径不存在会自动创建
		movieCapture.FilenamePrefix = fileNamePrefix;//视频的名字的前缀
		movieCapture.ResolutionDownScale = downScale;	//降低分辨率	
		//开始录像
		movieCapture.StartCapture();		
		rawImage.gameObject.SetActive(false); // RawImage的作用是提供中转用的RenderTexture,禁用即可
	}

	

	private void OnDestroy()
	{
		if (_texture != null)
		{
			RenderTexture.Destroy(_texture);
			_texture = null;
		}
		movieCapture.StopCapture();
	}

	private void Update()
	{
		UpdateTexture();
	}

	private void UpdateTexture()
	{
		Graphics.Blit(rawImage.mainTexture, _texture); //将纹理1 绘制到 纹理2 上,此处为将网络摄像头的画面绘制到录像用的纹理上
	}
}

资源免积分下载
AVPro movieCapture 4.6.3
完整工程

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值