云端生成式 AI – 基于 Amazon EKS 的 Stable Diffusion 图像生成方案

a24a428f25409cfa5b64ea6e21e48be4.gif

Stable Diffusion 是当下生成式 AI 领域最受欢迎的开源多模态语言-图像模型,由于其易用的接口和良好的使用体验,受到了开源社区和广大设计行业从业者的追捧。Stable Diffusion 模型版本正在快速迭代,并带动了各行各业的生产力变革。目前市场上有多种围绕 Stable Diffusion 模型的行业解决方案,比如亚马逊云科技推出的 Stable Diffusion 插件解决方案。

本文中,我们将介绍一种更加适合 toC 场景的解决方案,它将帮助客户从容应对大并发量的请求,达到分钟级冷启动;使用更简单的控制平面,为客户提供更灵活的架构,轻松实现各种功能模块设计;同时,它还利用 Amazon Spot instances,帮助客户有效控制成本。

39a47b9b65a76b6489c74370883926ec.png

Stable Diffusion 文生图原理

16dcf70e87e175735ab70eb135f99899.png

Stable Diffusion 图生图原理

  • Stable Diffusion:

    https://aws.amazon.com/cn/campaigns/aigc/solutions/stable-diffusion-aws-extension/

  • Amazon Spot instances:

    https://aws.amazon.com/cn/ec2/spot/

方案特点

我们根据实际客户需求和案例经验,提炼出该方案的特点如下:

  • 更快速的扩容,基于 KEDA、Karpenter、Bottlerocket,提供可自定义的任务粒度的自动扩容能力,且最快可以达到 1 分钟内业务就绪,适合高并发且对响应时间有要求的情况。

  • 大幅降低成本,通过使用 Amazon Spot instances 和 Amazon EFS,使得计算成本相较于 On-demand instances 可节省最高约 70%,多节点场景下的存储成本相较于 EBS 更可节省数倍。

  • 运维非常方便,方案是云原生架构,基于 Amazon EKS、无服务器(Serverless)和事件驱动(Event-Driven),大部分组件无需自行管理,适合运维人手不足的情况。

  • 可视化监控,提供调用流程详细的可视化,历史统计与异常检测功能,有效缩短 MTTI(Mean Time to Identify)。

  • 自动化部署,方案使用 Amazon CDK,借助编程语言的强大表达能力和高效执行效率,仅需 30-40 分钟就可以自动完成构建。

方案架构

55a6f378df04096c27c19c2cae911ff8.png

方案流程如下:

  • 用户将提示词和参数通过 http 请求的方式,经过 Amazon CloudFront 加速,传递到应用服务器(可通过 Amazon Fargate 部署)。

  • 应用服务器完成相关业务处理后(如:认证鉴权/task 跟踪/参数优化等),调用 Amazon API Gateway 提供的推理 API 接口,之后请求交由 Amazon Lambda 校验并发布到 Amazon SNS 服务,并拿到同步响应。

  • Amazon SNS 借助可自定义的 filter 规则将请求以异步消息的方式发布到对应的队列服务 Amazon SQS 中,多队列的设计可灵活适应复杂的业务需求。

  • KEDA 会根据 Amazon SQS 中的消息数量,动态扩容 Amazon EKS 集群中的工作负载 Pod。

  • 扩容动作会借助 Karpenter 启动 Amazon GPU Spot instances 作为工作节点,并使用基于 Bottlerocket 构建的 snapshot 来快速启动 Stable Diffusion WebUI 工作负载。

  • Stable Diffusion WebUI 以指定配置参数启动,并从 Amazon EFS 中加载基础模型文件。

  • Queue Agent 从任务队列中拉取任务,完成相关处理(下载输入图片/切换基础模型等),调用 Stable Diffusion WebUI 的 API 完成推理并生成结果,将结果图片保存到 Amazon S3 中。

  • Queue Agent 将任务响应数据发布到 Amazon SNS 服务,以便应用服务器能够通过多种方式(Amazon SQS/Http Endpoint)获取异步响应数据并进行后续业务处理。

  • 方案使用 Amazon CloudWatch、Amazon Distro for OpenTelemetry 和 Amazon X-Ray 来采集、追踪和展示相关过程中产生的日志和指标。

  • 方案还使用了 Amazon IAM 来控制资源的访问授权,使用 Amazon ECR 存储容器镜像,使用 Amazon DataSync 同步模型文件,使用 Amazon CDK 来完成自动化部署。

