首页 > 其他分享 >第四十九章 添加滤镜能力

第四十九章 添加滤镜能力

时间:2024-10-16 13:49:32浏览次数:7  
标签:canvas frame 视频流 滤镜 添加 video data 第四十九章

添加滤镜后端做法

由于需要实时预览滤镜效果,所以必须在渲染开始之前添加滤镜。好在 WebRTC 已经提供了 VideoProcessor 这个接口类,可以对采集到的帧数据进行预处理,调用 VideoSource.setVideoProcessor(processor) 即可设置:

VideoSource.java

public class VideoSource extends MediaSource {
  // other definitions...

  private final CapturerObserver capturerObserver = new CapturerObserver() {
    // other definitions...

    @Override
    public void onFrameCaptured(VideoFrame frame) {
      final VideoProcessor.FrameAdaptationParameters parameters =
          nativeAndroidVideoTrackSource.adaptFrame(frame);
      synchronized (videoProcessorLock) {
        if (videoProcessor != null) {

          videoProcessor.onFrameCaptured(frame, parameters);
          return;
        }
      }

      // body method...
    }
  };

  // other definitions...
}

最后给出一个 VideoProcessor 的简单实现,给各位读者参考:

public final class Example implements VideoProcessor {

  @Nullable private VideoSink mVideoSink;

  @Override
  public void onCapturerStarted(boolean success) {
    // DO SOMETHING IF YOU WANT.
  }

  @Override
  public void onCapturerStopped() {
    // DO SOMETHING IF YOU WANT.
  }

  @Override
  public void setSink(@Nullable VideoSink sink) {
    // 需要持有 WebRTC 传入的 VideoSink 对象
    mVideoSink = sink;
  }

  @Override
  public void onFrameCaptured(@NonNull VideoFrame frame) {
    VideoFrame newFrame = yourVideoFilter(frame);

    // 会调用 NativeAndroidVideoTrackSource 将新的帧数据传递给 Native 层
    if (mVideoSink != null) mVideoSink.onFrame(frame);
  }
}

对应的前端可能有不同的做法

涉及到对视频流的实时处理。你可以使用WebRTC的MediaStreamCanvas API来实现视频滤镜。以下是一个简单的示例,演示了如何为WebRTC视频流应用一个基本的灰度滤镜。

实现步骤

  1. 获取视频流:使用getUserMedia从摄像头获取视频流。
  2. 将视频流绘制到Canvas:通过Canvas API对视频帧进行处理。
  3. 将处理后的视频流显示到<video>元素

示例代码

以下是一个简单的JavaScript示例,展示了如何应用灰度滤镜到WebRTC视频流:

<!DOCTYPE html>
<html>
<head>
    <title>WebRTC Video Filter</title>
    <style>
        video, canvas {
            display: block;
            margin: 10px auto;
        }
    </style>
</head>
<body>
    <video id="video" autoplay></video>
    <canvas id="canvas"></canvas>

    <script>
        async function startVideo() {
            const video = document.getElementById('video');
            const canvas = document.getElementById('canvas');
            const ctx = canvas.getContext('2d');

            // Get user media
            const stream = await navigator.mediaDevices.getUserMedia({ video: true });
            video.srcObject = stream;

            // Set canvas dimensions
            video.onloadedmetadata = () => {
                canvas.width = video.videoWidth;
                canvas.height = video.videoHeight;
                drawFrame();
            };

            function drawFrame() {
                ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
                
                // Apply grayscale filter
                const frame = ctx.getImageData(0, 0, canvas.width, canvas.height);
                const data = frame.data;
                for (let i = 0; i < data.length; i += 4) {
                    const avg = (data[i] + data[i + 1] + data[i + 2]) / 3;
                    data[i] = avg;     // Red
                    data[i + 1] = avg; // Green
                    data[i + 2] = avg; // Blue
                }
                ctx.putImageData(frame, 0, 0);

                // Request the next frame
                requestAnimationFrame(drawFrame);
            }
        }

        startVideo();
    </script>
</body>
</html>

