当前位置:

首页 > 编程开发 > SpringBoot整合RabbitMq的方法是什么

SpringBoot整合RabbitMq的方法是什么

SpringBoot整合RabbitMq实战spring-boot-starter-amqp高级消息队列协议(AMQP)是面向消息中间件的平台中立的有线协议。SpringAMQP项目将核心Spring概念应用于基于AMQP的消息传递解决方案的开发。SpringBoot为通过RabbitMQ与AMQP一起工作提供了一些便利,包括spring-boot-starter-amqp“Starter”。springboot集成RabbitMQ非常简单,如果只是简单的使用配置非常少,springboot提供了spri

本文目录

    SpringBoot 整合RabbitMq 实战

    spring-boot-starter-amqp

    高级消息队列协议(AMQP)是面向消息中间件的平台中立的有线协议。Spring AMQP项目将核心Spring概念应用于基于AMQP的消息传递解决方案的开发。Spring Boot为通过RabbitMQ与AMQP一起工作提供了一些便利,包括spring-boot-starter-amqp “Starter”。

    springboot集成RabbitMQ非常简单,如果只是简单的使用配置非常少,springboot提供了spring-boot-starter-amqp项目对消息各种支持。

    添加依赖

    
                org.springframework.boot
                spring-boot-starter-amqp
            

    RabbitMQ是基于AMQP协议的轻量级,可靠,可扩展,可移植的消息代理。Spring使用RabbitMQ通过AMQP协议进行通信。

    属性配置

    RabbitMQ配置由外部配置属性控制 spring.rabbitmq.*。例如,您可以在以下部分声明以下部分 application.properties:

    spring.rabbitmq.host = localhost
     spring.rabbitmq.port = 5672
     spring.rabbitmq.username = guest
     spring.rabbitmq.password

    快速上手

    1.队列配置

    package com.example.rabbitmqdemo.config;
    
    
    import org.springframework.amqp.core.Queue;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * RabbitMQ 配置类
     *
     * @author itguang
     * @create
    @Configuration
    public class RabbitConfig
    
        @Bean
        public Queue queue(){
            return new Queue("hello");
        }
    }

    2 发送者

    rabbitTemplate是springboot 提供的默认实现.

    package com.example.rabbitmqdemo.rabbitmq;
    
    import org.springframework.amqp.core.AmqpTemplate;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    import java.time.LocalDate;
    import java.time.LocalDateTime;
    import java.time.LocalTime;
    import java.util.Date;
    
    /**
     * 消息发送者
     *
     * @author itguang
     * @create
    
    @Component
    public class HelloSender
    
    
        @Autowired
        private AmqpTemplate amqpTemplate;
    
    
        public void send(){
            String context = "hello----"+LocalDateTime.now();
            System.out.println("send:"+context);
            //往名称为 hello 的queue中发送消息
            this.amqpTemplate.convertAndSend("hello",context);
        }
    
    }

    3 接收者

    package com.example.rabbitmqdemo.rabbitmq;
    
    import org.springframework.amqp.rabbit.annotation.RabbitHandler;
    import org.springframework.amqp.rabbit.annotation.RabbitListener;
    import org.springframework.stereotype.Component;
    
    /**
     * 消息接受者
     *
     * @author itguang
     * @create
    
    @Component
    @RabbitListener(queues = "hello") //监听 名称为 hello 的queue
    public class HelloReceiver
    
        //消息处理器
        @RabbitHandler
        public void process(String message){
            System.out.println("Receiver:"+message);
    
        }
    
    
    }

    测试

    package com.example.rabbitmqdemo;
    
    import com.example.rabbitmqdemo.rabbitmq.HelloSender;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class RabbitmqdemoApplicationTests
    
        @Autowired
        HelloSender helloSender;
    
        @Test
        public void contextLoads() {
            helloSender.send();
    
        }
    }

    查看控制台输出结果

    send:hello----2018-04-21T11:29:47.739
    Receiver:hello----2018-04-21T11:29:47.739

    一对多发送:一个发送者多个接受者

    对上面的代码进行了小改造,接收端注册了两个Receiver,Receiver1和Receiver2,发送端加入参数计数,接收端打印接收到的参数,下面是测试代码,发送一百条消息,来观察两个接收端的执行效果

    • 添加一个队列叫 hello2

    package com.example.rabbitmqdemo.config;
    
    
    import org.springframework.amqp.core.Queue;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * RabbitMQ 配置类
     *
     * @author itguang
     * @create
    @Configuration
    public class RabbitConfig
    
    
    
        @Bean
        public Queue queue(){
            return new Queue("hello");
        }
    
        @Bean
        public Queue queue2(){
            return new Queue("hello2");
        }
    
    
    
    }
    • 给队列 hello2 发送消息,接受一个计数参数

    package com.example.rabbitmqdemo.rabbitmq;
    
    import org.springframework.amqp.core.AmqpTemplate;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    import java.time.LocalDate;
    import java.time.LocalDateTime;
    import java.time.LocalTime;
    import java.util.Date;
    
    /**
     * 消息发送者
     *
     * @author itguang
     * @create
    
    @Component
    public class HelloSender
    
    
        @Autowired
        private AmqpTemplate amqpTemplate;
    
    
        public void send(){
            String context = "hello----"+LocalDateTime.now();
            System.out.println("send:"+context);
            this.amqpTemplate.convertAndSend("hello",context);
        }
    
        //给hello2发送消息,并接受一个计数参数
        public void send2(int i){
            String context = i+"";
            System.out.println(context+"--send:");
            this.amqpTemplate.convertAndSend("hello2",context);
        }
    }
    • 两个hello2 的接受者

    @Component
    @RabbitListener(queues = "hello2")
    public class HelloReceiver1
    
    
        @RabbitHandler
        public void process(String message){
    
            System.out.println("Receiver1:"+message);
        }
    
    
    }
    @Component
    @RabbitListener(queues = "hello2")
    public class HelloReceiver2
    
        @RabbitHandler
        public void process(String message){
            System.out.println("Receiver2:"+message);
        }
    }

    测试

    @Test
        public void manyReceiver(){
            for (int i=0;i<100;i++){
                helloSender.send2(i);
            }
    
        }

    查看控制台输出结果:

    0--send:
    1--send:
    2--send:
    3--send:
    4--send:
    
    ...(省略)
    
    58--send:
    59--send:
    60--send:
    61--send:
    62--send:
    63--send:
    Receiver2:1
    Receiver1:0
    64--send:
    65--send:
    Receiver1:2
    Receiver2:3
    66--send:
    Receiver1:4
    Receiver2:5
    ...(省略)

    可以看到:在消息发送到63时,接受者Receiver已经收到了消息,
    结论:

    一个发送者,N个接受者,经过测试会均匀的将消息发送到N个接收者中

    多对多: 多个发送者对多个接受者

    我们可以注入两个发送者,放在循环中,如下:

    @Test
        public void many2many(){
          for (int i=0;i<100;i++){
              helloSender.send2(i);
              helloSender2.send2(i);
    
          }
        }

    运行单元测试,查看控制台输出:

    0--send:
    0--send:
    1--send:
    1--send:
    2--send:
    2--send:
    3--send:
    3--send:
    
    ...(省略)
    
    22--send:
    22--send:
    23--send:
    23--send:
    24--send:
    24--send:
    Receiver2:0
    25--send:
    25--send:
    Receiver2:1
    26--send:
    Receiver2:2
    26--send:
    Receiver2:3
    27--send:
    Receiver1:0
    27--send:
    Receiver2:4
    Receiver1:1
    28--send:
    Receiver2:5
    Receiver1:2
    28--send:
    Receiver2:6
    Receiver1:3
    29--send:
    Receiver2:7
    Receiver1:4
    29--send:
    Receiver2:8
    Receiver1:5
    30--send:
    Receiver2:9
    Receiver1:6
    30--send:
    31--send:
    31--send:
    32--send:
    32--send:

    结论:和一对多一样,接收端仍然会均匀接收到消息

    发送对象

    首先我们创建一个实体类对象 User,注意必须实现 Serializable 接口.

    package com.example.rabbitmqdemo.pojo;
    
    import java.io.Serializable;
    
    /**
     * @author itguang
     * @create
    public class User implements Serializable
    
    
        private String username;
        private String password;
    
        public User(String username, String password) {
            this.username = username;
            this.password = password;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "username='" + username + '\'' +
                    ", password='" + password + '\'' +
                    '}';
        }
    }

    然后在配置文件中再创建一个队列,叫 object_queue

    @Bean
        public Queue queue3(){
            return new Queue("object_queue");
        }

    接下里就是User对象的两个发送者ObjectSender和接受者ObjectReceiver:

    @Component
    public class ObjectSender
    
        @Autowired
        AmqpTemplate amqpTemplate;
    
        public void sendUser(User user){
    
            System.out.println("Send object:"+user.toString());
            this.amqpTemplate.convertAndSend("object_queue",user);
    
        }
    }
    @Component
    @RabbitListener(queues = "object_queue")
    public class ObjectReceiver
    
        @RabbitHandler
        public void objectReceiver(User user){
    
            System.out.println("Receiver object:"+user.toString());
    
        }
    }

    运行单元测试,查看控制台输出结果:

    Send object:User{username='李增光', password='666666'}
    Receiver object:User{username='李增光', password='666666'}

    Topic Exchange

    topic 是RabbitMQ中最灵活的一种方式,可以根据routing_key自由的绑定不同的队列

    首先对topic规则配置,这里使用两个队列来测试

    package com.example.rabbitmqdemo.config;
    
    import org.springframework.amqp.core.Binding;
    import org.springframework.amqp.core.BindingBuilder;
    import org.springframework.amqp.core.Queue;
    import org.springframework.amqp.core.TopicExchange;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * @author itguang
     * @create
    @Configuration
    public class TopicRabbitConfig
    
    
        final static String message = "topic.message";
        final static String messages = "topic.messages";
    
    
        //创建两个 Queue
        @Bean
        public Queue queueMessage(){
            return new Queue(TopicRabbitConfig.message);
        }
    
        @Bean
        public Queue queueMessages(){
            return new Queue(TopicRabbitConfig.messages);
        }
    
        //配置 TopicExchange,指定名称为 topicExchange
        @Bean
        public TopicExchange exchange(){
            return new TopicExchange("topicExchange");
        }
    
        //给队列绑定 exchange 和 routing_key
    
        @Bean
        public Binding bindingExchangeMessage(Queue queueMessage, TopicExchange exchange){
            return BindingBuilder.bind(queueMessage).to(exchange).with("topic.message");
        }
    
        @Bean
        public Binding bingingExchangeMessages(Queue queueMessages,TopicExchange exchange){
            return BindingBuilder.bind(queueMessages).to(exchange).with("topic.#");
        }
    
    
    }

    消息发送者:都是用topicExchange,并且绑定到不同的 routing_key

    package com.example.rabbitmqdemo.topic;
    
    import org.springframework.amqp.core.AmqpTemplate;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    /**
     * @author itguang
     * @create
    @Component
    public class TopicSender
    
        @Autowired
        AmqpTemplate amqpTemplate;
    
        public void send1(){
            String context = "hi, i am message 1";
            System.out.println("Sender : " + context);
            amqpTemplate.convertAndSend("topicExchange","topic.message",context);
        }
    
        public void send2() {
            String context = "hi, i am messages 2";
            System.out.println("Sender : " + context);
            amqpTemplate.convertAndSend("topicExchange", "topic.messages", context);
        }
    }

    两个消息接受者,分别指定不同的 queue

    package com.example.rabbitmqdemo.topic;
    
    import org.springframework.amqp.rabbit.annotation.RabbitHandler;
    import org.springframework.amqp.rabbit.annotation.RabbitListener;
    import org.springframework.stereotype.Component;
    
    /**
     * @author itguang
     * @create
    @Component
    @RabbitListener(queues = "topic.message")
    public class TopicReceiver1
    
        @RabbitHandler
        public void process(String message){
    
            System.out.println("Receiver topic.message :"+ message);
    
        }
    
    }
    package com.example.rabbitmqdemo.topic;
    
    import org.springframework.amqp.rabbit.annotation.RabbitHandler;
    import org.springframework.amqp.rabbit.annotation.RabbitListener;
    import org.springframework.stereotype.Component;
    
    /**
     * @author itguang
     * @create
    @Component
    @RabbitListener(queues = "topic.messages")
    public class TopicReceiver2
    
        @RabbitHandler
        public void process(String message){
    
            System.out.println("Receiver topic.messages: "+ message);
    
        }
    
    }

    测试:

    发送send1会匹配到topic.#和topic.message 两个Receiver都可以收到消息,发送send2只有topic.#可以匹配所有只有Receiver2监听到消息

    Fanout Exchange

    Fanout 就是我们熟悉的广播模式或者订阅模式,给Fanout交换机发送消息,绑定了这个交换机的所有队列都收到这个消息。

    Fanout 相关配置:

    package com.example.rabbitmqdemo.config;
    
    import org.springframework.amqp.core.Binding;
    import org.springframework.amqp.core.BindingBuilder;
    import org.springframework.amqp.core.FanoutExchange;
    import org.springframework.amqp.core.Queue;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import java.security.PublicKey;
    
    /**
     * @author itguang
     * @create
    @Configuration
    public class FanOutRabbitMq
    
    
        //创建三个队列
    
        @Bean
        public Queue AMessage() {
            return new Queue("fanout.A");
        }
    
        @Bean
        public Queue BMessage() {
            return new Queue("fanout.B");
        }
    
        @Bean
        public Queue CMessage() {
            return new Queue("fanout.C");
        }
    
    
        //创建exchange,指定交换策略
    
        @Bean
        public FanoutExchange fanoutExchange() {
    
            return new FanoutExchange("fanoutExchange");
        }
    
    
        //分别给三个队列指定exchange,这里使用了A、B、C三个队列绑定到Fanout交换机上面,发送端的routing_key写任何字符都会被忽略:
    
        @Bean
        public Binding bindingExchangeA(Queue AMessage,FanoutExchange fanoutExchange){
            return BindingBuilder.bind(AMessage).to(fanoutExchange);
    
        }
    
        @Bean
        public Binding bindingExchangeB(Queue BMessage,FanoutExchange fanoutExchange){
            return BindingBuilder.bind(BMessage).to(fanoutExchange);
    
        }
    
        @Bean
        Binding bindingExchangeC(Queue CMessage, FanoutExchange fanoutExchange) {
            return

    消息发送者:

    这里使用了A、B、C三个队列绑定到Fanout交换机上面,发送端的routing_key写任何字符都会被忽略

    package com.example.rabbitmqdemo.fanout;
    
    import org.springframework.amqp.core.AmqpTemplate;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    /**
     * @author itguang
     * @create
    @Component
    public class FanoutSender
    
    
        @Autowired
        AmqpTemplate amqpTemplate;
    
    
        public void send(){
    
            String context = "hi, fanout msg ";
            System.out.println("Sender : " + context);
            //这里使用了A、B、C三个队列绑定到Fanout交换机上面,发送端的routing_key写任何字符都会被忽略:
            amqpTemplate.convertAndSend("fanoutExchange","", context);
    
        }
    
    }

    三个消息接受者:

    @Component
    @RabbitListener(queues = "fanout.A")
    public class FanoutReceiverA
    
    
        @RabbitHandler
        public void process(String message){
    
            System.out.println("Receiver form fanout.A: "+message);
    
        }
    
    }
    
    @Component
    @RabbitListener(queues = "fanout.B")
    public class FanoutReceiverB
    
    
        @RabbitHandler
        public void process(String message){
    
            System.out.println("Receiver form fanout.B: "+message);
    
        }
    
    }
    
    @Component
    @RabbitListener(queues = "fanout.C")
    public class FanoutReceiverC
    
    
        @RabbitHandler
        public void process(String message){
    
            System.out.println("Receiver form fanout.C: "+message);
    
        }
    
    }

    运行单元测试,查看结果:

    Sender : hi, fanout msg 
    
    Receiver form fanout.C: hi, fanout msg 
    Receiver form fanout.A: hi, fanout msg 
    Receiver form fanout.B: hi, fanout msg

    结果说明,绑定到fanout交换机上面的队列都收到了消息.

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    RabbitMQ Fanout Exchange 多消费者正确实现指南
    RabbitMQ Fanout Exchange 多消费者正确实现指南

    在Go中使用RabbitMQFanoutExchange时,多个消费者需同时接收消息。正确做法是声明fanout类型交换器,并为每个消费者创建独立队列并绑定到该交换器,确保交换器类型正确、队列名唯一,RabbitMQ会将消息广播至所有绑定队列,实现一对多分发。

    Centos 6.4 安装erlang&rabbitmq的方法
    Centos 6.4 安装erlang&rabbitmq的方法

    在开始搭建消息队列服务之前,得先搞定两个核心组件:Erlang 和 RabbitMQ。Erlang 是 RabbitMQ 的运行时环境,所以顺序不能乱——先装 Erlang,再装 RabbitMQ。下面把整个过程拆开来讲,每一步都配了具体的命令,照着走基本不会出错。 1. 安装 Erlang 1.1

    Symfony 将RabbitMQ消息转为数组方法
    Symfony 将RabbitMQ消息转为数组方法

    答案:将Symfony中RabbitMQ消息转为数组需根据消息体格式选择反序列化方式,常见为JSON或PHP序列化;若为JSON,使用json_decode($messageBody,true)转换并校验错误;若为PHP序列化,使用unserialize()但需注意安全风险;其他格式则用对应解析器;若消息封装在对象中,需先提取消息体。

    Python RabbitMQ教程:消息队列入门指南
    Python RabbitMQ教程:消息队列入门指南

    Python操作RabbitMQ的关键在于理解其消息队列流程和工作机制,安装pika库后即可通过简单步骤实现消息发送与接收。首先需安装pika:pipinstallpika,并确保RabbitMQ服务运行;其次,发送消息时需建立连接、打开通道、声明队列并发送消息;接着,接收消息时需监听队列、定义回调函数处理消息,并注意确认机制与连接关闭;此外,实际应用中应关注异常处理、消息持久化、多消费者支持及死信队列等特性以提升系统健壮性。掌握这些步骤和注意事项后,Python结合RabbitMQ的基础操作便能快速上手

    PHP实战:RabbitMQ消息队列详解
    PHP实战:RabbitMQ消息队列详解

    PHP结合RabbitMQ构建异步处理系统需安装RabbitMQ和AMQP扩展1,通过AMQP类连接服务器2,声明交换机和队列并绑定路由键3,使用publish方法发布消息4,利用consume消费消息并调用ack确认5,为避免消息丢失应启用持久化、发布者确认或事务机制6,可通过RabbitMQManagementPlugin、命令行工具或Prometheus+Grafana监控性能7,配置死信队列处理无法消费的消息8,保证消息顺序可通过单消费者、单一队列或分组排序等策略实现9。

    springBoot项目常用目录有哪些
    springBoot项目常用目录有哪些

    springBoot项目常用目录springBoot项目的目录结构及名规范介绍基于SpringBoot开发时的目录结构及命名规范,通过介绍能够为你解决,在实际项目中如何规划目录结构?如何命名目录更规范?各个目录分别代表什么含义?等三个问题。目录说明servicex//项目名|-admin-ui//管理服务前端代码(一般将UI和SERVICE放到一个工程中,便于管理)|-servicex-auth//模块1|-servicex-common//模块2|-servicex-gateway//模块3|-serv

    学习如何安装、配置、部署和使用宝塔面板中的RabbitMQ可视化工具
    学习如何安装、配置、部署和使用宝塔面板中的RabbitMQ可视化工具

    RabbitMQ是一款开源的消息代理和队列服务器,旨在通过通用协议实现不同应用之间的数据共享,实现跨平台和跨语言的通信。该系统采用Erlang语言编写,并基于AMQP协议。其最显著的特点之一是在提供高度解耦的服务之间无需确保提供方的存在。接下来介绍关于如何在宝塔面板上可视化安装、配置、部署、使用RabbitMQ。一、RabbitMQ的特点1.可靠性RabbitMQ通过诸如持久化、传输确认和发布确认等机制来确保消息的可靠性。2.灵活的路由消息在进入队列之前通过交换器进行路由,可按照特定规则进行灵活分发。3.

    PHP开发中如何使用RabbitMQ实现消息传递
    PHP开发中如何使用RabbitMQ实现消息传递

    RabbitMQ是一种消息队列软件,可用于在应用程序之间进行消息传递。在PHP开发中,使用RabbitMQ可以实现异步处理任务、实现分布式系统等。本篇文章将介绍如何在PHP开发中使用RabbitMQ实现消息传递。一、安装RabbitMQ服务RabbitMQ是开源软件,可从其官网(https://www.rabbitmq.com/download.html)下

    PHP与RabbitMQ结合实现消息队列处理和分发的方法
    PHP与RabbitMQ结合实现消息队列处理和分发的方法

    随着互联网业务的不断发展,系统间的数据交换变得越来越频繁。在传统的请求响应式架构中,数据传递的方式往往是同步的,即等待请求响应结果后才能进行下一步操作,当数据量较大或者请求响应时间较长时,这种方式往往会导致系统性能下降。此时,消息队列就成为一种比较理想的解决方案,可以实现异步、解耦、扩展性好等优点。RabbitMQ作为一款消息队列中间件,提供了丰富的API,

    比较RabbitMQ和Kafka:如何选择高效的消息中间件
    比较RabbitMQ和Kafka:如何选择高效的消息中间件

    RabbitMQ和Kafka的比较:选择高效的消息中间件简介消息中间件是一种软件,它允许应用程序通过异步消息传递进行通信。消息中间件可以用于各种目的,包括:解耦应用程序:消息中间件可以将应用程序解耦,使它们能够独立于彼此开发和部署。提高可伸缩性:消息中间件可以帮助应用程序提高可伸缩性,使它们能够处理更多的并发请求。提高可靠性:消息中间件可以帮助应用程序提高可

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。