主要服务列表:

  • Amazon Elastic Kubernetes Service(Amazon EKS):是一项托管 Kubernetes 服务,用于在 Amazon Cloud 上运行 Kubernetes。在云中,Amazon EKS 可自动管理负责安排容器、管理应用程序可用性、存储集群数据和其他关键任务的 Kubernetes 控制面板节点的可用性和可扩展性。

  • Amazon ECR:Amazon Elastic Container Registry是完全托管式容器注册表,提供高性能托管,让您能在任何地方可靠地部署应用程序映像和构件。

  • Amazon Lambda:Amazon Lambda 是一项事件驱动、随用随付的计算服务,让您无需预置或管理服务器即可运行代码。

  • Amazon SQS:Amazon Simple Queue Service(SQS)是一种消息队列服务,可让您分离和扩展微服务、分布式系统和无服务器应用程序。

  • Amazon SNS:Amazon Simple Notification Service(SNS)是一项用于应用与应用之间(A2A)以及应用与人之间(A2P)通信的完全托管式消息收发服务。

  • Amazon API Gateway:Amazon API Gateway 是一种完全托管式服务,可以轻松创建、发布任意规模的 API。

  • Amazon CloudWatch:Amazon CloudWatch 会在自动化控制面板中收集并可视化实时日志、指标和事件数据,从而简化您的基础设施和应用程序维护。

  • Amazon X-Ray:Amazon X-Ray 通过您的应用程序时会提供完整的请求视图,并通过无代码和低代码移动过滤负载、函数、轨迹、服务、API 等方面的可视化数据。

  • Amazon S3:Amazon Simple Storage Service(Amazon S3)是一项对象存储服务,旨在存储和保护任意量的数据。

  • Amazon EFS:适用于构建人员的无服务器、完全弹性的文件系统,可以轻松设置、扩展高可用性共享存储并对其进行成本优化。

  • Amazon DataSync:安全的,可自动化并加速本地存储和亚马逊云科技存储服务之间的数据移动服务。

方案实践

前置条件

本文假设您已熟悉 Amazon EC2、Amazon Cloud Development Kit(Amazon CDK)、Docker、Amazon Elastic Container Registry(Amazon ECR)、Amazon Elastic Kubernetes Service(Amazon EKS)。

本方案后续步骤的前置条件如下:

  • Kubernetes cluster 1.22+

  • Helm CLI

  • Node.js 16+

  • Amazon CDK CLI

  • An Amazon Account

  • Administrator or equivalent privilege

本方案默认使用 G5 系列机型(如需使用其它系列机型可修改运行时 Helm Chart 的配置 karpenter.provisioner.instanceType),推荐的区域(Region)如下:

  • US East (N. Virginia) us-east-1

  • US West (Oregon) us-west-2

本方案建议准备一个可访问互联网的调试部署环境,该环境需要能运行 Amazon cli、Git、Docker、NPM、Amazon CDK、kubectl、eksctl 等命令。我们建议您使用 Amazon Cloud9 或 Amazon SageMaker Notebook  来进行部署。

  • Amazon Cloud9:

    https://aws.amazon.com/cn/cloud9/

  • Amazon SageMaker Notebook:

    https://aws.amazon.com/cn/sagemaker/notebooks/

环境部署

环境准备:

我们的方案已在 Github 上开源。地址为:

https://github.com/aws-samples/stable-diffusion-on-eks

运行以下命令以获取源代码和部署脚本:

git clone --recursive https://github.com/aws-samples/stable-diffusion-on-ekscd stable-diffusion-on-eks

左滑查看更多

请参考我们的实施指南,会帮助您一步一步完成方案的环境部署:

https://aws-samples.github.io/stable-diffusion-on-eks/zh/implementation-guide/deployment/

方案效果

方案部署完成以后,我们可以使用代码或者 Postman 等方式构造 http 请求并发送,将获取的 API Endpoint 做为请求 URL,Method 为 Post,Body 为 application/json,示例 Payload 如下(请将注释移除后使用):

文生图:

{
    "alwayson_scripts": {
        // 必要,任务类型
        "task": "text-to-image",
        // 必要,基础模型名称,关联队列分发或模型切换
        "sd_model_checkpoint": "v1-5-pruned-emaonly.safetensors",
        // 必要,任务ID,在上传结果图片和返回响应时会用到
        "id_task": "21123",
        "uid": "456",
        "save_dir": "outputs"
    },
    // 以下皆为官方参数,使用默认值或者直接传入即可
    "prompt": "A dog",
    "steps": 30,
    "width": 768,
    "height": 768
}

左滑查看更多

文生图结果:

19bfacc57a04e13be102117063f9a4b2.png

图生图:

{
    "alwayson_scripts": {
        // 必要,任务类型
        "task": "image-to-image",
        // 必要,输入图片的url
        "image_link": "https://www.segmind.com/sd-img2img-input.jpeg",
        // 必要,任务ID,在上传结果图片和返回响应时会用到
        "id_task": "31311",
        // 必要,基础模型名称,关联队列分发或模型切换
        "sd_model_checkpoint": "v1-5-pruned-emaonly.safetensors",
        // 非必要,用户id
        "uid": "456"
    },
    // 以下皆为官方参数,使用默认值或者直接传入即可
    "prompt": "A fantasy landscape, trending on artstation, mystical sky",
    "steps": 16,
    "width": 512,
    "height": 512
}

左滑查看更多

图生图结果:

7b8d0e5831b889d89ccced1edcf0cf3d.png

注:结果图片和响应数据,会存储到相关的 S3 output bucket 中以便后续访问。

方案细节

更快的启动时间:toC 业务往往具有高并发的特点,为了迅速响应请求,本方案使用 Karpenter 进行 node 的弹性伸缩,底层直接调用了 EC2 fleet API,结合基于 Bottlerocket 构建的 snapshot,使得服务冷启动时间最快可达到 1 分钟内。

# a sample config for karpenter nodeTemplate
modelsRuntime:
- name: "sample1"
  namespace: "sample1"
  modelFilename: "v1-5-pruned-emaonly.safetensors"
  extraValues:
    karpenter: 
      nodeTemplate:
        amiFamily: Bottlerocket
        dataVolume:
          volumeSize: 80Gi
          volumeType: gp3
          deleteOnTermination: true
          iops: 4000
          throughput: 1000
          snapshotID: snap-0c31434acc0a8a558

左滑查看更多

更低的成本:通过使用 Spot 实例和混合 GPU 实例大幅度降低推理成本。虽然 Spot 实例有被回收的风险,但由于 Stable Diffusion 单任务耗时短且无状态,而且在 Spot 实例回收前会处理相应事件并重新启动新的实例,故 Spot 实例完全可以胜任该场景推理需求。Karpenter 默认使用 pricing-capacity-optimized 的 Spot 实例选择策略,会优先使用回收风险最低,且最廉价的 Spot 实例类型。当遇到 Spot 实例无法启动时,将以 On-demand 方式启动,且支持异构和不同家族的实例。

# a sample config for karpenter provisioner
modelsRuntime:
- name: "sample1"
  namespace: "sample1"
  modelFilename: "v1-5-pruned-emaonly.safetensors"
  extraValues:
    karpenter: 
      provisioner:
        instanceType:
        - "g5.xlarge"
        - "g5.2xlarge"
        - "g4dn.xlarge"
        - "g4dn.2xlarge"

左滑查看更多

更简单的控制平面:EKS 可直接使用 Karpenter 和 KEDA 等社区组件进行任务调度和弹性伸缩,使用 Amazon SQS 的消息数作为弹性指标更贴近实际业务需求。

# a sample config for scaling
modelsRuntime:
- name: "sample1"
  namespace: "sample1"
  modelFilename: "v1-5-pruned-emaonly.safetensors"
  extraValues:
    sdWebuiInferenceApi:
      scaling:
        queueLength: 10
        cooldownPeriod: 60
        pollingInterval: 1
        maxReplicaCount: 10
        minReplicaCount: 1
      inferenceApi:
        image:
          repository: 123456789012.dkr.ecr.us-west-2.amazonaws.com/sd-on-eks/inference-api
          tag: abcd1
      queueAgent:
        image:
          repository: 123456789012.dkr.ecr.us-west-2.amazonaws.com/sd-on-eks/queue-agent
          tag: latest
      persistence:
        enabled: true
        existingClaim: "efs-model-storage-pvc"

