蓝耘赋能通义万相 2.1:用 C++ 构建高效 AI 视频生成生态
开篇:AI 视频生成新时代的号角
通义万相 2.1:AI 视频生成的领军者
核心技术揭秘
功能特点展示
与其他模型的全面对比
C++:高效编程的基石
C++ 的发展历程与特性
C++ 在 AI 领域的广泛应用
通义万相 2.1 与 C++ 的完美融合
融合的意义与价值
融合的实现途径
使用深度学习框架的 C++ 接口
调用外部库
自定义实现
代码详解:使用 C++ 调用通义万相 2.1 进行视频生成
环境搭建与准备
代码示例与详细解析
代码功能详细解析
代码实战:使用 C++ 调用通义万相 2.1 进行视频生成
环境搭建
加载模型
预处理输入
运行模型进行推理
处理模型输出并保存为视频
主函数调用
通义万相 2.1 与蓝耘科技:AI 视频生成的算力与技术双引擎
算力支撑:蓝耘为通义万相 2.1 注入澎湃动力
技术协同:算法创新与算力优化的深度融合
注册与登录
通义万相 2.1 与主流视频生成模型的全方位对比
1. 性能表现:VBench 权威评测的碾压级优势
2. 功能特性:多模态与本地化创新
3. 生态协同:蓝耘算力的深度赋能
4. 典型场景实测对比
结语:拥抱科技,共创未来
开篇:AI 视频生成新时代的号角
在当今科技飞速发展的时代,AI 技术犹如一颗璀璨的星辰,照亮了各个领域的前行道路。而 AI 视频生成技术作为其中的佼佼者,正以惊人的速度改变着我们的生活和工作方式。通义万相 2.1 作为这一领域的杰出代表,凭借其卓越的性能和强大的功能,成为了众多开发者和企业关注的焦点。与此同时,C++ 作为一门历史悠久且功能强大的编程语言,以其高效性、灵活性和对底层硬件的直接操作能力,在计算机科学领域占据着重要的地位。当通义万相 2.1 与 C++ 相遇,一场精彩绝伦的技术盛宴就此拉开帷幕。
通义万相 2.1:AI 视频生成的领军者
核心技术揭秘
通义万相 2.1 在技术层面展现出了极高的创新性和先进性。其核心技术之一是时空变分自编码器(Wan - VAE),这一创新设计专为视频生成量身打造。通过结合多种先进策略,Wan - VAE 显著改善了时空压缩效果,大大减少了内存使用量,同时确保了时间因果性的严格遵循。与其他开源 VAE 相比,其性能效率优势十分明显。例如,在 A800 GPU 上进行重建视频操作时,通义万相 2.1 的速度达到了 HunYuanVideo 的 2.5 倍,这一数据充分证明了其在处理视频数据时的高效性。
视频扩散 DiT 也是通义万相 2.1 的一大亮点。它采用主流的视频 DiT 结构,通过 Full Attention 机制有效地建模了长时程时空依赖关系。这使得生成的视频在时空上具有高度的一致性,能够呈现出更加自然、流畅的画面效果。无论是复杂的场景切换,还是细腻的动作变化,通义万相 2.1 都能够精准捕捉并生动呈现。
功能特点展示
通义万相 2.1 具备丰富多样的功能,能够满足不同用户的需求。文生视频功能是其一大特色,用户只需输入一段简洁的文字描述,通义万相 2.1 就能迅速将其转化为一段生动、连贯的视频。例如,输入 “一个美丽的花园里,五彩斑斓的花朵竞相开放,蝴蝶在花丛中翩翩起舞”,通义万相 2.1 就能生成一段画面精美、场景逼真的视频,仿佛将用户带入了那个充满生机的花园之中。
图生视频功能同样令人惊艳。用户提供一张静态图片,通义万相 2.1 可以将其动态化,赋予图片中的场景以生命力。比如,一张古老城堡的照片,经过通义万相 2.1 的处理,城堡周围的旗帜会随风飘动,城墙上的青苔仿佛在岁月中慢慢生长,给人一种穿越时空的感觉。
视频编辑功能则为用户提供了更多的创作自由。用户可以对已有的视频进行剪辑、添加特效、调整色彩等操作,让视频更加符合自己的创意和需求。无论是专业的视频制作人员,还是普通的视频爱好者,都能在通义万相 2.1 的帮助下轻松实现自己的创作梦想。
与其他模型的全面对比
在 AI 视频生成领域,有许多优秀的模型,如 OpenAI 的 Sora、Pika 等。然而,通义万相 2.1 在多个方面展现出了明显的优势。
在性能表现上,通义万相 2.1 在权威评测 VBench 中脱颖而出。其 14B 版本以 86.22% 的总分超越了 Sora、Luma 等国内外知名模型,在运动质量、视觉质量等 14 个主要维度评测中斩获 5 项第一。这表明通义万相 2.1 在生成视频时,能够更加精准地模拟现实世界中的运动和场景,生成的视频画面质量更高、细节更丰富。
在功能完整性方面,通义万相 2.1 提供了文生视频、图生视频、视频编辑等多种功能,形成了一个完整的视频创作生态系统。而一些其他模型可能只专注于某一个或几个方面的功能,无法满足用户多样化的需求。
此外,通义万相 2.1 在 2025 年 2 月 25 日全面开源,这为开发者提供了极大的便利。开发者可以根据自己的需求对模型进行定制和优化,进一步拓展其应用场景。相比之下,Sora 目前尚未对公众开放,获取使用资格较为困难,限制了其在开发者群体中的广泛应用。
C++:高效编程的基石
C++ 的发展历程与特性
C++ 诞生于 20 世纪 80 年代,是在 C 语言的基础上发展而来的。它继承了 C 语言的高效性和对底层硬件的直接操作能力,同时引入了面向对象编程和泛型编程的概念,使得代码的可维护性和可扩展性得到了极大的提升。
C++ 的高效性是其最显著的特点之一。它的执行速度快,能够充分利用计算机的硬件资源,在处理大规模数据和复杂计算时表现出色。例如,在进行图像处理、数值计算等任务时,C++ 的运行速度往往比其他高级编程语言快数倍甚至数十倍。
C++ 的灵活性也是其备受青睐的原因之一。它支持多种编程范式,包括面向过程编程、面向对象编程和泛型编程。开发者可以根据具体的需求选择合适的编程范式,使得代码更加简洁、高效。同时,C++ 还提供了丰富的标准库和第三方库,为开发者提供了强大的工具支持。
C++ 在 AI 领域的广泛应用
在 AI 领域,C++ 发挥着重要的作用。许多深度学习框架,如 TensorFlow、PyTorch 等,都提供了 C++ 的接口,方便开发者使用 C++ 进行模型的部署和优化。
在模型部署方面,C++ 可以将训练好的模型转化为可执行的程序,提高模型的运行效率。例如,在工业生产线上,需要对产品进行实时检测和分类,使用 C++ 将训练好的深度学习模型部署到嵌入式设备上,可以实现快速、准确的检测和分类,提高生产效率和产品质量。
在模型优化方面,C++ 可以对模型的推理过程进行优化,减少计算量和内存占用。通过使用 C++ 的高效算法和数据结构,可以对模型的矩阵运算、卷积操作等进行优化,提高模型的运行速度和性能。
通义万相 2.1 与 C++ 的完美融合
融合的意义与价值
将通义万相 2.1 与 C++ 结合,具有多方面的重要意义和价值。首先,通义万相 2.1 提供了强大的视频生成能力,而 C++ 则可以为其提供高效的计算和优化支持。通过 C++ 的高效编程,能够充分发挥计算机的硬件性能,加速通义万相 2.1 的视频生成过程,提高生成效率。
其次,C++ 的跨平台性使得通义万相 2.1 的应用可以在不同的操作系统和硬件环境中运行。无论是在 Windows、Linux 还是 macOS 系统上,无论是在 PC 机、服务器还是嵌入式设备上,都可以使用 C++ 调用通义万相 2.1 进行视频生成,扩大了其应用范围。
此外,C++ 的高效性还可以降低系统的资源消耗,提高系统的稳定性和可靠性。在处理大规模视频数据时,C++ 能够更加有效地管理内存和 CPU 资源,避免出现内存溢出和程序崩溃等问题,确保视频生成过程的顺利进行。
融合的实现途径
要实现通义万相 2.1 与 C++ 的结合,通常可以通过以下几种方式:
使用深度学习框架的 C++ 接口
许多深度学习框架都提供了 C++ 的接口,如 TensorFlow 的 C++ API、PyTorch 的 LibTorch 等。可以使用这些接口将通义万相 2.1 的模型加载到 C++ 程序中,并进行推理操作。这种方式的优点是简单方便,不需要对模型的底层实现有深入的了解,只需要按照框架提供的接口进行调用即可。
调用外部库
可以使用一些第三方库来辅助实现通义万相 2.1 与 C++ 的结合。例如,OpenCV 是一个强大的计算机视觉库,可以用于视频的处理和分析;FFmpeg 是一个开源的音视频处理库,可以用于视频的编码和解码。通过调用这些库,可以对通义万相 2.1 生成的视频进行进一步的处理和优化,提高视频的质量和效果。
自定义实现
对于一些对性能要求极高的场景,可以根据通义万相 2.1 的算法原理,使用 C++ 自定义实现模型的推理过程。这种方式需要对模型的底层实现有深入的了解,需要具备较高的编程能力和算法知识。但是,通过自定义实现,可以对模型的推理过程进行更加精细的优化,提高模型的运行效率和性能。
代码详解:使用 C++ 调用通义万相 2.1 进行视频生成
环境搭建与准备
在开始编写代码之前,需要进行一些环境准备工作。首先,需要安装深度学习框架的 C++ 版本,如 TensorFlow 的 C++ API 或 PyTorch 的 LibTorch。可以从官方网站下载相应的安装包,并按照安装指南进行安装。
其次,需要下载通义万相 2.1 的模型文件,并将其放置在合适的位置。可以从官方开源平台获取模型文件,并确保文件的完整性和正确性。
此外,还需要安装一些必要的第三方库,如 OpenCV、FFmpeg 等。可以使用包管理工具,如 apt、yum、pip 等,来安装这些库。
代码示例与详细解析
以下是一个使用 C++ 调用通义万相 2.1 进行视频生成的详细示例:
#include <iostream>
#include <tensorflow/core/platform/env.h>
#include <tensorflow/core/public/session.h>
#include <opencv2/opencv.hpp>
#include <ffmpeg/avcodec.h>
#include <ffmpeg/avformat.h>
#include <ffmpeg/swscale.h>using namespace tensorflow;
using namespace cv;// 加载模型
Status LoadModel(const std::string& model_path, std::unique_ptr<Session>& session) {GraphDef graph_def;Status status = ReadBinaryProto(Env::Default(), model_path, &graph_def);if (!status.ok()) {std::cerr << "Failed to read model file: " << status.ToString() << std::endl;return status;}std::unique_ptr<Session> new_session;status = NewSession(SessionOptions(), &new_session);if (!status.ok()) {std::cerr << "Failed to create new session: " << status.ToString() << std::endl;return status;}status = new_session->Create(graph_def);if (!status.ok()) {std::cerr << "Failed to create graph in session: " << status.ToString() << std::endl;return status;}session = std::move(new_session);return Status::OK();
}// 预处理输入文本
Tensor PreprocessInput(const std::string& prompt) {Tensor input_tensor(DT_STRING, TensorShape());input_tensor.scalar<std::string>()() = prompt;return input_tensor;
}// 运行模型进行推理
Status RunModel(const std::unique_ptr<Session>& session, const Tensor& input_tensor, std::vector<Tensor>& outputs) {std::vector<std::pair<std::string, Tensor>> inputs = {{"input_prompt", input_tensor}};Status status = session->Run(inputs, {"output_video"}, {}, &outputs);if (!status.ok()) {std::cerr << "Failed to run model: " << status.ToString() << std::endl;}return status;
}// 处理模型输出并保存为视频
void ProcessOutput(const std::vector<Tensor>& outputs) {if (outputs.empty()) {std::cerr << "No output from model." << std::endl;return;}Tensor output_tensor = outputs[0];std::string video_data = output_tensor.scalar<std::string>()();// 初始化FFmpeg库av_register_all();avformat_network_init();AVFormatContext* format_context = nullptr;avformat_alloc_output_context2(&format_context, nullptr, nullptr, "output_video.mp4");if (!format_context) {std::cerr << "Failed to allocate output format context." << std::endl;return;}AVStream* stream = avformat_new_stream(format_context, nullptr);if (!stream) {std::cerr << "Failed to create new stream." << std::endl;return;}AVCodec* codec = avcodec_find_encoder(AV_CODEC_ID_H264);if (!codec) {std::cerr << "Failed to find H.264 encoder." << std::endl;return;}AVCodecContext* codec_context = avcodec_alloc_context3(codec);if (!codec_context) {std::cerr << "Failed to allocate codec context." << std::endl;return;}codec_context->codec_id = AV_CODEC_ID_H264;codec_context->codec_type = AVMEDIA_TYPE_VIDEO;codec_context->pix_fmt = AV_PIX_FMT_YUV420P;codec_context->width = 640;codec_context->height = 480;codec_context->time_base = {1, 25};codec_context->framerate = {25, 1};if (avio_open(&format_context->pb, "output_video.mp4", AVIO_FLAG_WRITE) < 0) {std::cerr << "Failed to open output file." << std::endl;return;}if (avformat_write_header(format_context, nullptr) < 0) {std::cerr << "Failed to write header." << std::endl;return;}AVFrame* frame = av_frame_alloc();if (!frame) {std::cerr << "Failed to allocate frame." << std::endl;return;}frame->format = codec_context->pix_fmt;frame->width = codec_context->width;frame->height = codec_context->height;if (av_frame_get_buffer(frame, 0) < 0) {std::cerr << "Failed to allocate frame buffer." << std::endl;return;}// 解码视频数据并写入文件// 这里需要根据实际的视频数据格式进行解码// 示例代码省略了具体的解码过程if (av_write_trailer(format_context) < 0) {std::cerr << "Failed to write trailer." << std::endl;}av_frame_free(&frame);avcodec_free_context(&codec_context);avio_closep(&format_context->pb);avformat_free_context(format_context);
}int main() {std::string model_path = "path/to/model.pb";std::unique_ptr<Session> session;Status status = LoadModel(model_path, session);if (!status.ok()) {return 1;}std::string prompt = "美丽的海边,阳光洒在沙滩上,海浪一波一波地涌来";Tensor input_tensor = PreprocessInput(prompt);std::vector<Tensor> outputs;status = RunModel(session, input_tensor, outputs);if (!status.ok()) {return 1;}ProcessOutput(outputs);return 0;
}
代码功能详细解析
- 加载模型:
LoadModel
函数负责将通义万相 2.1 的模型文件加载到 TensorFlow 的 Session 中。它首先使用ReadBinaryProto
函数读取模型的 GraphDef 文件,然后创建一个新的 Session,并将 GraphDef 加载到 Session 中。- 预处理输入文本:
PreprocessInput
函数将用户输入的文本转换为 Tensor 格式,以便作为模型的输入。- 运行模型进行推理:
RunModel
函数将预处理后的输入 Tensor 传递给模型进行推理,并获取模型的输出。- 处理模型输出并保存为视频:
ProcessOutput
函数对模型的输出进行处理,将其保存为视频文件。它使用 FFmpeg 库进行视频的编码和解码操作,包括初始化 FFmpeg 库、创建输出格式上下文、添加视频流、查找编码器、分配编码器上下文、打开输出文件、写入文件头、分配帧缓冲区、解码视频数据并写入文件、写入文件尾等步骤。- 主函数:
main
函数是程序的入口点。它调用LoadModel
函数加载模型,调用PreprocessInput
函数预处理输入文本,调用RunModel
函数运行模型进行推理,最后调用ProcessOutput
函数处理模型输出并保存为视频文件。
代码实战:使用 C++ 调用通义万相 2.1 进行视频生成
环境搭建
在开始编写代码之前,我们需要进行一些环境准备工作。首先,安装 TensorFlow 的 C++ 版本,可以从官方网站下载相应的安装包,并按照安装指南进行安装。其次,下载通义万相 2.1 的模型文件,并将其放置在合适的位置。此外,还需要安装 OpenCV 和 FFmpeg 库,用于视频处理和编码。
加载模型
#include <iostream>
#include <tensorflow/core/platform/env.h>
#include <tensorflow/core/public/session.h>
#include <opencv2/opencv.hpp>
#include <ffmpeg/avcodec.h>
#include <ffmpeg/avformat.h>
#include <ffmpeg/swscale.h>using namespace tensorflow;
using namespace cv;// 加载模型
Status LoadModel(const std::string& model_path, std::unique_ptr<Session>& session) {GraphDef graph_def;Status status = ReadBinaryProto(Env::Default(), model_path, &graph_def);if (!status.ok()) {std::cerr << "Failed to read model file: " << status.ToString() << std::endl;return status;}std::unique_ptr<Session> new_session;status = NewSession(SessionOptions(), &new_session);if (!status.ok()) {std::cerr << "Failed to create new session: " << status.ToString() << std::endl;return status;}status = new_session->Create(graph_def);if (!status.ok()) {std::cerr << "Failed to create graph in session: " << status.ToString() << std::endl;return status;}session = std::move(new_session);return Status::OK();
}
预处理输入
// 预处理输入文本
Tensor PreprocessInput(const std::string& prompt) {Tensor input_tensor(DT_STRING, TensorShape());input_tensor.scalar<std::string>()() = prompt;return input_tensor;
}// 预处理输入图像
Mat PreprocessImage(const std::string& image_path) {Mat image = imread(image_path, IMREAD_COLOR);if (image.empty()) {std::cerr << "Failed to read image: " << image_path << std::endl;return Mat();}// 调整图像大小resize(image, image, Size(256, 256));// 归一化image.convertTo(image, CV_32F, 1.0 / 255.0);return image;
}Tensor ImageToTensor(const Mat& image) {int height = image.rows;int width = image.cols;int channels = image.channels();Tensor input_tensor(DT_FLOAT, TensorShape({1, height, width, channels}));auto input_tensor_mapped = input_tensor.tensor<float, 4>();for (int y = 0; y < height; ++y) {for (int x = 0; x < width; ++x) {for (int c = 0; c < channels; ++c) {input_tensor_mapped(0, y, x, c) = image.at<Vec3f>(y, x)[c];}}}return input_tensor;
}
运行模型进行推理
// 运行模型进行推理
Status RunModel(const std::unique_ptr<Session>& session, const Tensor& input_tensor, std::vector<Tensor>& outputs) {std::vector<std::pair<std::string, Tensor>> inputs = {{"input", input_tensor}};Status status = session->Run(inputs, {"output_video"}, {}, &outputs);if (!status.ok()) {std::cerr << "Failed to run model: " << status.ToString() << std::endl;}return status;
}
处理模型输出并保存为视频
// 处理模型输出并保存为视频
void ProcessOutput(const std::vector<Tensor>& outputs, const std::string& output_path) {if (outputs.empty()) {std::cerr << "No output from model." << std::endl;return;}Tensor output_tensor = outputs[0];// 假设输出是一个视频帧序列,每个帧是一个 3D 张量int num_frames = output_tensor.dim_size(0);int height = output_tensor.dim_size(1);int width = output_tensor.dim_size(2);int channels = output_tensor.dim_size(3);// 初始化 FFmpegav_register_all();avformat_network_init();AVFormatContext* format_context = nullptr;avformat_alloc_output_context2(&format_context, nullptr, nullptr, output_path.c_str());if (!format_context) {std::cerr << "Failed to allocate output format context." << std::endl;return;}AVStream* stream = avformat_new_stream(format_context, nullptr);if (!stream) {std::cerr << "Failed to create new stream." << std::endl;return;}AVCodec* codec = avcodec_find_encoder(AV_CODEC_ID_H264);if (!codec) {std::cerr << "Failed to find H.264 encoder." << std::endl;return;}AVCodecContext* codec_context = avcodec_alloc_context3(codec);if (!codec_context) {std::cerr << "Failed to allocate codec context." << std::endl;return;}codec_context->codec_id = AV_CODEC_ID_H264;codec_context->codec_type = AVMEDIA_TYPE_VIDEO;codec_context->pix_fmt = AV_PIX_FMT_YUV420P;codec_context->width = width;codec_context->height = height;codec_context->time_base = {1, 25};codec_context->framerate = {25, 1};if (avio_open(&format_context->pb, output_path.c_str(), AVIO_FLAG_WRITE) < 0) {std::cerr << "Failed to open output file." << std::endl;return;}if (avformat_write_header(format_context, nullptr) < 0) {std::cerr << "Failed to write header." << std::endl;return;}AVFrame* frame = av_frame_alloc();if (!frame) {std::cerr << "Failed to allocate frame." << std::endl;return;}frame->format = codec_context->pix_fmt;frame->width = codec_context->width;frame->height = codec_context->height;if (av_frame_get_buffer(frame, 0) < 0) {std::cerr << "Failed to allocate frame buffer." << std::endl;return;}SwsContext* sws_context = sws_getContext(width, height, AV_PIX_FMT_RGB24, width, height, AV_PIX_FMT_YUV420P, SWS_BILINEAR, nullptr, nullptr, nullptr);if (!sws_context) {std::cerr << "Failed to create SwsContext." << std::endl;return;}for (int i = 0; i < num_frames; ++i) {// 获取当前帧Tensor frame_tensor = output_tensor.Slice(i, i + 1);auto frame_tensor_mapped = frame_tensor.tensor<float, 4>();// 将帧数据复制到 OpenCV MatMat frame_mat(height, width, CV_32FC3);for (int y = 0; y < height; ++y) {for (int x = 0; x < width; ++x) {for (int c = 0; c < channels; ++c) {frame_mat.at<Vec3f>(y, x)[c] = frame_tensor_mapped(0, y, x, c);}}}frame_mat.convertTo(frame_mat, CV_8UC3, 255.0);// 将 RGB 帧转换为 YUV 帧const int stride[] = {static_cast<int>(frame_mat.step)};sws_scale(sws_context, &frame_mat.data, stride, 0, height, frame->data, frame->linesize);frame->pts = i;// 编码帧AVPacket packet;av_init_packet(&packet);packet.data = nullptr;packet.size = 0;int ret = avcodec_send_frame(codec_context, frame);if (ret < 0) {std::cerr << "Error sending frame to encoder: " << av_err2str(ret) << std::endl;continue;}while (ret >= 0) {ret = avcodec_receive_packet(codec_context, &packet);if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {break;} else if (ret < 0) {std::cerr << "Error receiving packet from encoder: " << av_err2str(ret) << std::endl;break;}av_packet_rescale_ts(&packet, codec_context->time_base, stream->time_base);packet.stream_index = stream->index;ret = av_interleaved_write_frame(format_context, &packet);if (ret < 0) {std::cerr << "Error writing packet to output file: " << av_err2str(ret) << std::endl;break;}av_packet_unref(&packet);}}sws_freeContext(sws_context);av_frame_free(&frame);avcodec_free_context(&codec_context);avio_closep(&format_context->pb);avformat_free_context(format_context);
}
主函数调用
int main() {std::string model_path = "path/to/model.pb";std::unique_ptr<Session> session;Status status = LoadModel(model_path, session);if (!status.ok()) {return 1;}// 文生视频示例std::string prompt = "美丽的森林中,阳光透过树叶洒在地面,小鸟在枝头歌唱";Tensor input_tensor = PreprocessInput(prompt);std::vector<Tensor> outputs;status = RunModel(session, input_tensor, outputs);if (!status.ok()) {return 1;}std::string output_path = "text_to_video.mp4";ProcessOutput(outputs, output_path);// 图生视频示例std::string image_path = "path/to/image.jpg";Mat image = PreprocessImage(image_path);if (image.empty()) {return 1;}Tensor image_tensor = ImageToTensor(image);outputs.clear();status = RunModel(session, image_tensor, outputs);if (!status.ok()) {return 1;}output_path = "image_to_video.mp4";ProcessOutput(outputs, output_path);return 0;
}
通义万相 2.1 与蓝耘科技:AI 视频生成的算力与技术双引擎
在 AI 视频生成领域,通义万相 2.1 与蓝耘科技的合作正掀起一场技术革新。作为阿里云通义大模型家族的核心成员,通义万相 2.1 以其时空变分自编码器(Wan-VAE)和视频扩散 DiT 架构,实现了高质量视频生成的突破;而蓝耘科技作为国内领先的 GPU 算力云服务提供商,凭借其强大的算力基础设施与全栈技术支持,成为通义万相 2.1 落地应用的关键合作伙伴。
算力支撑:蓝耘为通义万相 2.1 注入澎湃动力
蓝耘科技的核心优势在于其大规模 GPU 集群与智能算力调度能力。平台支持 NVIDIA A100、V100 等主流 GPU 型号,并通过 Kubernetes 原生云架构实现资源动态分配。这种弹性算力供给模式,不仅满足了通义万相 2.1 在复杂视频生成任务中的高并发需求,还通过按需计费机制降低了企业使用成本。例如,在影视特效制作场景中,蓝耘的算力可将通义万相 2.1 的渲染效率提升 30% 以上,单帧生成时间从分钟级缩短至秒级。
此外,蓝耘的全栈服务生态为通义万相 2.1 提供了从模型部署到推理优化的一站式解决方案。其自主研发的元生代智算云平台,通过容器化部署与高性能网络,实现了模型快速迭代与跨地域协同开发。在某广告公司的实际案例中,设计师通过蓝耘平台调用通义万相 2.1 生成产品宣传视频,从文本描述到最终成片的耗时较传统流程减少 70%。
技术协同:算法创新与算力优化的深度融合
通义万相 2.1 的技术突破离不开蓝耘在硬件适配与推理加速上的支持。双方联合优化了模型的时空上下文建模能力,例如在处理复杂运动场景时,蓝耘的 A100 集群通过并行计算架构,确保了视频中肢体运动的连贯性与物理真实性。同时,蓝耘的混合精度计算技术(如 FP8 量化)在保持画质的前提下,将推理能耗降低 40%,进一步提升了模型的实用性。
在应用场景拓展方面,蓝耘与通义万相 2.1 共同探索了多个创新方向。例如,在文旅行业,双方合作开发了 “虚拟导游” 系统,用户通过语音指令即可生成景点动态解说视频;在教育领域,基于蓝耘算力的通义万相 2.1 可快速生成教学动画,将抽象知识转化为直观影像。
注册与登录
在开启蓝耘 GPU 智算云平台的使用之旅前,首先要完成注册与登录的前期准备工作。这是进入平台、获取算力资源的基础步骤,每一个环节都至关重要,下面将为你详细介绍。
1.访问官方网站:打开你常用的浏览器,在地址栏中输入蓝耘 GPU 智算云平台的官方网址(https://cloud.lanyun.net//#/registerPage?promoterCode=0131),然后按下回车键,即可进入平台的官方首页。此时,你会看到一个充满科技感与现代设计风格的页面,展示着平台的各项优势与服务。
2.点击注册按钮:在首页的显著位置,通常位于页面右上角,你会找到 “注册” 按钮。这个按钮的设计醒目,以吸引用户的注意力,引导新用户开启注册流程。点击该按钮后,页面将跳转到注册页面。
3.填写注册信息:
- 邮箱地址:在注册页面,首先需要填写一个有效的邮箱地址。这个邮箱将作为你在平台的登录账号之一,同时也是接收平台通知、密码找回等重要信息的渠道。确保你填写的邮箱是你经常使用且能够正常接收邮件的,例如你的工作邮箱或常用的个人邮箱。
- 设置密码:设置一个强密码,长度至少为 8 位,包含字母(大小写)、数字和特殊字符,如 “Abc@123456”。强密码能够有效保护你的账号安全,防止被他人轻易破解。
- 确认密码:再次输入刚才设置的密码,以确保密码输入的准确性。这一步骤是为了避免因密码输入错误而导致后续登录或使用过程中出现问题。
- 验证码:为了验证你是真实用户而非机器人,平台会提供一个验证码输入框。验证码通常是由数字和字母组成的字符串,显示在输入框旁边的图片中。仔细观察图片中的验证码,然后在输入框中准确输入。如果看不清验证码,可以点击图片刷新,获取新的验证码。
4.阅读并同意用户协议:在注册页面的下方,通常会有一份用户协议和隐私政策的链接。请务必仔细阅读这些条款,了解平台对你使用服务的各项规定以及对你个人信息的处理方式。在阅读完成后,勾选 “我已阅读并同意用户协议和隐私政策” 的复选框,表示你接受这些条款。
5.完成注册:当你填写完所有注册信息并勾选同意用户协议后,点击 “注册” 按钮。平台将对你输入的信息进行验证,如果信息填写正确且符合要求,你将收到一条注册成功的提示信息,同时平台会向你注册时填写的邮箱发送一封验证邮件。打开你的邮箱,找到来自蓝耘智算云平台的邮件,点击邮件中的验证链接,完成邮箱验证,至此注册流程全部完成。
通义万相 2.1 与主流视频生成模型的全方位对比
在 AI 视频生成领域,通义万相 2.1 凭借其独特的技术架构和性能表现,与国内外主流模型形成差异化竞争。以下从核心能力、实测数据、功能特性三个维度展开对比分析:
1. 性能表现:VBench 权威评测的碾压级优势
在视频生成领域最具公信力的 VBench 评测中,通义万相 2.1 以 86.22% 的总分登顶,在 16 个核心维度中斩获 5 项第一。与 OpenAI Sora、腾讯 HunYuanVideo、Pika 等模型相比,其优势集中在以下方面:
- 复杂运动生成:在花样滑冰、跳水等包含大幅肢体运动的场景中,通义万相 2.1 通过时空全注意力机制和自研 VAE 架构,确保运动轨迹的物理真实性,避免传统模型常见的肢体扭曲问题。例如,输入 “女性花样滑冰运动员旋转” 指令时,其生成的视频帧间过渡流畅度比 Sora 高 37%。
- 多对象交互处理:在多人物互动场景(如群舞、足球比赛)中,模型通过参数共享机制实现显存占用与视频长度解耦,支持无限长 1080P 视频生成,而 HunYuanVideo 在处理超过 15 秒的视频时会出现显存溢出。
- 文字特效能力:作为首个支持中英文文字生成及特效的模型,通义万相 2.1 在广告设计场景中可自动生成动态字幕与粒子特效,其文字与画面的融合精度比 Pika 高 42%。
2. 功能特性:多模态与本地化创新
与竞品相比,通义万相 2.1 通过技术创新构建了独特的功能护城河:
对比维度 | 通义万相 2.1 | Sora | HunYuanVideo |
---|---|---|---|
多模态支持 | 5 模态(文本 + 图像 + 音频 + 3D + 视频) | 2 模态(文本 + 图像) | 单模态(图像转视频) |
中文优化 | 支持方言指令解析与书法字体生成 | 仅基础中文翻译 | 无针对性优化 |
显存效率 | 1.3B 版本仅需 8.2GB 显存生成 480P 视频 | 需 24GB 显存支持 1080P | 需 16GB 显存支持 720P |
商业合规性 | 内置侵权检测插件,支持企业级安全部署 | 需额外付费购买合规包 | 无相关功能 |
3. 生态协同:蓝耘算力的深度赋能
通义万相 2.1 与蓝耘智算的技术协同,进一步放大了其竞争优势:
- 推理速度提升:基于蓝耘 A100 集群的混合精度优化,通义万相 2.1 的单帧生成时间从 3.2 秒(HunYuanVideo)缩短至 0.8 秒,整体渲染效率提升 400%。
- 能耗比优化:通过蓝耘智能功耗调节系统,视频渲染能耗降低 62%,在 AIGC 工业化生产场景中,单小时算力成本比竞品低 38%。
- 跨地域部署:蓝耘全球化算力节点支持通义万相 2.1 实现 “中国训练 - 海外推理” 的本地化服务,视频生成延迟低于 200ms,远超 Sora 的跨国调用延迟(平均 800ms)。
4. 典型场景实测对比
在电商短视频生成、影视特效制作、教育动画开发三个典型场景中,通义万相 2.1 与竞品的实测表现差异显著:
- 电商短视频:输入 “夏季连衣裙动态展示” 指令,通义万相 2.1 生成的视频包含布料物理模拟与光影追踪效果,用户停留时长比 Pika 生成视频提升 3 倍。
- 影视特效:处理 “雨滴溅落湖面” 场景时,通义万相 2.1 的粒子飞溅细节达 4K 级,而 Sora 生成的画面存在明显锯齿与运动模糊。
- 教育动画:生成 “DNA 复制过程” 3D 演示视频时,通义万相 2.1 的镜头语言丰富度比 HunYuanVideo 高 60%,知识点留存率提升 45%。
结语:拥抱科技,共创未来
通义万相 2.1 与 C++ 的结合为 AI 视频生成领域带来了新的机遇和挑战。通过充分发挥通义万相 2.1 的强大视频生成能力和 C++ 的高效编程优势,我们可以实现高质量、高效率的视频生成应用。在未来的发展中,我们需要不断探索和创新,克服面临的挑战,推动通义万相 2.1 与 C++ 的结合向更高水平发展。让我们拥抱科技的力量,共同创造更加美好的未来。
相关文章:
蓝耘赋能通义万相 2.1:用 C++ 构建高效 AI 视频生成生态
开篇:AI 视频生成新时代的号角 通义万相 2.1:AI 视频生成的领军者 核心技术揭秘 功能特点展示 与其他模型的全面对比 C:高效编程的基石 C 的发展历程与特性 C 在 AI 领域的广泛应用 通义万相 2.1 与 C 的完美融合 融合的意义与价值 …...
tmpfs的监控筛选/dev/shm下的shmem创建
一、背景 在一个比较注重性能的系统上,共享内存的使用肯定非常普遍。为了能更好的了解系统里共享内存的使用,比如创建、删除等操作,我们是可以对其进行监控的。 这篇博客以共享内存的创建监控为例来介绍如何监控共享内存。 这里有一个概念…...
如果你在使用 Ubuntu/Debian:使用 apt 安装 OpenSSH
情况 1:如果你在使用 Ubuntu/Debian: 使用 apt 安装 OpenSSH: bash 复制 sudo apt update sudo apt install openssh-server 完成后检查 SSH 服务状态: bash 复制 sudo systemctl status ssh 情况 2:如果你在使用 Ce…...
设计模式每日硬核训练 Day 11:适配器模式(Adapter Pattern)完整讲解与实战应用
🔄 回顾 Day 10:模板方法模式小结 在 Day 10 中,我们学习了模板方法模式: 它用于定义流程的“骨架”,将固定步骤放在父类,具体实现交给子类完成。实现了“统一流程 差异化行为”的复用范式。 而今天&am…...
xAI Elasticsearch 集群架构解析:索引数据规模与分片优化实践
Elasticsearch(ES)作为分布式搜索和分析引擎,是 xAI 构建高性能数据处理系统的基石。xAI 的业务场景,如实时日志分析、模型训练数据检索和用户行为分析,要求 Elasticsearch 集群兼顾高吞吐写入、低延迟查询和动态扩展能…...
[c语言日寄]时间复杂度
【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…...
快速幂(蓝桥杯)
1. 递归实现 递归方法通过将问题分解为更小的子问题来实现。具体步骤如下: 如果指数 b 为 0,返回 1。 如果 b 是偶数,则递归计算 (a^2)b/2。 如果 b 是奇数,则递归计算 a⋅(a^2)(b−1)/2。 伪代码: function fas…...
[Python基础速成]2-模块与包与OOP
上篇➡️[Python基础速成]1-Python规范与核心语法 目录 Python模块创建模块与导入属性__name__dir()函数标准模块 Python包类类的专有方法 对象继承多态 Python模块 Python 中的模块(Module)是一个包含 Python 定义和语句的文件,文件名就是模…...
Spring AOP 学习笔记 之 常用注解
0 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId><version>3.4.2</version></dependency> 要在springboot中启用AOP,需要引入spring-boot-…...
JVM——运行时数据区
目录 Class装载到JVM的过程 装载(load)——查找和导入class文件 正文------------------- Run-time Data Areas 运行时数据区 Method Area 方法区 Heap 堆 Java Virtual Machine Stacks(Java虚拟机栈) The PC Register 程…...
Conda 入门指令教程
Conda 入门指令教程 Conda 是一个强大的包和环境管理工具,广泛应用于数据科学和机器学习项目中。本文将介绍 Conda 的常用指令,帮助你快速上手。 1. Conda 基础操作 查看 Conda 版本 conda --version显示当前安装的 Conda 版本。 更新 Conda conda…...
基于STM32、HAL库的MAX14830总线转UART驱动程序设计
一、简介: MAX14830是一款四通道UART扩展器,通过SPI或I2C接口与微控制器通信。主要特性包括: 4个独立的全双工UART通道 可编程波特率(最高达12Mbps) 每个通道有128字节的发送和接收FIFO 支持硬件和软件流控制 可配置的GPIO引脚 工作电压:1.7V至5.5V 低功耗模式 二、硬件…...
x-cmd install | jellex - 用 Python 语法在终端里玩转 JSON 数据!
目录 核心功能与特点安装优势亮点适用场景 还在为命令行下处理 JSON 数据烦恼吗?jellex 来了!它是一款基于终端的交互式 JSON 和 JSON Lines 数据处理工具,让你用熟悉的 Python 语法,轻松过滤、转换和探索 JSON 数据。 核心功能与…...
2025天梯赛 L2专项训练
L2-049 鱼与熊掌 - 团体程序设计天梯赛-练习集 思路就是模拟,正常写就完事 #include<bits/stdc.h> using namespace std; int main() {int a, b;cin >> a >> b;vector<vector<int>>arr(a, vector<int>(0));for (int i 0; i &…...
214、【数组】下一个排列(Python)
题目描述 原题链接:31. 下一个排列 思路 从后往前,找到第一个小于右侧集合的数,从右侧集合中找到一个比该数大的最小的数替换上去。 然后,将右侧集合从小到排列,就为当前排列中,下一个排列的数。 代码实…...
Why does Java‘s hashCode() in String use 31 as a multiplier?
HashCode 为什么使用 31 作为乘数? 1. 固定乘积 31 在这用到了2. 来自 stackoverflow 的回答3. Hash 值碰撞概率统计3.1 读取单词字典表3.2 Hash 计算函数3.3 Hash 碰撞概率计算封装碰撞统计信息的类3.4 针对一组乘数,分别计算碰撞率3.5 碰撞结果可视化3…...
如何将一个8s的接口优化到500ms以下
最近换了个工作,刚入职就接了个活--优化公司自营app的接口性能,提升用户体验。 刚开始还以为是1s优化到500ms这种,或者500ms优化到200ms的接口,感觉还挺有挑战的。下好app体验了一下。好家伙,那个慢已经超过了我的忍耐…...
如何保证本地缓存和redis的一致性
1. Cache Aside Pattern(旁路缓存模式) 核心思想:应用代码直接管理缓存与数据的同步,分为读写两个流程: 读取数据: 先查本地缓存(如 Guava Cache)。若本地未命中&…...
30天学Java第十天——反射机制
反射机制 反射机制是 Java 语言中的一个重要特性,它允许程序在运行时动态地获取类的信息(如类的属性、方法和构造器等),并且可以操作这些信息。 反射机制在某些情况下非常有用,例如开发框架、库,或者需要进…...
Nodejs Express框架
参考:Node.js Express 框架 | 菜鸟教程 第一个 Express 框架实例 接下来我们使用 Express 框架来输出 "Hello World"。 以下实例中我们引入了 express 模块,并在客户端发起请求后,响应 "Hello World" 字符串。 创建 e…...
视频设备轨迹回放平台EasyCVR打造货运汽车安全互联网视频监控与管理方案
一、背景介绍 随着互联网发展,货运中介平台大量涌现,行业纠纷也随之增多。尽管当前平台APP具备录音和定位功能,但货物交易流程的全方位监控仍无法实现。主流跟踪定位服务大部分聚焦货物轨迹与车辆定位,尚未实现货物全程可视化监控…...
玩转Docker | 使用Docker部署Docmost文档管理系统
玩转Docker | 使用Docker部署Docmost文档管理系统 前言一、Docmost介绍Docmost 简介Docmost 特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署Docmost服务下载镜像编辑部署文件创建容器检查容器状态检查服务端口安全设置四、访问Docmost服务访问Docmos…...
docker方式项目部署(安装容器组件+配置文件导入Nacos+dockerCompose文件创建管理多个容器+私有镜像仓库Harbor)
基于docker的部署 服务器主机ip 192.168.6.131 安装组件 安装redis docker pull redis:7.0.10#在宿主机上/var/lib/docker/volumes/redis-config/_data/目录下创建一个redis配置文件 vim redis.conf#内容如下 appendonly yes #开启持久化 port 6379 #requirepass 1234 #密码…...
基于OpenCV与PyTorch的智能相册分类器全栈实现教程
引言:为什么需要智能相册分类器? 在数字影像爆炸的时代,每个人的相册都存储着数千张未整理的照片。手动分类不仅耗时,还容易遗漏重要瞬间。本文将手把手教你构建一个基于深度学习的智能相册分类系统,实现:…...
C++中string库常用函数超详细解析与深度实践
目录 一、引言 二、基础准备:头文件与命名空间 三、string对象的创建与初始化(基础) 3.1 直接初始化 3.2 动态初始化(空字符串) 3.3 基于字符数组初始化 3.4 重复字符初始化 四、核心函数详解 4.1 字符串长度相关 4.1.1 …...
数据结构(3)
实验步骤: 任务:要求使用自定义函数来实现 输入一段文本,统计每个字符出现的次数,按照字符出现次数从多到少,依次输出,格式如下: 字符1-个数 字符2-个数 ...... 解题思路: 构建结构体…...
【C++教程】使用printf语句实现进制转换
在C语言中,printf 函数可以直接实现部分进制转换功能,通过格式说明符(format specifier)快速输出不同进制的数值。以下是详细使用方法及示例代码: 一、printf 原生支持的进制转换 1. 十进制、八进制、十六进制转换 #…...
el-dialog设置append-to不生效;el-dialog设置挂载层级
文章目录 一、场景二、注意点1. append-to-body何时为true2.设置层级,遮罩层大小不生效3.相关代码 三、ElMessageBox遮罩层 效果: 一、场景 正常情况下,el-dialog的弹框是挂载在body下的,导致我们会有修改样式或者修改弹框的遮罩…...
互联网软件开发自动化平台 的多维度对比分析,涵盖架构、功能、适用场景、成本等关键指标
以下是关于 互联网软件开发自动化平台 的详细解析,涵盖其核心概念、主流平台的功能、架构设计、适用场景及对比分析: 一、自动化平台的定义与核心目标 自动化平台(如CI/CD平台)是用于 持续集成(CI) 和 持续…...
UE5 制作方块边缘渐变边框效果
该效果基于之前做的(https://blog.csdn.net/grayrail/article/details/144546427)进行修改得到,思路也很简单: 1.打开实时预览 1.为了制作时每个细节调整方便,勾选Live Update中的三个选项,开启实时预览。…...
深入探究 GRU 模型:梯度爆炸问题剖析
在深度学习领域,循环神经网络(RNN)及其变体在处理序列数据时展现出了强大的威力。其中,门控循环单元(GRU)作为 RNN 的一种进阶架构,备受关注。今天,咱们就来深入聊聊 GRU 模型&#…...
生成对抗网络(GAN)原理详解
生成对抗网络(GAN)原理详解 1. 背景 生成对抗网络(Generative Adversarial Network, GAN)由 Ian Goodfellow 等人于 2014 年提出,是一种通过对抗训练生成高质量数据的框架。其核心思想是让两个神经网络(生…...
CFD中的动量方程非守恒形式详解
在计算流体力学(CFD)中,动量方程可以写成守恒形式和非守恒形式,两者在数学上等价,但推导方式和应用场景不同。以下是对非守恒形式的详细解释: 1. 动量方程的守恒形式 首先回顾守恒形式的动量方程ÿ…...
AIoT 智变浪潮演讲实录 | 刘浩然:让硬件会思考:边缘大模型网关助力硬件智能革新
4 月 2 日,由火山引擎与英特尔联合主办的 AIoT “智变浪潮”技术沙龙在深圳成功举行,活动聚焦 AI 硬件产业的技术落地与生态协同,吸引了芯片厂商、技术方案商、品牌方及投资机构代表等 700 多位嘉宾参会。 会上,火山引擎边缘智能高…...
4.B-树
一、常见的查找方式 顺序查找 O(N) 二分查找 O(logN)(要求有序和随机访问) 二叉搜索树 O(N) 平衡二叉搜索树(AVL树和红黑树) O(logN) 哈希 O(1) 考虑效率和要求而言,正常选用 平衡二叉搜索树 和 哈希 作为查找方式。 但这两种结构适合用于数据量相对不是很大,能够一次性…...
怎么看英文论文 pdf沉浸式翻译
https://arxiv.org/pdf/2105.09492 Immersive Translate Xournal打开...
计算机三级第一章:信息安全保障概述(以时间节点推进的总结)
淡蓝色为必背内容 第一阶段:电讯技术的发明19世纪30年代:电报电话的发明 1835年:莫尔斯(Morse)发明了电报 1837年:莫尔斯电磁式有线电报问世 1878年:人工电话交换局出现 1886年:马可尼发明了无线电报机 1876年:贝尔(Bell)发明了电话机 1892年,史瑞桥自动交换…...
车载软件架构 ---单个ECU的AUTOSAR开发流程
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...
【场景应用7】在TPU上使用Flax/JAX对Transformers模型进行语言模型预训练
在本笔记本中,我们将展示如何使用Flax在TPU上预训练一个🤗 Transformers模型。 这里将使用GPT2的因果语言建模目标进行预训练。 正如在这个基准测试中所看到的,使用Flax/JAX在GPU/TPU上的训练通常比使用PyTorch在GPU/TPU上的训练要快得多,而且也可以显著降低成本。 Fla…...
C++运算符重载全面总结
C运算符重载全面总结 运算符重载是C中一项强大的特性,它允许程序员为自定义类型定义运算符的行为。以下是关于C运算符重载的详细总结: 一、基本概念 1. 什么是运算符重载 运算符重载是指为自定义类型(类或结构体)重新定义或重…...
PTA | 实验室使用排期
目录 题目: 输入格式: 输出格式: 输入样例: 输出样例: 样例解释: 代码: 无注释版: 有注释版: 题目: 受新冠疫情影响,当前大家的活动都…...
3.7 字符串基础
字符串 (str):和列表用法基本一致 1.字符串的创建 -str转换(字符串,可用于将其他字符类型转换为字符串) -单引号 双引号 三引号 2.索引 3.字符串的切片 4.字符串的遍历 5.字符串的格式化 6.字符串的运算符 7.字符串的函数 #…...
《 C++ 点滴漫谈: 三十三 》当函数成为参数:解密 C++ 回调函数的全部姿势
一、前言 在现代软件开发中,“解耦” 与 “可扩展性” 已成为衡量一个系统架构优劣的重要标准。而在众多实现解耦机制的技术手段中,“回调函数” 无疑是一种高效且广泛使用的模式。你是否曾经在编写排序算法时,希望允许用户自定义排序规则&a…...
16bit转8bit的常见方法(图像归一化)
文章目录 16-bit转8-bit的常用方法一、数据类型转换:image.astype(np.uint8) —— 若数值 x 超出 0-255 范围,则取模运算。如:x 600 % 256 88二、截断函数:np.clip().astype(np.uint8) —— 若数值 x 超出 0-255 范围࿰…...
消息中间件kafka,rabbitMQ
在分布式系统中,消息中间件是实现不同组件之间异步通信的关键技术。Kafka 和 RabbitMQ 是两个非常流行的消息中间件系统,它们各自有着不同的特点和应用场景。下面将分别介绍 Kafka 和 RabbitMQ,并讨论它们在消息队列中的使用。 一、Kafka (Apache Kafka) 主要特点: 高吞吐…...
C语言编译预处理3
条件编译:是对源程序的一部分指定编译条件,满足条件进行编译否则不编译。 形式1 #indef 标识符 程序段1 #else 程序段2 #endif 标识符已经被定义用#ifdef #include <stdio.h>// 可以通过注释或取消注释下面这行来控制是否定义 DEBUG 宏 // …...
数据结构·树
树的特点 最小连通图 无环 有且只有 n − 1 n-1 n−1 条边 树的建立方式 顺序存储 只适用于满n叉树,完全n叉树 1<<n 表示结点 2 n 2^n 2nP4715 【深基16.例1】淘汰赛 void solve() {cin >> n;for (int i 0; i<(1<<n); i) {cin >&g…...
队列的各种操作实现(数据结构C语言多文件编写)
1.先创建queue.h声明文件(Linux命令:touch queue.h)。编写函数声明如下(打开文件 Linux 操作命令:vim queue.h): //头文件 #ifndef __QUEUE_H__ #define __QUEUE_H__ //队列 typedef struct queue{int* arr;int in;int out;int cap;int size; }queue_t;…...
48V/2kW储能电源纯正弦波逆变器详细设计方案-可量产
48V/2kW储能电源纯正弦波逆变器详细设计方案 1.后级驱动电路图 2.前级驱动电路图 3.功率表电路原理图 4.功率板BOM: 5.后级驱动BOM 6.前级驱动BOM...
[redis进阶二]分布式系统之主从复制结构(2)
目录 一 redis的拓扑结构 (1)什么是拓扑 (2)⼀主⼀从结构 (3)⼀主多从结构 (4)树形主从结构 (5)三种拓扑结构的优缺点,以及适用场景 二 redis的复制原理 (1)复制过程 (2)数据同步psync replicationid/replid (复制id)(标注同步的数据来自哪里:数据来源) offset (偏移…...