当前位置: 首页 > news >正文

JavaCV之FFmpegFrameFilter视频转灰度

1、代码

package com.example.demo.ffpemg;import lombok.SneakyThrows;
import org.bytedeco.javacv.*;public class FFmpegFrameFilterVideoExample {@SneakyThrowspublic static void main(String[] args) {// 输入视频文件路径String inputVideoPath = "f:/2222.mp4";// 输出视频文件路径String outputVideoPath = "f:/2222output_video.mp4";// 抓取器,用于读取输入视频FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputVideoPath);grabber.start();// 创建帧过滤器,这里使用一个简单的视频滤镜(例如:将视频转为灰度)
//        传入滤镜参数(这里是format = gray,用于将视频转换为灰度)
//        、视频宽度和高度。同时设置像素格式为AVPixelFormat.GRAY8和帧率为抓取器获取的帧率,并启动帧过滤器。FFmpegFrameFilter frameFilter = new FFmpegFrameFilter("format=gray", grabber.getImageWidth(),grabber.getImageHeight());frameFilter.setFrameRate(grabber.getFrameRate());frameFilter.start();// 用于写入输出视频的帧记录器FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputVideoPath, grabber.getImageWidth(),grabber.getImageHeight());recorder.setVideoCodec(grabber.getVideoCodec());recorder.setFormat("mp4");recorder.setFrameRate(grabber.getFrameRate());recorder.setAudioChannels(grabber.getAudioChannels());recorder.setAudioCodec(grabber.getAudioCodec());recorder.start();Frame frame;while ((frame = grabber.grab()) != null) {//从抓取器中抓取帧,将其推送(push)到帧过滤器中,然后通过pull方法获取经过滤镜处理后的帧// 。如果设置了帧记录器(在代码中部分注释掉了),可以将处理后的帧记录到输出视频文件中。frameFilter.push(frame);Frame filteredFrame = frameFilter.pull();recorder.record(filteredFrame);}frameFilter.stop();grabber.stop();recorder.stop();frameFilter.release();grabber.release();recorder.release();System.out.println("视频滤镜处理完成。");}
}

2、pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.3</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>demo1</artifactId><version>0.0.1-SNAPSHOT</version><name>demo1</name><description>demo1</description><properties><java.version>11</java.version><javacpp.platform.macosx-x86_64>macosx-x86_64</javacpp.platform.macosx-x86_64><javacpp.platform.linux-x86_64>linux-x86_64</javacpp.platform.linux-x86_64><javacpp.platform.windows-x86_64>windows-x86_64</javacpp.platform.windows-x86_64><javacv.version>1.5.11</javacv.version><javacv.ffmpeg.version>7.1-1.5.11</javacv.ffmpeg.version><javacv.opencv.version>4.10.0-1.5.11</javacv.opencv.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- mqtt --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-integration</artifactId></dependency><dependency><groupId>org.springframework.integration</groupId><artifactId>spring-integration-stream</artifactId></dependency><dependency><groupId>org.springframework.integration</groupId><artifactId>spring-integration-mqtt</artifactId></dependency><!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter --><!--        <dependency>--><!--            <groupId>com.baomidou</groupId>--><!--            <artifactId>mybatis-plus-boot-starter</artifactId>--><!--            <version>3.5.1</version>--><!--        </dependency>--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.4.6</version></dependency><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-dysmsapi</artifactId><version>2.2.1</version></dependency><!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-core --><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.6.0</version></dependency><dependency><groupId>com.aliyun</groupId><artifactId>dyvmsapi20170525</artifactId><version>2.1.4</version></dependency><!-- https://mvnrepository.com/artifact/io.netty/netty-all --><dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.75.Final</version></dependency><!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.79</version></dependency><!-- https://mvnrepository.com/artifact/org.redisson/redisson --><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.16.0</version></dependency><!-- https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java --><dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-java</artifactId><version>3.20.0</version></dependency><!-- https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java-util --><dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-java-util</artifactId><version>3.20.0</version><scope>runtime</scope></dependency><!-- https://mvnrepository.com/artifact/com.google.guava/guava --><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>31.1-jre</version></dependency><dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.8</version></dependency><!-- https://mvnrepository.com/artifact/org.dom4j/dom4j --><dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.4</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>4.0.3</version></dependency><!-- https://mvnrepository.com/artifact/net.java.dev.jna/jna --><dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>5.14.0</version></dependency><dependency><groupId>ai.djl</groupId><artifactId>api</artifactId><version>0.29.0</version></dependency><!-- https://mvnrepository.com/artifact/ai.djl.mxnet/mxnet-engine --><dependency><groupId>ai.djl.mxnet</groupId><artifactId>mxnet-engine</artifactId><version>0.29.0</version><scope>runtime</scope></dependency><!-- https://mvnrepository.com/artifact/ai.djl.mxnet/mxnet-model-zoo --><dependency><groupId>ai.djl.mxnet</groupId><artifactId>mxnet-model-zoo</artifactId><version>0.29.0</version></dependency><dependency><groupId>ai.djl</groupId><artifactId>basicdataset</artifactId><version>0.29.0</version></dependency><dependency><groupId>ai.djl</groupId><artifactId>model-zoo</artifactId><version>0.29.0</version></dependency><dependency><groupId>ai.djl.timeseries</groupId><artifactId>timeseries</artifactId><version>0.29.0</version></dependency><dependency><groupId>ai.djl.huggingface</groupId><artifactId>tokenizers</artifactId><version>0.29.0</version></dependency><dependency><groupId>ai.djl.audio</groupId><artifactId>audio</artifactId><version>0.29.0</version></dependency><dependency><groupId>commons-cli</groupId><artifactId>commons-cli</artifactId><version>1.5.0</version></dependency><!-- https://mvnrepository.com/artifact/org.bytedeco/javacv --><dependency><groupId>org.bytedeco</groupId><artifactId>javacv</artifactId><version>${javacv.version}</version></dependency><!--javacv 精简依赖  只依赖windows64位ffmpeg--><dependency><groupId>org.bytedeco</groupId><artifactId>javacpp</artifactId><version>${javacv.version}</version><classifier>${javacpp.platform.windows-x86_64}</classifier></dependency><dependency><groupId>org.bytedeco</groupId><artifactId>ffmpeg</artifactId><version>${javacv.ffmpeg.version}</version><classifier>${javacpp.platform.windows-x86_64}</classifier></dependency><!-- https://mvnrepository.com/artifact/org.bytedeco/opencv-platform --><dependency><groupId>org.bytedeco</groupId><artifactId>opencv</artifactId><version>4.10.0-1.5.11</version><classifier>${javacpp.platform.windows-x86_64}</classifier></dependency><!-- https://mvnrepository.com/artifact/org.bytedeco/tesseract --><dependency><groupId>org.bytedeco</groupId><artifactId>tesseract</artifactId><version>5.5.0-1.5.11</version><classifier>${javacpp.platform.windows-x86_64}</classifier></dependency><!-- https://mvnrepository.com/artifact/org.bytedeco/openblas --><dependency><groupId>org.bytedeco</groupId><artifactId>openblas</artifactId><version>0.3.28-1.5.11</version><classifier>${javacpp.platform.windows-x86_64}</classifier></dependency><!-- https://mvnrepository.com/artifact/org.bytedeco/leptonica --><dependency><groupId>org.bytedeco</groupId><artifactId>leptonica</artifactId><version>1.85.0-1.5.11</version><classifier>${javacpp.platform.windows-x86_64}</classifier></dependency><!-- https://mvnrepository.com/artifact/org.bytedeco/flycapture --><dependency><groupId>org.bytedeco</groupId><artifactId>flycapture</artifactId><version>2.13.3.31-1.5.9</version><classifier>${javacpp.platform.windows-x86_64}</classifier></dependency><!-- https://mvnrepository.com/artifact/org.bytedeco/libdc1394 --><dependency><groupId>org.bytedeco</groupId><artifactId>libdc1394</artifactId><version>2.2.6-1.5.9</version><classifier>${javacpp.platform.windows-x86_64}</classifier></dependency><!-- https://mvnrepository.com/artifact/org.bytedeco/libfreenect --><dependency><groupId>org.bytedeco</groupId><artifactId>libfreenect</artifactId><version>0.5.7-1.5.9</version><classifier>${javacpp.platform.windows-x86_64}</classifier></dependency><!-- https://mvnrepository.com/artifact/org.bytedeco/libfreenect2 --><dependency><groupId>org.bytedeco</groupId><artifactId>libfreenect2</artifactId><version>0.2.0-1.5.9</version><classifier>${javacpp.platform.windows-x86_64}</classifier></dependency><!-- https://mvnrepository.com/artifact/org.bytedeco/librealsense --><dependency><groupId>org.bytedeco</groupId><artifactId>librealsense</artifactId><version>1.12.4-1.5.9</version><classifier>${javacpp.platform.windows-x86_64}</classifier></dependency><!-- https://mvnrepository.com/artifact/org.bytedeco/librealsense2 --><dependency><groupId>org.bytedeco</groupId><artifactId>librealsense2</artifactId><version>2.53.1-1.5.9</version><classifier>${javacpp.platform.windows-x86_64}</classifier></dependency><!-- https://mvnrepository.com/artifact/org.bytedeco/videoinput --><dependency><groupId>org.bytedeco</groupId><artifactId>videoinput</artifactId><version>0.200-1.5.9</version><classifier>${javacpp.platform.windows-x86_64}</classifier></dependency><!-- https://mvnrepository.com/artifact/org.bytedeco/artoolkitplus --><dependency><groupId>org.bytedeco</groupId><artifactId>artoolkitplus</artifactId><version>2.3.1-1.5.9</version><classifier>${javacpp.platform.windows-x86_64}</classifier></dependency><!--javacv 精简依赖  只依赖windows64位ffmpeg--></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

相关文章:

JavaCV之FFmpegFrameFilter视频转灰度

1、代码 package com.example.demo.ffpemg;import lombok.SneakyThrows; import org.bytedeco.javacv.*;public class FFmpegFrameFilterVideoExample {SneakyThrowspublic static void main(String[] args) {// 输入视频文件路径String inputVideoPath "f:/2222.mp4&qu…...

Redis:基于PubSub(发布/订阅)、Stream流实现消息队列

Redis - PubSub、Stream流 文章目录 Redis - PubSub、Stream流1.基于List的消息队列2.基于PubSub的消息队列3.基于Stream的消息队列1.Redis Streams简介2.Redis Streams基本命令1.XADD 添加消息到末尾2.XLEN 获取消息长度3.XREAD 读取消息 &#xff08;单消费模式&#xff09;4…...

C#飞行棋(新手简洁版)

我们要在主函数的顶部写一些全局静态字段 确保能在后续的静态方法中能够获取到这些值和修改 static int[] Maps new int[100];static string[] PlayerName new string[2];static int[] PlayerScore new int[2];static bool[] Flags new bool[2] {true,true }; static int[]…...

【OpenCV】图像转换

理论 傅立叶变换用于分析各种滤波器的频率特性。对于图像&#xff0c;使用 2D离散傅里叶变换&#xff08;DFT&#xff09; 查找频域。快速算法称为 快速傅立叶变换&#xff08;FFT&#xff09; 用于计算DFT。 Numpy中的傅立叶变换 首先&#xff0c;我们将看到如何使用Numpy查…...

力扣 重排链表-143

重排链表-143 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next)…...

【Kubernetes理论篇】容器集群管理系统Kubernetes(K8S)

Kubernetes集群部署基本管理实战 这么好的机会&#xff0c;还在等什么&#xff01; 01、Kubernetes 概述 K8S是什么 K8S 的全称为 Kubernetes (K12345678S)&#xff0c;PS&#xff1a;“嘛&#xff0c;写全称也太累了吧&#xff0c;写”。不如整个缩写 K8s 作为缩写的结果…...

Kubernetes 常用操作大全:全面掌握 K8s 基础与进阶命令

Kubernetes&#xff08;简称 K8s&#xff09;作为一种开源的容器编排工具&#xff0c;已经成为现代分布式系统中的标准。它的强大之处在于能够自动化应用程序的部署、扩展和管理。在使用 Kubernetes 的过程中&#xff0c;熟悉常用操作对于高效地管理集群资源至关重要。本文将详…...

爬虫基础之Web网页基础

网页的组成 网页可以分为三大部分–HTML、CSS 和 JavaScript。如果把网页比作一个人&#xff0c;那么 HTML 相当于骨架、JavaScript 相当于肌肉、CSS 相当于皮肤&#xff0c;这三者结合起来才能形成一个完善的网页。下面我们分别介绍一下这三部分的功能。 HTML HTML(Hypertext…...

k8s, deployment

控制循环&#xff08;control loop&#xff09; for {实际状态 : 获取集群中对象X的实际状态&#xff08;Actual State&#xff09;期望状态 : 获取集群中对象X的期望状态&#xff08;Desired State&#xff09;if 实际状态 期望状态{什么都不做} else {执行编排动作&#xf…...

使用ensp搭建OSPF+BGP和静态路由,底层PC使用dhcp,实现PC互通

1.4种方式&#xff0c;实现PC2可以互通底层的所有设备 OSPF&#xff1a;OSPF是一种用于互联网协议网络的链路状态路由协议 BGP&#xff1a;是一种用于互联网上进行路由和可达性信息传递的外部网关协议&#xff08;EGP&#xff09; 静态路由&#xff1a; 静态路由是一种路由方…...

TÜLU 3: Pushing Frontiers in Open Language Model Post-Training

基本信息 &#x1f4dd; 原文链接: https://arxiv.org/abs/2411.15124&#x1f465; 作者: Nathan Lambert, Jacob Morrison, Valentina Pyatkin, Shengyi Huang, Hamish Ivison, Faeze Brahman, Lester James V. Miranda, Alisa Liu, Nouha Dziri, Shane Lyu, Yuling Gu, Sau…...

深入解读 MySQL EXPLAIN 与索引优化实践

MySQL 是当今最流行的关系型数据库之一&#xff0c;为了提升查询性能&#xff0c;合理使用 EXPLAIN 工具和优化索引显得尤为重要。本文将结合实际示例&#xff0c;探讨如何利用 EXPLAIN 分析查询执行计划&#xff0c;并分享索引优化的最佳实践。 一、EXPLAIN 工具简介 EXPLAIN …...

Flume——进阶(agent特性+三种结构:串联,多路复用,聚合)

目录 agent特性ChannelSelector描述&#xff1a; SinkProcessor描述&#xff1a; 串联架构结构图解定义与描述配置示例Flume1&#xff08;监测端node1&#xff09;Flume3&#xff08;接收端node3&#xff09;启动方式 复制和多路复用结构图解定义描述配置示例node1node2node3启…...

ragflow连ollama时出现的Bug

ragflow和ollama连接后&#xff0c;已经添加了两个模型但是ragflow仍然一直warn&#xff1a;Please add both embedding model and LLM in Settings &#xff1e; Model providers firstly.这里可能是我一开始拉取的镜像容器太小&#xff0c;容不下当前添加的模型&#xff0c;导…...

基于centos7.7编译Redis6.0

背景&#xff1a; OS&#xff1a;CentOs 7.7 Redis: 6.0.6 编译构建报错如下&#xff1a; In file included from server.c:30:0: server.h:1044:5: error: expected specifier-qualifier-list before ‘_Atomic’_Atomic unsigned int lruclock; /* Clock for LRU eviction …...

uni-app项目无法在Android Studio模拟器上运行

目录 1 问题描述2 尝试解决3 引发原因4 解决方法4.1 换用 MuMu 模拟器 5 结语 1 问题描述 在使用 uni-app 开发 Pad 端 App 时&#xff0c;初始化项目后打算先运行一下确保初始化正常。打开 Android Studio 模拟器后&#xff0c;然后在 HbuilderX 中选择使用 App 标准基座 运…...

第一部分:Linux系统(基础及命令)

Linux操作系统的实操性非常强&#xff0c;纯操作&#xff0c;不适用于日常的办公使用 1.初始Linux 1.1 操作系统概述 1.1.1 了解OS的作用 OS&#xff1a;是计算机软件的一种&#xff0c;主要负责&#xff1a;作为用户和计算机硬件之间的桥梁&#xff0c;调度和管理计算机硬…...

No module named ‘_ssl‘ No module named ‘_ctypes‘

如果你使用的是基于 yum 的 Linux 发行版&#xff08;例如 CentOS、RHEL、Fedora&#xff09;&#xff0c;安装 libc6-dev 的方式稍有不同。在这些系统中&#xff0c;通常对应的包是 glibc-devel。 No module named ‘_ctypes’ 使用 yum 安装 glibc-devel 更新系统的软件包列…...

【QT】编写第一个 QT 程序 对象树 Qt 编程事项 内存泄露问题

目录 1. 编写第一个 QT 程序 1.1 使用 标签 实现 &#x1f407; 图形化界面实现 &#x1f407; 纯代码形式实现 1.2 使用 按钮 实现 &#x1f40b; 图形化界面实现 &#x1f40b; 纯代码形式实现 1.3 使用 编辑框 实现 &#x1f95d; 图形化界面实现 &#x1f95…...

VTK编程指南<六>:VTK可视化管线与渲染详解

1、VTK渲染引擎 回顾前几章节的RenderCylinder示例 可以找到以下的类: vtkProp; ytkAbstractMapper; vtkProperty; vtkCamera; vtkLight; vtkRenderer; vtkRenderWindow; vtkRenderWindowInteractor vtkTransform; vtkLookupTable;可以发现这些类都是与数据显示或渲染相关的。…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...