左滑查看更多

更灵活的设计:可以使用多个 Amazon SQS 队列并结合 Amazon SNS 的 filter 功能,来满足不同业务场景的架构设计需求。例如通过创建针对特定基础模型的专用队列,避免基础模型频繁切换以加快特定模型的生图速度,而对于需要切换主模型的请求可以将其路由到专门的动态队列处理。例如为付费用户的请求设置单独的专用队列,用更多的资源提供更好的服务等。

// lib/runtime/sdRuntime.ts
if (!this.options.dynamicModel) {
  this.options.inputSns!.addSubscription(new aws_sns_subscriptions.SqsSubscription(inputQueue, {
    filterPolicy: {
      sd_model_checkpoint:
        sns.SubscriptionFilter.stringFilter({
          allowlist: [this.options.sdModelCheckpoint]
        })
    }
  }))
  generatedValues.sdWebuiInferenceApi.queueAgent.dynamicModel = false
} else {
  this.options.inputSns!.addSubscription(new aws_sns_subscriptions.SqsSubscription(inputQueue, {
    filterPolicy: {
      sd_model_checkpoint:
        sns.SubscriptionFilter.stringFilter({
          denylist: this.options.allModels
        })
    }
  }))
  generatedValues.sdWebuiInferenceApi.queueAgent.dynamicModel = true
}

左滑查看更多

更精细的并发控制:将 Queue Agent 与 SD WebUI 部署在同一 Pod,以拉的模式来处理异步任务,能够对并发进行灵活精细的控制,缓解了 SD WebUI 负载过重无法响应或超时等问题,同时也方便调整超时时间和重试策略等参数来进行针对性优化。

# src/backend/queue_agent/main.py
queue = sqsRes.Queue(sqs_queue_url)
SQS_WAIT_TIME_SECONDS = 20
check_readiness()
while True:
    received_messages = receive_messages(queue, 1, SQS_WAIT_TIME_SECONDS)
    for message in received_messages:
        try:
            if taskType == 'text-to-image':
                r = invoke_txt2img()
            elif taskType == 'image-to-image':
                r = invoke_img2img()
        except Exception as e:
            traceback.print_exc()
        finally:
            handle_outputs()
            delete_message(message)

左滑查看更多

更好的兼容性:对 SD WebUI Runtime 无侵入,可兼容官方各版本的 Runtime 或客户定制的 Runtime,将定制化的部分放到 Queue Agent 以方便二次开发。支持异步响应以多种方式(Http/Https/SQS)发送到目标和 Amazon SageMaker 异步响应规范。

更直观的监控:集成了 Amazon X-Ray、Amazon CloudWatch 和 Amazon Distro for OpenTelemetry,可以更直观地跟踪整个流程,查看日志和相关指标(例如:流程各环节调用状态和耗时/共享存储的 IO/工作节点的负载等)。

af08ee5ff1b98274317dd0598c98b78b.png

更方便易用:方案基于 Amazon CDK 自动进行部署(根据不同环境估算约 30-40 分钟),并提供了模型文件自动同步(Amazon S3 → Amazon EFS)、模型文件批量下载上传、图片浏览应用等辅助工具。

结论

作为开源多模态生成式 AI 领域的领导者,Stability.ai 推出了更为强大的 Stable Diffusion XL 1.0,并发布在 Amazon BedRock 上。

本文介绍了一种扩容迅速、成本低、维护方便的 Stable Diffusion 开源方案,适合熟悉容器,无服务器并需要以快速扩展和低成本方式部署 Stable Diffusion 模型的学生、设计师和开发人员,应用在高速发展的 toC 业务中。亚马逊云科技致力于为客户提供丰富而功能强大的图像生成方案,也支持开源并持续推动优化,为业务创新提供更好的助力。

本篇作者

d489bf5be72fd679b262071da3cd8d6e.jpeg

陆从尧

亚马逊云科技解决方案架构师,负责基于亚马逊云科技云平台的解决方案咨询和设计。从业十七年,担任过研发经理、架构师等多种角色,有多年的互联网软件研发、系统架构设计及开发经验

