首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >JavaCV的摄像头实战之七:推流(带声音)

JavaCV的摄像头实战之七:推流(带声音)

作者头像
程序员欣宸
发布于 2021-12-07 02:06:14
发布于 2021-12-07 02:06:14
2.1K0
举报
文章被收录于专栏:实战docker实战docker

本篇概览

  • 本文是《JavaCV的摄像头实战》的第七篇,在《JavaCV的摄像头实战之五:推流》一文中,咱们将摄像头的内容推送到媒体服务器,再用VLC成功播放,相信聪明的您一定觉察到了一缕瑕疵:没有声音
  • 虽然《JavaCV的摄像头实战》系列的主题是摄像头处理,但显然音视频健全才是最常见的情况,因此就在本篇补全前文的不足吧:编码实现摄像头和麦克风的推流,并验证可以成功远程播放音视频

关于音频的采集和录制

  • 本篇的代码是在《JavaCV的摄像头实战之五:推流》源码的基础上增加音频处理部分
  • 编码前,咱们先来分析一下,增加音频处理后具体的代码逻辑会有哪些变化
  • 只保存视频的操作,与保存音频相比,步骤的区别如下图所示,深色块就是新增的操作:
  • 相对的,在应用结束时,释放所有资源的时候,音视频的操作也比只有视频时要多一些,如下图所示,深色就是释放音频相关资源的操作:
  • 为了让代码简洁一些,我将音频相关的处理都放在名为AudioService的类中,也就是说上面两幅图的深色部分的代码都在AudioService.java中,主程序使用此类来完成音频处理
  • 接下来开始编码

开发音频处理类AudioService

  • 首先是刚才提到的AudioService.java,主要内容就是前面图中深色块的功能,有几处要注意的地方稍后会提到:
代码语言:javascript
AI代码解释
复制
package com.bolingcavalry.grabpush.extend;

import lombok.extern.slf4j.Slf4j;
import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.FrameRecorder;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.TargetDataLine;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.ShortBuffer;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author willzhao
 * @version 1.0
 * @description 音频相关的服务
 * @date 2021/12/3 8:09
 */
@Slf4j
public class AudioService {

    // 采样率
    private final static int SAMPLE_RATE = 44100;

    // 音频通道数,2表示立体声
    private final static int CHANNEL_NUM = 2;

    // 帧录制器
    private FFmpegFrameRecorder recorder;

    // 定时器
    private ScheduledThreadPoolExecutor sampleTask;

    // 目标数据线,音频数据从这里获取
    private TargetDataLine line;

    // 该数组用于保存从数据线中取得的音频数据
    byte[] audioBytes;

    // 定时任务的线程中会读此变量,而改变此变量的值是在主线程中,因此要用volatile保持可见性
    private volatile boolean isFinish = false;