代码解释

  1. 获取视频流:通过navigator.mediaDevices.getUserMedia获取视频流并将其设置到<video>元素。
  2. Canvas绘制:使用Canvas API将视频帧绘制到Canvas上。
  3. 滤镜应用:在drawFrame函数中获取Canvas的图像数据,对其进行灰度化处理,并将结果绘制回Canvas。
  4. 动画循环:使用requestAnimationFrame实现每帧更新,以确保实时处理视频流。

你可以在这个基础上,使用不同的图像处理算法和滤镜效果来扩展功能。

标签:canvas,frame,视频流,滤镜,添加,video,data,第四十九章
From: https://blog.csdn.net/ms44/article/details/142847901

相关文章

  • jumpserver堡垒机部署 添加资产主机和MySQL数据库,图解过程
    jumpserver堡垒机部署JumpServer是广受欢迎的开源堡垒机,是符合4A规范的专业运维安全审计系统。JumpServer帮助企业以更安全的方式管控和登录所有类型的资产,实现事前授权、事中监察、事后审计,满足等保合规要求。下载软件包JumpServer-开源堡垒机-官网#官方网址......
  • 本地部署ComfyUI并添加强大的Flux.1开源文生图模型远程制作AI图片
    文章目录前言1.本地部署ComfyUI2.下载Flux.1模型3.下载CLIP模型4.下载VAE模型5.演示文生图6.公网使用Flux.1大模型6.1创建远程连接公网地址7.固定远程访问公网地址前言本文将详细介绍如何在本地部署ComfyUI并搭建Flux.1文生图神器,......
  • 宝塔面板添加网站
    宝塔面板是一款非常流行的服务器管理软件,它可以帮助用户方便地管理服务器上的网站、数据库、域名等资源。要在宝塔面板上添加一个新的网站,你可以按照以下步骤操作:登录宝塔面板:打开浏览器,输入宝塔面板的IP地址加上端口号(默认为8888)。输入用户名和密码登录。进入网站管理......
  • WPF中Resx文件中添加Byte[]
    参考:https://learn.microsoft.com/zh-tw/dotnet/api/system.resources.resxresourcewriter.generate?view=windowsdesktop-8.0&viewFallbackFrom=netcore-3.1代码实现:staticvoidMain(string[]args){using(ResXResourceWriterresWriter=newResXResourceWr......
  • 【油猴脚本】00027 案例 Tampermonkey油猴脚本, 仅用于学习,不要乱搞。添加标题为网页数
    前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦......
  • 【Azure Cloud Service】使用Key Vault Secret添加.CER证书到Cloud Service Extended
    问题描述因为KeyVault的证书上传功能中,只支持pfx格式的证书,而中间证书,根证书不能转换为pfx格式,只能是公钥证书格式cet或者crt,能通过文本工具直接查看base64编码内容。如一个证书链文件中可以看见中间证书,根证书: 当把包含完成证书链的证书PFX上传到KeyVaultcertificate......
  • 如何在Windows中添加“在此处打开PowerShell”到右键菜单
    步骤2:打开注册表编辑器步骤3:导航到合适的注册表路径步骤4:创建新项步骤5:设置默认命令步骤6:完成并关闭步骤1:打开PowerShell按下 Win + X 键,然后选择“Windows PowerShell(管理员)”。在PowerShell窗口中输入以下命令并按下回车:powershellCopy$env:PAT......
  • 标题、导航、目录添加序号
    在主题文件夹添加base.user.css文件,把下面的内容复制进去。/***************************************HeaderCountersinContent**************************************//**initializecsscounter*/#write{counter-reset:h1}h1{counter-reset:h2......
  • 在qemu添加基于ast2600的设备
    公司的设备基于aspeed的ast2600.和ast2600-evt还是有不小差距,需要为了多模拟一些数据,需要添加新machine,修改部分设备.修改文件hw/arm/aspeed.c1.添加新的machinepf12, 基于ast2600-evb,提供一个classinit函数staticconstTypeInfoaspeed_machine_types[]......
  • wpf 下拉框添加选项中删除数据
    需要根据实际需求在按钮的对应事件或者Command中添加逻辑<StyleTargetType="ComboBox"x:Key="DeleteComboBoxStyle"><SetterProperty="ItemContainerStyle"><Setter.Value><!--ComBoxItem--><......