ef1a3c65df68ac5fd29b588c9c46b25d.jpeg

孙华

亚马逊云科技资深无服务器产品专家。在过去的 20 多年一直从事软件架构、程序开发以及技术推广等领域的工作。他擅长 Web 领域应用、SaaS 系统和云呼叫中心开发,也从事过多个大型软件项目的设计、开发与项目管理。目前他专注与云计算以及互联网等技术领域,致力于帮助中国的 开发者构建基于云计算的新一代的互联网应用。

0e3de7e770af744abfa28a9cbf896604.jpeg

于昺蛟

亚马逊云科技现代化应用解决方案架构师,负责亚马逊云科技容器和无服务器产品的架构咨询和设计。在容器平台的建设和运维,应用现代化,DevOps 等领域有多年经验,致力于容器技术和现代化应用的推广。

f18b25fa6d916d484d998995ca04985b.gif

星标不迷路,开发更极速!

关注后记得星标「亚马逊云开发者」

5c9c23f999e02d255f37eecdc4a9159d.gif

听说,点完下面4个按钮

就不会碰到bug了!

35ae6f616b0a097a5fced478218a365f.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/127818.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SAP 40策略测试及简介

相信很多很多的行业中都会用到40策略按库存生产,接下来我们将详细的测试40策略 1、首先准备好成品物料AB2。 2、创建BOM—cs01 3、创建主配方C202 ,如果是离散制造的话就是创建工艺路线CA01 4、创建生产版本C223 5、同样的AB2物料增加库存20KG。 6、创建计划独立需求MD…

微信智能机器人开发-基于E云管家,实现强大的个微管理

本文介绍了如何利用E云管家开发一个功能丰富的微信智能机器人。E云管家是一个开发协议,为微信机器人提供了强大的功能支持,包括关键字回复、自动通过好友和自动发朋友圈等特性。我们将通过一个简单的示例演示如何在E云管家下实现这些功能,并附…

EMERSON艾默生变频器维修M600/M701/M702

艾默生变频器维修常见系列: EV1000 系列:体积小,操作简便,适用于塑料机械、纺织机械、烟草机械、陶瓷机械、制药机械食品机械、印刷机械、包装机械、空调等专用设备配套。 EV2000 系列:功率范围广,功能更…

2020年五一杯数学建模B题基于系统性风险角度的基金资产配置策略分析解题全过程文档及程序

2020年五一杯数学建模 B题 基于系统性风险角度的基金资产配置策略分析 原题再现 近年来,随着改革开放程度的不断提高,我国经济运行中的各种风险逐渐暴露并集中传导和体现于金融领域。党的“十九大”报告提出“守住不发生系统性金融风险的底线”要求&am…

企业组建客服中心,需要考虑哪些问题?

随着市场竞争的加剧,企业越来越注重客户服务。因此,组建一个专业的客服中心已成为企业的一个重要战略举措。然而,这个任务不仅需要考虑技术和人员方面的问题,还需要考虑许多其他的因素。在本文中,我们将探讨企业在组建…

使用双动态令牌混合器学习全局和局部动态以进行视觉识别

TransXNet: Learning Both Global and Local Dynamics with a Dual Dynamic Token Mixer for Visual Recognition 1、问题与解决2、引言3、方法3.1 双动态令牌混合器(D- Mixer)3.2 IDConv(Input-dependent Depthwise Convolution)3.3 Overlapping Spatial Reduction Attention …

Java 身份证号校验,根据身份证号识别出生地

Java 身份证号校验: import org.apache.commons.lang.StringUtils;import java.util.Calendar; import java.util.Collections; import java.util.HashMap; import java.util.Map;/*** desc 身份证工具类* auth llp* date 2022/7/7 16:13*/ public class IdCardNum…

神仙打架!腾讯云阿里云谁更棋高一着?

现在,腾讯云和阿里云都在打价格战,推出了一系列的优惠政策。其中,腾讯云服务器只需要88元,而阿里云服务器也只需要99元。这么便宜的价格,是不是让你心动不已呢? 腾讯云的88元服务器:https://te…

MySQL优化方案