    /**
     * 帧录制器的音频参数设置
     * @param recorder
     * @throws Exception
     */
    public void setRecorderParams(FrameRecorder recorder) throws Exception {
        this.recorder = (FFmpegFrameRecorder)recorder;

        // 码率恒定
        recorder.setAudioOption("crf", "0");
        // 最高音质
        recorder.setAudioQuality(0);
        // 192 Kbps
        recorder.setAudioBitrate(192000);

        // 采样率
        recorder.setSampleRate(SAMPLE_RATE);

        // 立体声
        recorder.setAudioChannels(2);
        // 编码器
        recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);
    }

    /**
     * 音频采样对象的初始化
     * @throws Exception
     */
    public void initSampleService() throws Exception {
        // 音频格式的参数
        AudioFormat audioFormat = new AudioFormat(SAMPLE_RATE, 16, CHANNEL_NUM, true, false);

        // 获取数据线所需的参数
        DataLine.Info dataLineInfo = new DataLine.Info(TargetDataLine.class, audioFormat);

        // 从音频捕获设备取得其数据的数据线,之后的音频数据就从该数据线中获取
        line = (TargetDataLine)AudioSystem.getLine(dataLineInfo);

        line.open(audioFormat);

        // 数据线与音频数据的IO建立联系
        line.start();

        // 每次取得的原始数据大小
        final int audioBufferSize = SAMPLE_RATE * CHANNEL_NUM;

        // 初始化数组,用于暂存原始音频采样数据
        audioBytes = new byte[audioBufferSize];

        // 创建一个定时任务,任务的内容是定时做音频采样,再把采样数据交给帧录制器处理
        sampleTask = new ScheduledThreadPoolExecutor(1);
    }

    /**
     * 程序结束前,释放音频相关的资源
     */
    public void releaseOutputResource() {
        // 结束的标志,避免采样的代码在whlie循环中不退出
        isFinish = true;
        // 结束定时任务
        sampleTask.shutdown();
        // 停止数据线
        line.stop();
        // 关闭数据线
        line.close();
    }

    /**
     * 启动定时任务,每秒执行一次,采集音频数据给帧录制器
     * @param frameRate
     */
    public void startSample(double frameRate) {

        // 启动定时任务,每秒执行一次,采集音频数据给帧录制器
        sampleTask.scheduleAtFixedRate((Runnable) new Runnable() {
            @Override
            public void run() {
                try
                {
                    int nBytesRead = 0;

                    while (nBytesRead == 0 && !isFinish) {
                        // 音频数据是从数据线中取得的
                        nBytesRead = line.read(audioBytes, 0, line.available());
                    }

                    // 如果nBytesRead<1,表示isFinish标志被设置true,此时该结束了
                    if (nBytesRead<1) {
                        return;
                    }

                    // 采样数据是16比特,也就是2字节,对应的数据类型就是short,
                    // 所以准备一个short数组来接受原始的byte数组数据
                    // short是2字节,所以数组长度就是byte数组长度的二分之一
                    int nSamplesRead = nBytesRead / 2;
                    short[] samples = new short[nSamplesRead];

                    // 两个byte放入一个short中的时候,谁在前谁在后?这里用LITTLE_ENDIAN指定拜访顺序,
                    ByteBuffer.wrap(audioBytes).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(samples);
                    // 将short数组转为ShortBuffer对象,因为帧录制器的入参需要该类型
                    ShortBuffer sBuff = ShortBuffer.wrap(samples, 0, nSamplesRead);

                    // 音频帧交给帧录制器输出
                    recorder.recordSamples(SAMPLE_RATE, CHANNEL_NUM, sBuff);
                }
                catch (FrameRecorder.Exception e) {
                    e.printStackTrace();
                }
            }
        }, 0, 1000 / (long)frameRate, TimeUnit.MILLISECONDS);
    }
}
  • 上述代码中,有两处要注意:
  1. 重点关注recorder.recordSamples,该方法将音频存入了mp4文件
  2. 定时任务是在一个新线程中执行的,因此当主线程结束录制后,需要中断定时任务中的while循环,因此新增了volatile类型的变量isFinish,帮助定时任务中的代码判断是否立即结束while循环

改造原本推流时只推视频的代码

  • 接着是对《JavaCV的摄像头实战之五:推流》一文中RecordCamera.java的改造,为了不影响之前章节在github上的代码,这里我新增了一个类RecordCameraWithAudio.java,内容与RecordCamera.java一模一样,接下来咱们来改造这个RecordCameraWithAudio类
  • 先增加AudioService类型的成员变量:
代码语言:javascript
AI代码解释
复制
	// 音频服务类
    private AudioService audioService = new AudioService();
  • 接下来是关键,initOutput方法负责帧录制器的初始化,现在要加上音频相关的初始化操作,并且还要启动定时任务去采集和处理音频,如下所示,AudioService的三个方法都在此调用了,注意定时任务的启动要放在帧录制器初始化之后:
代码语言:javascript
AI代码解释
复制
    @Override
    protected void initOutput() throws Exception {
        // 实例化FFmpegFrameRecorder,将SRS的推送地址传入
        recorder = FrameRecorder.createDefault(RECORD_ADDRESS, getCameraImageWidth(), getCameraImageHeight());

        // 降低启动时的延时,参考
        // https://trac.ffmpeg.org/wiki/StreamingGuide)
        recorder.setVideoOption("tune", "zerolatency");
        // 在视频质量和编码速度之间选择适合自己的方案,包括这些选项:
        // ultrafast,superfast, veryfast, faster, fast, medium, slow, slower, veryslow
        // ultrafast offers us the least amount of compression (lower encoder
        // CPU) at the cost of a larger stream size
        // at the other end, veryslow provides the best compression (high
        // encoder CPU) while lowering the stream size
        // (see: https://trac.ffmpeg.org/wiki/Encode/H.264)
        // ultrafast对CPU消耗最低
        recorder.setVideoOption("preset", "ultrafast");
        // Constant Rate Factor (see: https://trac.ffmpeg.org/wiki/Encode/H.264)
        recorder.setVideoOption("crf", "28");
        // 2000 kb/s, reasonable "sane" area for 720
        recorder.setVideoBitrate(2000000);

        // 设置编码格式
        recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);

        // 设置封装格式
        recorder.setFormat("flv");

        // FPS (frames per second)
        // 一秒内的帧数
        recorder.setFrameRate(getFrameRate());
        // Key frame interval, in our case every 2 seconds -> 30 (fps) * 2 = 60
        // 关键帧间隔
        recorder.setGopSize((int)getFrameRate()*2);

        // 设置帧录制器的音频相关参数
        audioService.setRecorderParams(recorder);

        // 音频采样相关的初始化操作
        audioService.initSampleService();

        // 帧录制器开始初始化
        recorder.start();

        // 启动定时任务,采集音频帧给帧录制器
        audioService.startSample(getFrameRate());
    }
  • output方法保存原样,只处理视频帧(音频处理在定时任务中)
代码语言:javascript
AI代码解释
复制
    @Override
    protected void output(Frame frame) throws Exception {
        if (0L==startRecordTime) {
            startRecordTime = System.currentTimeMillis();
        }

        // 时间戳
        recorder.setTimestamp(1000 * (System.currentTimeMillis()-startRecordTime));

        // 存盘
        recorder.record(frame);
    }
  • 释放资源的方法中,增加了音频资源释放的操作:
代码语言:javascript
AI代码解释
复制
    @Override
    protected void releaseOutputResource() throws Exception {
        // 执行音频服务的资源释放操作
        audioService.releaseOutputResource();

        // 关闭帧录制器
        recorder.close();
    }
  • 至此,将摄像头视频和麦克风音频推送到媒体服务器的功能已开发完成,再写上main方法,表示推流十分钟:
代码语言:javascript
AI代码解释
复制
    public static void main(String[] args) {
        new RecordCameraWithAudio().action(600);
    }
  • 运行main方法,等到控制台输出下图红框的内容时,表示正在推送中:
  • 在另一台电脑上用VLC软件打开刚才推流的地址rtmp://192.168.50.43:21935/hls/camera,稍等几秒钟后开始正常播放,图像声音都正常(注意不能用当前电脑播放,否则麦克风采集的是VLC播放的声音了):
  • 用VLC自带的工具查看媒体流信息,如下图,可见视频流和音频流都能正常识别:
  • 打开媒体服务器自身的监控页面,如下图,可以看到各项实时数据:
  • 至此,咱们已完成了音视频推流的功能,(有点像直播的样子了),得益于JavaCV的强大,整个过程是如此的轻松愉快,接下来请继续关注欣宸原创,《JavaCV的摄像头实战》系列还会呈现更多丰富的应用;

源码下载

  • 《JavaCV的摄像头实战》的完整源码可在GitHub下载到,地址和链接信息如下表所示(https://github.com/zq2599/blog_demos):

名称

链接

备注

项目主页

https://github.com/zq2599/blog_demos

该项目在GitHub上的主页

git仓库地址(https)

https://github.com/zq2599/blog_demos.git

该项目源码的仓库地址,https协议

git仓库地址(ssh)

git@github.com:zq2599/blog_demos.git

该项目源码的仓库地址,ssh协议

  • 这个git项目中有多个文件夹,本篇的源码在javacv-tutorials文件夹下,如下图红框所示:
  • javacv-tutorials里面有多个子工程,《JavaCV的摄像头实战》系列的代码在simple-grab-push工程下:
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/12/04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
基于RAG与多模态融合的短视频生成挑战:AI短视频工具-内容特工队AI(ReelsAgent)开发者实践分享
大家好,我是从事AI内容工具开发的独立开发者,最近几个月一直在折腾短视频生成相关的项目。2025年了,AI视频工具层出不穷,但真正落地到生产环境时,总会遇到一些棘手的点,尤其是当你试图将RAG(Retrieval-Augmented Generation)机制融入多模态生成流程中时。分享一下我的实践心得,希望能和社区的各位交流交流,避免踩坑。先说背景:我的项目是针对营销场景的短视频自动化生成,核心需求是输入简单文本提示,就能输出包含数字人讲解、背景音乐和字幕的完整片段。灵感来源于 之前热门AGENT的文章,那里面提到的MANUS Agent功能让我眼前一亮——它用半自定义Agent来组装工作流,避免了纯文本提示的泛化问题。但在实际集成时,我发现RAG的知识检索层和视频渲染层对接起来,并不是一帆风顺。
Yoboy
2025/11/06
2020
【机器学习】机器学习与大模型在人工智能领域的融合应用与性能优化新探索
随着计算能力的不断提升和数据规模的爆炸性增长,机器学习和大模型在人工智能(AI)领域的应用变得越来越广泛和深入。尤其是大规模机器学习模型,如深度神经网络(如GPT-3、BERT等),在自然语言处理、图像识别、语音识别等方面展现了卓越的性能。然而,如何有效地融合机器学习与大模型,提升其应用性能,仍然是当前研究和应用中的重要课题。本文将探讨机器学习与大模型在人工智能领域的融合应用,并重点讨论性能优化的新方法和新探索。
E绵绵
2024/06/04
1.1K0
【机器学习】机器学习与大模型在人工智能领域的融合应用与性能优化新探索
短视频平台内容推荐算法优化:从协同过滤到多模态深度学习
在抖音、快手、TikTok 等平台中,用户平均停留时长超过 60% 由推荐系统决定。一个优秀的推荐系统不仅要“猜你喜欢”,更要在冷启动、多样性、实时性、用户长期价值之间做出权衡。本文将深入探讨短视频推荐系统的核心算法演进,并给出一个基于多模态内容+用户行为序列的深度学习推荐模型的完整代码实现。
江南清风起
2025/09/16
3460
基于OpenAI Whisper AI模型自动生成视频字幕:全面解析与实战指南
在数字化时代,视频内容已成为信息传播的重要载体。然而,为视频添加字幕却是一项繁琐且耗时的工作。幸运的是,随着人工智能技术的飞速发展,特别是OpenAI Whisper模型的推出,我们有了更加高效、智能的解决方案。
小白的大数据之旅
2024/12/28
1.8K0
097_数字取证高级技术:AI生成内容检测与深度伪造识别实战指南——从特征提取到模型对抗的全面分析方法
随着人工智能技术的飞速发展,尤其是生成式AI模型如GPT-5、DALL-E 4、Midjourney V7等的出现,AI生成内容的质量和逼真度已经达到了前所未有的高度。这些技术在带来巨大便利的同时,也为数字取证和内容真实性验证带来了严峻挑战。深度伪造视频、AI生成的文章、图像和音频内容可以以假乱真,给信息安全、法律取证和社会信任带来了深远影响。
安全风信子
2025/11/16
4050
2025年高级视频理解技术:从分类到深度内容分析
2025年,视频理解技术已经成为计算机视觉领域的重要研究方向和应用热点。随着深度学习技术的飞速发展和大规模视频数据集的支持,视频理解技术已经从简单的视频分类演进到更复杂的动作识别、行为分析、视频内容理解和检索等高级任务。从智能安防到内容推荐,从自动驾驶到教育培训,视频理解技术正在各个领域发挥着越来越重要的作用。在Huggingface等平台上,各种先进的视频理解模型不断涌现,为开发者和企业提供了强大的视频分析工具。
安全风信子
2025/11/13
2670
2025年视频生成技术全景:从图像与文本到动态视觉内容
视频生成技术作为人工智能与计算机视觉的前沿交叉领域,正在经历前所未有的发展热潮。2025年,随着生成式AI技术的快速演进,基于图像和文本的视频生成技术已经取得了突破性进展,能够自动生成高质量、时序一致的视频内容,彻底改变了传统视频制作的工作流程。在Huggingface等平台上,各种先进的视频生成模型不断涌现,为内容创作、教育培训、游戏开发等领域提供了强大的工具支持。
安全风信子
2025/11/13
3740
103_隐写术进阶:视频隐写技术深度解析——从帧操作到多媒体流数据隐藏的完整指南
在数字隐写术的发展历程中,视频隐写作为一种高级数据隐藏技术,因其大容量、强隐蔽性和实时性特点而备受关注。与静态图像隐写相比,视频隐写利用了视频特有的时间维度和冗余特性,提供了更大的数据隐藏空间和更强的抗检测能力。本指南将深入剖析视频隐写的基本原理、核心技术和实现方法,并通过详细的Python代码示例,帮助读者全面掌握视频隐写的技术要点,从而在实际安全工作和多媒体数据保护中能够准确应用这一技术。
安全风信子
2025/11/16
1600
从零复现Google Veo 3:从数据预处理到视频生成的完整Python代码实现指南
Google Veo 3作为当前最先进的文本到视频生成系统,能够根据文本提示生成高质量、高分辨率的视频内容并同步生成音频。该系统在性能上已超越OpenAI SORA等同类模型,代表了视频生成领域的最新技术水平。
deephub
2025/08/20
5150
从零复现Google Veo 3:从数据预处理到视频生成的完整Python代码实现指南
音视频处理新纪元-12款AI模型的语音转录和视频理解能力横评
🌟 Hello,我是摘星!🌈 在彩虹般绚烂的技术栈中,我是那个永不停歇的色彩收集者。🦋 每一个优化都是我培育的花朵,每一个特性都是我放飞的蝴蝶。🔬 每一次代码审查都是我的显微镜观察,每一次重构都是我的化学实验。🎵 在编程的交响乐中,我既是指挥家也是演奏者。让我们一起,在技术的音乐厅里,奏响属于程序员的华美乐章。
摘星.
2025/08/13
4060
音视频处理新纪元-12款AI模型的语音转录和视频理解能力横评
手把手实现火爆全网的视频特效 “蚂蚁呀嘿”,太魔性了
让一张照片动起来,人脸跟着音乐一起挤眉弄眼,需要一个叫做一阶运动模型 (First Order Motion Model)来搞定。
AI算法与图像处理
2021/03/14
1.1K0
跨越边界的 AI 变革:揭秘 Gemini 2.5 Pro 如何颠覆传统智能应用
谷歌,一家以搜索引擎起家的科技巨头,早在2000年代就开始投身于人工智能领域。从最初的自动翻译服务到如今的尖端人工智能技术,谷歌在AI发展史上占据了举足轻重的地位。其研究成果不仅为公司带来了巨大的商业回报,也推动了全球人工智能技术的快速进步。
云边有个稻草人
2025/04/25
4660
内容创作智能体:多模态内容生成的完整解决方案
🚀 每一次编译都是新的征程,每一个bug都是未解的谜题。让我们携手,在0和1的星河中,书写属于开发者的浪漫诗篇。
摘星.
2025/07/20
3230
内容创作智能体:多模态内容生成的完整解决方案
基于大模型的多模态数据融合实战应用
多模态数据融合是当前人工智能(AI)研究的热门领域,涉及文本、图像、音频、视频等多种数据类型的集成。随着大型语言模型(LLM)和多模态大模型(如GPT-4V、BLIP-2、Flamingo等)的发展,AI 在处理多模态数据的能力得到极大提升。本文将探讨基于大模型的多模态数据融合方法,并通过 Python 代码示例演示如何构建多模态应用。
一键难忘
2025/03/03
2.6K1
使用CLIP构建视频搜索引擎
CLIP(Contrastive Language-Image Pre-training)是一种机器学习技术,它可以准确理解和分类图像和自然语言文本,这对图像和语言处理具有深远的影响,并且已经被用作流行的扩散模型DALL-E的底层机制。在这篇文章中,我们将介绍如何调整CLIP来辅助视频搜索。
deephub
2023/02/01
1.1K0
智能金融风控中的大模型实践_03
金融风控作为金融行业的核心环节,直接关系到金融机构的资产安全和系统稳定性。传统风控模式面临诸多挑战:人工审核效率低下,单案例平均处理时间长达4-6小时;规则引擎灵活性不足,难以应对新型欺诈手段;数据利用率有限,无法充分挖掘非结构化数据价值;风险识别滞后,往往在损失发生后才采取措施。据统计,全球金融机构每年因欺诈造成的损失超过2800亿美元,传统风控手段的漏报率高达15-20%1。
安全风信子
2025/11/12
2440
多模态RAG应用之实现文本检索视频内容
现如今无论是谷歌百度搜索知识学习,还是淘宝京东购物都离不开文字关键词的搜索。但现在很多平台或者应用有大量的视频,还有某些跟视频打交道的应用比如视频编辑器,视频自动化处理工具等,这些工具如果只有简单的文本搜索就远远不够用了,搜索体验肯定会大打折扣;由此引出我们今天的主题:
郑子铭
2025/01/07
4860
多模态RAG应用之实现文本检索视频内容
人工智能,应该如何测试?(一)基础效果篇(内含大模型的测试内容)
这个系列算是科普文吧,尤其这第一篇可能会比较长,因为我这 8 年里一直在 AI 领域里做测试,涉及到的场景有些多, 我希望能尽量把我经历过的东西都介绍一下,算是给大家科普一下我们这些在 AI 领域内做测试的人,每天都在做什么事情。 当然 AI 领域很庞杂,我涉及到的可能也仅仅是一小部分,这篇帖子算是抛砖引玉,欢迎大家一起来讨论。
霍格沃兹测试开发Muller老师
2024/04/07
1.8K0
【机器学习】大模型在机器学习中的应用:从深度学习到生成式人工智能的演进
大模型在深度学习中的应用已经变得日益广泛和深入,其庞大的参数规模和复杂的结构赋予了其强大的数据处理和学习能力,为深度学习领域的多个任务提供了有效的解决方案。
E绵绵
2024/05/26
1.1K0
【机器学习】大模型在机器学习中的应用:从深度学习到生成式人工智能的演进
智能金融风控中的大模型实践_01
金融风控是金融行业的核心竞争力之一,直接关系到金融机构的资产安全和稳健运营。随着金融业务的快速发展和金融创新的不断涌现,传统的风控模式面临着越来越多的挑战,如数据规模爆炸、风险形式复杂多样、欺诈手段不断升级等。在这种背景下,人工智能(AI)技术,特别是大语言模型(LLM)和深度学习技术,正在为金融风控带来革命性的变革。
安全风信子
2025/11/13
3160
推荐阅读
基于RAG与多模态融合的短视频生成挑战:AI短视频工具-内容特工队AI(ReelsAgent)开发者实践分享
2020
【机器学习】机器学习与大模型在人工智能领域的融合应用与性能优化新探索
1.1K0
短视频平台内容推荐算法优化:从协同过滤到多模态深度学习
3460
基于OpenAI Whisper AI模型自动生成视频字幕:全面解析与实战指南
1.8K0
097_数字取证高级技术:AI生成内容检测与深度伪造识别实战指南——从特征提取到模型对抗的全面分析方法
4050
2025年高级视频理解技术:从分类到深度内容分析
2670
2025年视频生成技术全景:从图像与文本到动态视觉内容
3740
103_隐写术进阶:视频隐写技术深度解析——从帧操作到多媒体流数据隐藏的完整指南
1600
从零复现Google Veo 3:从数据预处理到视频生成的完整Python代码实现指南
5150
音视频处理新纪元-12款AI模型的语音转录和视频理解能力横评
4060
手把手实现火爆全网的视频特效 “蚂蚁呀嘿”,太魔性了
1.1K0
跨越边界的 AI 变革:揭秘 Gemini 2.5 Pro 如何颠覆传统智能应用
4660
内容创作智能体:多模态内容生成的完整解决方案
3230
基于大模型的多模态数据融合实战应用
2.6K1
使用CLIP构建视频搜索引擎
1.1K0
智能金融风控中的大模型实践_03
2440
多模态RAG应用之实现文本检索视频内容
4860
人工智能,应该如何测试?(一)基础效果篇(内含大模型的测试内容)
1.8K0
【机器学习】大模型在机器学习中的应用:从深度学习到生成式人工智能的演进
1.1K0
智能金融风控中的大模型实践_01
3160
相关推荐
基于RAG与多模态融合的短视频生成挑战:AI短视频工具-内容特工队AI(ReelsAgent)开发者实践分享
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
首页
学习
活动
专区
圈层
工具
MCP广场
首页
学习
活动
专区
圈层
工具
MCP广场