Mysql优化 一、连接配置优化1.服务端配置2.客户端优化 二、架构优化1.使用缓存2.做读写分离(集群、主从复制)3.分库分表3.1.垂直分库3.2.垂直分表3.3.水平分表3.4.水平分库 4.消息队列削峰 三、优化器——SQL分析与优化1.慢查询优化1.1.配置慢查询日志1.…

第三方支付支付宝的信息安全分析

随着信息技术的进步,网络结算方式也在迅速发展。网上结算虽然便捷快速,但是如果没有保障的平台或者法律的支持,双方在没有约束的情况下,就会导致拖延、折扣或者拒付等许多经济事件的发生,由此第三方支付就随之产生。第…

嵌入式开发:ST-LINK V2.1仿真器,Type-C接口

标题ST-LINK V2.1仿真器,Type-C接口 之前做的版本虽然也是V2.1的,但使用的接口是USB的Micro形式,不支持正反插,也不兼容现在通用的手机数据线,出差的时候又要多带一条线。 现在终于把我的ST-LINK的接口改了一下 如下…

oracle11G在linux环境下的卸载操作

1.使用SQL*PLUS停止数据库 [oracleOracleTest oracle]$ sqlplus / as sysdba SQL> shutdown [immediate] SQL> exit2.停止Listener [oracleOracleTest oracle]$ lsnrctl stop3.停止HTTP服务 [rootOracleTest /root]# service httpd stop4.用su或者重新登录到root(如想…

『吴秋霖赠书活动 | 第四期』《Spring Boot微服务实战》

文章目录 1. 写在前面2. Spring Boot介绍3. Spring Boot实战4. Spring Boot主要内容概览 1. 写在前面 【作者主页】:吴秋霖 【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作! 【…

视频剪辑方法:为视频剪辑添加亮点,如何制作精美的滚动字幕

在视频剪辑中,滚动字幕是一个重要的元素,它可以为视频增添视觉吸引力,增强观看体验。滚动字幕的长度和速度也是非常重要的因素。如果滚动字幕太长,会让人感到拖沓;如果滚动字幕太短,会让人感到匆忙。因此&a…

安装dock打包前端项目遇到的一些错误

1docker安装报错 2 docker安装报错 运行 wsl --list报错 wsl --list 适用于 Linux 的 Windows 子系统没有已安装的分发版。 可以通过访问 Microsoft Store 来安装分发版解决方法 如果执行 wsl --list 命令报告适用于 Linux 的 Windows 子系统没有已安装的分发版,…

Git的安装,简介以及常用命令【超详细】

目录 一. Git简介 分布式特点 优缺点 Git 与 SVN 区别 二. Git安装 三. Git常用命令 四. Git的文件状态 1.文件状态 2.工作区域 一. Git简介 Git 是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。 也是Linus Torvalds…

AntDB-M高性能设计之hash索引动态rehash

AntDB-M支持hash索引、btree索引等索引类型,hash索引以hash表的方式实现,一个简单的hash表示意图如图1所示。hash桶下的元素节点为单向或者双向链表,数据行上某一个或者某几个字段组成索引,通过hash函数对索引字段的值进行运算&am…

移动机器人选择源头厂家有什么优势

在现代工业和服务领域,移动机器人应用日益广泛,广泛应用于汽车制造、电子组装、物流仓储等领域。在选择移动机器人时,选择源头厂家具有许多优势,下面将详细介绍这些优势。 一、品质保证 源头厂家的机器人经过严格的生产流程和质…

“最强”机器学习辅助!利用自然语言让机器人更好地理解开放性世界

原创 | 文 BFT机器人 想象一下,你正在国外拜访朋友,打开他的冰箱看看有没有能够制作一顿美味早餐的食材。最初,冰箱里的许多物品对你来说都很陌生,每个物品的包装都是你不熟悉的。你开始试图理解每个物品的用途,并根据…

Avalonia播放视频(mp4)

1.Nuget添加类库Dove.Avalonia.Extensions.Media,项目路径https://github.com/michael-eddy/Avalonia.Extensions/ 2.Nuget添加VideoLAN.LibVLC.Windows PlatformLibVLC PackageMinimum OS VersionWindowsVideoLAN.LibVLC.WindowsWindows XPUWPVideoLAN.LibVLC.UW…
最新文章