程序汪10万接的多平台视频分发项目,模拟人工发视频

本项目来自程序汪背后的私活小团队,开发了一个多平台分发视频项目,给粉丝分享一下解决方案和具体项目分开情况付款情况等等细节,希望给想接私活的朋友一些经验参考

程序汪10万接的多平台视频分发项目,模拟人工发视频

视频版本 在 B站【我是程序汪】

图片

目录

  • 一、项目构成

  • 二、开发人员

  • 三、项目背景

  • 四、APP端

  • 五、后端系统

项目构成

  • 系统基本构成:uniapp(app)+ java后台+selenium(蛇尼泥嗯)免费的分布式的自动化测试工具

selenium

Selenium 是一套 Web网站 的程序自动化操作 解决方案。

通过它,我们可以写出自动化程序,像真人一样在浏览器里操作web界面。比如点击界面按钮,在文本框中输入文字,在B站上发布视频 等操作。

而且还能从web界面获取信息。比如获取 12306火车、汽车票务信息,某招聘网站职位信息,财经网站股票价格信息 等等,然后用程序进行分析处理。

安装命

开发人员以及费用情况

  • 开发周期60天 

  • 开发人数 2人  1前1后

  • 工作量比例  20%前端 10%设计 70%后端

  • 整体费用是10万(不包含维护费,一期的费用哦)

  • 走的正规公司合同

  • 云服务器3台 配置 8核16G(根据情况可增加)

  • 维护费用:项目总款的10% 一年

  • 付款方式 5+4+1 (预付+验收+尾款)

项目背景

现在自媒体视频平台非常火爆,某营销公司为了推广自己的产品,当然后期也可以自己卖会员,需要在多个视频平台一键分发(抖音,B站,今日头条,小红书,快手等等 十多个平台),这样就不用人工一个个平台登陆去发视频了,效率飞速提高,目前我们集成了16个视频平台,后期可能会继续增加

图片

图片

其中关键流程

图片

APP端

本APP是用uniapp开发的,这种外包小项目肯定要选择性价比高的开发方式(程序汪知道原生的好,但开发成本也高哦),利用uniapp可以让多端开发成本降到最低

图片

图片

图片

优点

uni-app是一套可以适用多端的开源框架,一套代码可以同时生成ios,Android,H5,微信小程序,支付宝小程序,百度小程序等。

缺点

uni-app问世的时间还比较短,有很多地方还不是完善,坑很多,如果不喜欢爬坑的朋友那就少用uni-app吧

B站的核心代码

由于是商业代码,所以放出来的是比较老的版本,最新版本不敢乱发啊

核心思路基本差不多,最新版本单机变集群 还使用到了线程池等性能手段,来提高并发量

 <dependency>
      <groupId>org.seleniumhq.selenium</groupId>
      <artifactId>selenium-java</artifactId>
      <version>3.141.59</version>
  </dependency>


package com.video.browserService;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

import com.video.ThreadPool.task.workTask;
import com.video.bean.Task;
import com.video.constants.sys_constants;
import com.video.os.WindowsUtils;
import com.video.util.Base64Util;
import com.video.util.WebDriverUtil;
import com.video.util.codeUtil;

import ch.qos.logback.core.net.SyslogOutputStream;

import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;

import javax.imageio.ImageIO;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.UUID;

public class bibi_browser extends workTask{
 private WebDriver webDriver;
 private String username="";
 private String password="";
 private String path="";
 private String content="";
 private Task task;
 
 public bibi_browser(Task task,String username,
   String password,
   String path,
   String content){
  this.task=task;
  this.username=username;
  this.password=password;
  this.path=path;
  this.content=content;
 }
 @Override
 public void excute() throws IOException {
  try{
   setSerid(task.getSerid());
   webDriver=WebDriverUtil.getInstance(getSerid()).getDriver();
   task.setTask_status(1);
   Map<String,String> result=moblieLogin(username, password);
   if(result!=null
     &&result.get("result")!=null
     &&result.get("result").toString().equals("success")){
    result=UploadVideo(path,content);
    task.setResult(result);
   }else{
    task.setResult(result);
   }
   task.setTask_status(3);
  }catch(Exception e){
   Map<String,String> result=new HashMap<String,String>();
   result.put("result", "error");
   result.put("msg", "上传视频异常");
   task.setResult(result);
   task.setTask_status(3);
  }
  sys_constants.taskMap.put(task.getSessionId(), task);
 }
 @Override
 public String info() {
  // TODO Auto-generated method stub
  return null;
 }
 public Map<String,String> moblieLogin(String username,String password){
  //webDriver.manage().deleteAllCookies();
     Map<String,String> resultMap=new HashMap<String,String>();
     try{
      webDriver.get("https://www.bilibili.com/");
      WebDriverUtil
   .getInstance(getSerid()).WebDriverWaitElement(
     10,
     1,
     By.xpath("//img[contains(@class,'bili-avatar-img bili-avatar-face bili-avatar-img-radius')]"));
   
   WebElement head_img=WebDriverUtil
        .getInstance(getSerid())
        .findElement(By.xpath("//img[contains(@class,'bili-avatar-img bili-avatar-face bili-avatar-img-radius')]"));
   if(head_img!=null){
    resultMap.put("result", "success");
    resultMap.put("msg", "登录成功");
    return resultMap;
   }
   WebElement login_btn=WebDriverUtil
   .getInstance(getSerid()).findElement(
     By.xpath("//*[@id='i_cecream']/div[1]/div[1]/ul[2]/li[8]/li/a/div/span"));
   
   if(login_btn!=null){
    login_btn.click();
   }
   WebDriverUtil
   .getInstance(getSerid()).WebDriverWaitElement(
     10,
     1,
     By.xpath("//div[@id='geetest-wrap']"));
   *[@id="layout"]/div/div[2]/p[1]/a
   WebElement sms_btn=WebDriverUtil
   .getInstance(getSerid()).findElement(
     By.xpath("//*[@id='geetest-wrap']/div/div[1]/span[2]"));
   
   if(sms_btn!=null){
    sms_btn.click();
   }
   
      WebDriverUtil
   .getInstance(getSerid()).WebDriverWaitElement(
     10,
     1,
     By.xpath("//a[contains(@class,'btn btn-login')]"));
   
      //输入手机号码
   WebElement userinput =WebDriverUtil
        .getInstance(getSerid())
        .findElement(By.xpath("//input[@name='tel']"));
   if(userinput!=null){
    userinput.sendKeys(username);
   }
   //点击发送短信按钮
   WebElement sendMobile =WebDriverUtil
        .getInstance(getSerid())
        .findElement(By.xpath("//button[contains(@class,'el-button captcha-buttom el-button--primary')]"));
   if(sendMobile!=null){
    sendMobile.click();
    try{
     Thread.currentThread().sleep(2000);

     WebElement backimg=WebDriverUtil
          .getInstance(getSerid())
          .findElement(By.xpath("//img[@class='geetest_item_img']"));
     WebElement clickimg=WebDriverUtil
          .getInstance(getSerid())
          .findElement(By.xpath("//div[@class='geetest_tip_img']"));
     if(backimg!=null){
      String baseimg="";
      if(clickimg!=null){
       File src =clickimg.getScreenshotAs(OutputType.FILE);
          baseimg=WebDriverUtil
          .getInstance(getSerid())
          .captureElement(src, clickimg);
      }
      File backsrc =backimg.getScreenshotAs(OutputType.FILE);
      String back_img=WebDriverUtil
         .getInstance(getSerid())
         .captureElement(backsrc, backimg);
      //String back_img=Base64Util.imgBase64(backimg.getAttribute("src"));
         String result=codeUtil.loadCodeResult("27",back_img,null, null, baseimg);
         if(result!=null&&!result.trim().equals("")){
          String []xys=result.split("\\|");
          if(xys!=null&&xys.length>0){
           WebDriverUtil
              .getInstance(getSerid()).moveAndClick(backimg,xys);
          }
          WebElement que_btn=WebDriverUtil
               .getInstance(getSerid())
               .findElement(By.xpath("//a[@class='geetest_commit']"));
          if(que_btn!=null){
           que_btn.click();
          }
         }else{
          resultMap.put("result", "error");
          resultMap.put("msg", "验证码识别错误,登录失败");
          return resultMap;
         }
     }
    
    }catch(Exception e){
     e.printStackTrace();
    }
   }
   //输入短信验证码
   WebElement pwdinput =WebDriverUtil
        .getInstance(getSerid())
        .findElement(By.xpath("//input[contains(@class,'el-input__inner') and contains(@type,'text') and contains(@placeholder,'请输入短信验证码')]"));
   if(pwdinput!=null){
    String mobilemsg="";
    long time=new Date().getTime();
    task.setTask_status(2);
    while(sys_constants.mobilemsg.get(task.getSessionId())==null
      &&(new Date().getTime()-time<5*60*1000)){
     Thread.currentThread().sleep(5000);
    }
    mobilemsg=sys_constants.mobilemsg.get(task.getSessionId());
    if(mobilemsg!=null&&!mobilemsg.trim().equals("")){
       pwdinput.sendKeys(mobilemsg);
    }else{
     resultMap.put("result", "error");
     resultMap.put("msg", "请输入短信验证码,登录失败");
     return resultMap;
    }
   }
   WebElement submit_btn=WebDriverUtil
        .getInstance(getSerid())
        .findElement(By.xpath("//a[contains(@class,'btn btn-login') and contains(string(), '登录')]"));
   if(submit_btn!=null){
    submit_btn.click();
    //error-- 为保证账号安全,请使用手机验证码登录
    Thread.currentThread().sleep(1000);
    WebDriverUtil
    .getInstance(getSerid()).WebDriverWaitElement(
      10,
      1,
      By.xpath("//a[@class='avatar el-popover__reference']"));
    
    WebElement img_btn=WebDriverUtil
         .getInstance(getSerid())
         .findElement(By.xpath("//a[@class='avatar el-popover__reference']"));
    
    if(img_btn!=null){
     resultMap.put("result", "success");
        resultMap.put("msg", "登录成功");
    }else{
     resultMap.put("result", "error");
     resultMap.put("msg", "登录失败");
     return resultMap;
    }
   }
     
     }catch(Exception e){
      e.printStackTrace();
      resultMap.put("result", "error");
   resultMap.put("msg", "登录异常,请求页面异常");
     }
     return resultMap;
 }
 /**
  * 浏览器登录B站
  * @return
  */
    public Map<String,String> login(String username,String password){
     //webDriver.manage().deleteAllCookies();
     Map<String,String> resultMap=new HashMap<String,String>();
     return resultMap;
    }
    public Map<String,String> UploadVideo(String path,String content){
     Map<String,String> resultMap=new HashMap<String,String>();
     try{
      webDriver.get("https://member.bilibili.com/platform/upload/video/frame");
      WebDriverUtil
   .getInstance(getSerid()).WebDriverWaitElement(
     2,
     1,
     By.xpath("//div[@class='guide_left__wrap']/div[@class='tips_wrap']/img[@class='jump']"));
      
      WebElement guide_left_btn=WebDriverUtil
        .getInstance(getSerid())
        .findElement(By.xpath("//div[@class='guide_left__wrap']/div[@class='tips_wrap']/img[@class='jump']"));
      if(guide_left_btn!=null&&guide_left_btn.isDisplayed()){
       guide_left_btn.click();
      }
      WebDriverUtil
   .getInstance(getSerid()).WebDriverWaitElement(
     2,
     1,
     By.xpath("//div[@class='guide_right__wrap']/div[@class='tips_wrap']/img[@class='jump']"));
      
      WebElement guide_right_btn=WebDriverUtil
        .getInstance(getSerid())
        .findElement(By.xpath("//div[@class='guide_right__wrap']/div[@class='tips_wrap']/img[@class='jump']"));
      if(guide_right_btn!=null&&guide_right_btn.isDisplayed()){
       guide_right_btn.click();
      }
      
      WebDriverUtil
   .getInstance(getSerid()).WebDriverWaitElement(
     10,
     1,
     By.id("video-up"));
      WebDriverUtil
   .getInstance(getSerid())
   .getDriver()
   .switchTo()
   .frame("videoUpload");
      ((JavascriptExecutor)WebDriverUtil
        .getInstance(getSerid()).getDriver()).executeScript("document.getElementsByTagName('input').style='display:block';");
      WebElement upload_btn=WebDriverUtil
        .getInstance(getSerid())
        .findElement(By.xpath("//*[@id='video-up-app']/div/div[2]/div/div[1]/div/div/input"));
      if(upload_btn!=null){
       //upload_btn.setAttribute("value", "D:\\CRM生成代码\\VID_20211113_111758.mp4");
       upload_btn.sendKeys(path);
       
//       List<String> imglist=videoImage(path, 960, 600);
//       WebElement upload_img_btn=WebDriverUtil
//            .getInstance(getSerid())
//            .findElement(By.xpath("//input[@type='file']"));
//       for(String img:imglist){
//        upload_img_btn.sendKeys(img);
//        Thread.currentThread().sleep(5000);
//       }
       WebDriverUtil
       .getInstance(getSerid()).WebDriverWaitElement(
         10*60,
         5,
         By.xpath("//span[contains(@class, 'success') and contains(string(),'上传完成')]"));
       
       WebElement finish_text=WebDriverUtil
            .getInstance(getSerid())
            .findElement(By.xpath("//span[contains(@class, 'success') and contains(string(),'上传完成')]"));
       if(finish_text.isDisplayed()){//上传完成
        Thread.currentThread().sleep(1000);//等待5秒加载完
        WebElement tag_text=WebDriverUtil
                .getInstance(getSerid())
                .findElement(By.xpath("//div[@class='tag-list']/div[2]"));
        if(tag_text!=null){
         tag_text.click();
        }
        WebElement title_text=WebDriverUtil
                .getInstance(getSerid())
                .findElement(By.xpath("//input[contains(@class, 'input-val') and contains(@placeholder, '请输入稿件标题')]"));
           if(title_text!=null){
            title_text.sendKeys(content);
           }
        WebElement desc_text=WebDriverUtil
                .getInstance(getSerid())
                .findElement(By.xpath("//div[contains(@class, 'ql-editor ql-blank') and contains(@placeholder, '填写更全面的相关信息,让更多的人能找到你的视频吧')]"));
           if(desc_text!=null){
               desc_text.sendKeys(content);
           }
           WebElement submit_btn=WebDriverUtil
                .getInstance(getSerid())
                .findElement(By.xpath("//span[contains(@class, 'submit-add') and contains(string(),'立即投稿')]"));
           if(submit_btn!=null){
            Thread.currentThread().sleep(1000);
            submit_btn.click();
            try{
             WebElement success_text=WebDriverUtil
                  .getInstance(getSerid())
                  .findElement(By.xpath("//div[contains(@class, 'step-des') and contains(string(), '稿件投递成功')]"));
             if(success_text!=null){
              resultMap.put("result", "success");
              resultMap.put("msg", "视频上传成功");
             }
            }catch(Exception e){
             resultMap.put("result", "success");
             resultMap.put("msg", "视频上传成功");
            }
           }
       }
      }
     }catch(Exception e){
      e.printStackTrace();
      resultMap.put("result", "error");
   resultMap.put("msg", "视频上传异常,检测是否视频文件");
     }
     return resultMap;
    }
    /**
     * 截取视频第六帧的图片
     *
     * @param filePath 视频路径
     * @param dir      文件存放的根目录
     * @return 图片的相对路径 例:pic/1.png
     */
    public  List<String> videoImage(String filePath,int width,int height) throws Exception {
        String pngPath = "";
//        FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault(filePath);
        File file=new File(filePath);
        String dir=file.getParent()+"/";
        System.out.println(dir);
        FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault(file);
        List<String> list=new ArrayList<String>();
        ff.start();
        int ffLength = ff.getLengthInFrames();
        Frame f;
        int i = 0;
        int m=0;
        while (i < ffLength) {
            f = ff.grabFrame();
            //截取第6帧
            if ((i > 5&&i%20==0) && (f.image != null)) {
                //生成图片的相对路径 例如:pic/uuid.png
                pngPath = getPngPath();
                //执行截图并放入指定位置
                System.out.println("存储图片 : " + (dir + pngPath));
                doExecuteFrame(f, dir + pngPath,width,height);
                list.add(dir + pngPath);
                m++;
                if(m>4)break;
            }
            i++;
        }
        ff.stop();

        return list;
    }

    /**
     * 生成图片的相对路径
     *
     * @return 图片的相对路径 例:pic/1.png
     */
    private static String getPngPath() {
        return getUUID() + ".png";
    }


    /**
     * 生成唯一的uuid
     *
     * @return uuid
     */
    private static String getUUID() {
        return UUID.randomUUID().toString().replace("-", "");
    }


    /**
     * 截取缩略图
     *
     * @param f                       Frame
     * @param targerFilePath:封面图片存放路径
     */
    private static void doExecuteFrame(Frame f, String targerFilePath,int width,int height) {
        String imagemat = "png";
        if (null == f || null == f.image) {
            return;
        }
        Java2DFrameConverter converter = new Java2DFrameConverter();
        BufferedImage bi = converter.getBufferedImage(f);
        BufferedImage thumbimg = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
        thumbimg.getGraphics().drawImage(bi.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
        File output = new File(targerFilePath);
        try {
            ImageIO.write(thumbimg, imagemat, output);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}



难点

  • 适配各种视频平台

后端需要利用selenium模拟各种平台的视频上传操作,这块工作量是最大的,另外如果平台升级了,可能会影响开发的接口功能,需要跟着调整对应平台的功能接口,遇要验证还需要利用打码平台(机器验证码)

AI   训练集

图片

下图是核心后端API,下面是利用Apifox的免费功能,输出的API文档

图片

私活合作加VX:itwang007

参考文档:

  1. 某打码平台

    http://www.kuaishibie.cn/?spm=null

  2. 免费的分布式的自动化测试工具 

    http://www.selenium.org.cn/

  3. uniapp

    https://uniapp.dcloud.net.cn/

  4. APIFOX

    https://www.apifox.cn/

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

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

相关文章

LabVIEW挖坑指南

一、挖坑指南 1.1、输出变量放在条件框内 错误写法&#xff1a; 现象&#xff1a;如果没进入对应的分支&#xff0c;输出为默认值 正常写法&#xff1a; 让每个分支输出的值都在预料之内。 1.2、统计耗时不准 错误写法 现象&#xff1a;统计出来的耗时是2000ms 正常写法&a…

redis发布订阅模式

需要两个终端。 首先我们打开第一个终端&#xff0c;使用SUBSCRIBE命令来订阅一个频道。 打开另一个终端&#xff0c;发布信息使用PUBLISH&#xff0c;后面加上频道的名称和消息的内容 返回去看第一个终端 订阅频道的终端可以有多个。但是订阅频道有一些局限性&#xff0c;比如…

【web】nginx+php-fpm云导航项目部署-(简版)

一、yum安装nginx yum -y install nginx 二、php环境安装 2.1 php安装 yum -y install php 2.2 php-fpm安装 yum -y install php-fpm 注&#xff1a;PHP在 5.3.3 之后已经讲php-fpm写入php源码核心了。 2.3 项目依赖的php-xml和php-xmlrpc安装 yum -y install php-…

展馆设计中融入数字化和智能化元素

一、多媒体技术的应用 展馆设计公司可以通过应用多媒体技术&#xff0c;为展馆创造一个数字化和互动式的环境。利用投影技术、触摸屏和交互式设备&#xff0c;可以实现展示内容的多样化和互动式展示。通过数字化的展示方式&#xff0c;观众可以更加深入地了解和体验展示内容&am…

【HTML】注册页面制作 案例二

&#xff08;大家好&#xff0c;今天我们将通过案例实战对之前学习过的HTML标签知识进行复习巩固&#xff0c;大家和我一起来吧&#xff0c;加油&#xff01;&#x1f495;&#xff09; 案例复习 通过综合案例&#xff0c;主要复习&#xff1a; 表格标签&#xff0c;可以让内容…

基于深度学习的危险物品检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

摘要&#xff1a;本文详细介绍基于YOLOv8/v7/v6/v5的危险物品检测技术。主要采用YOLOv8技术并整合了YOLOv7、YOLOv6、YOLOv5的算法&#xff0c;进行了细致的性能指标对比分析。博客详细介绍了国内外在危险物品检测方面的研究现状、数据集处理方法、算法原理、模型构建与训练代码…

3D打印模型检查清单

创建 3D 打印模型一开始可能会有些令人生畏。 在这篇博文中&#xff0c;我们将介绍设计师应牢记的一些基本技巧&#xff0c;以获得令人惊叹的 3D 打印效果。 遵守此清单将确保你的 3D 模型为 3D 打印做好充分准备。 1、水密/非流形 可打印模型的表面不得有任何孔。 问自己一个…

漂亮哇塞的可视化大屏页面该如何设计?

要提升可视化界面的设计美观度&#xff0c;可以从以下几个方面入手&#xff1a; 使用高质量的图片和素材&#xff1a;使用高质量的图片和素材可以让界面更加美观。可以选择高清晰度的图片和素材&#xff0c;使得整个界面的质感更加高端。突出重点&#xff1a;在界面设计中&…

Vue3:Pinia简介及环境搭建

一、简介 Pinia是Vue3中的状态管理工具&#xff0c;类似与Vue2中的Vuex框架的作用 二、环境搭建 1、安装 npm install pinia2、配置 main.ts import {createApp} from vue import App from ./App.vue // 第一步&#xff1a;引入pinia import {createPinia} from piniacons…

与谷歌“分家”两年后,SandboxAQ推出统一加密管理平台

3月27日&#xff0c;SandboxAQ宣布其AQtive Guard平台现已全面可用&#xff08;GA&#xff09;&#xff0c;适用于所有行业&#xff0c;以防范人工智能驱动和量子攻击的威胁。前者是在两年前3月从谷歌母公司Alphabet分拆出来的初创公司&#xff0c;并在当时获得了“九位数”的融…

Mybatis——一对多关联映射

一对多关联映射 一对多关联映射有两种方式&#xff0c;都用到了collection元素 以购物网站中用户和订单之间的一对多关系为例 collection集合的嵌套结果映射 创建两个实体类和映射接口 package org.example.demo;import lombok.Data;import java.util.List;Data public cla…

Canvas实现简易数字电子时钟(带自定义样式)

前置内容 Canvas实现简易数字电子时钟 Canvas实现数字电子时钟&#xff08;带粒子掉落效果&#xff09; 效果 逻辑代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>粒子时钟-完整版</title&g…

OpenHarmony实战:轻量系统芯片移植准备

由于OpenHarmony工程需要在Linux环境下进行编译&#xff0c;此章节将指导厂商搭建OpenHarmony的编译环境、获取OpenHarmony源码&#xff0c;并且创建厂商工作目录完成厂商芯片的编译框架适配。 搭建编译环境 开展移植前请参考开发环境准备完成环境搭建工作。 获取源码 获取…

【蓝桥杯第十三届省赛B组】(部分详解)

九进制转十进制 #include <iostream> #include<math.h> using namespace std; int main() {cout << 2*pow(9,3)0*pow(9,2)2*pow(9,1)2*pow(9,0) << endl;return 0; }顺子日期 #include <iostream> using namespace std; int main() {// 请在此…

《剑指 Offer》专项突破版 - 面试题 101、102、103 和 104 : 和动态规划相关的背包问题(C++ 实现)

目录 前言 面试题 101 : 分割等和子集 面试题 102 : 加减的目标值 面试题 103 : 最少的硬币数目 方法一 方法二 面试题 104 : 排列的数目 前言 背包问题是一类经典的可以应用动态规划来解决的问题。背包问题的基本描述如下&#xff1a;给定一组物品&#xff0c;每种物品…

策略到成果:六西格玛培训在各行业中的转化与实施

六西格玛培训作为一种管理方法论&#xff0c;已经在多个行业中得到应用&#xff0c;并为这些行业带来了显著的贡献。下面张驰咨询给大家介绍几个主要行业的应用情况&#xff1a; 制造业&#xff1a;在制造业中&#xff0c;六西格玛的应用可以带来显著的质量和成本优势。通过减…

Open-Sora环境搭建推理测试

引子 Sora&#xff0c;2024年2月15日&#xff0c;OpenAI发布的人工智能文生视频大模型。支持60秒视频生成&#xff0c;震荡了国内国际学术圈、广告圈、AI教培圈。Sora最主要有三个优点&#xff1a;第一&#xff0c;“60s超长视频”&#xff0c;之前文本生成视频大模型一直无法真…

Qt实现Kermit协议(三)

3 实现 3.2 KermitSendFile 该模块实现了Kermit发送文件功能。 序列图如下&#xff1a; 3.2.1 KermitSendFile定义 class QSerialPort; class KermitSendFile : public QObject, public Kermit {Q_OBJECT public:explicit KermitSendFile(QSerialPort *serial, QObject *…

比特币和区块链详解: Bitcoin: A Peer-to-Peer Electronic Cash System白皮书

背景 考虑当前手机上的余额、手里的现金&#xff0c;其实本质都归属于银行发给我们的欠条&#xff0c;是在政府监管下的流通货币。当我们在做交易时&#xff0c;银行属于可信第三方&#xff0c;银行发行的货币在交易过程中起到了重要作用。但基于金融机构的受信任第三方容易受…

使用pytorch构建带梯度惩罚的Wasserstein GAN(WGAN-GP)网络模型

本文为此系列的第三篇WGAN-GP&#xff0c;上一篇为DCGAN。文中仍然不会过多详细的讲解之前写过的&#xff0c;只会写WGAN-GP相对于之前版本的改进点&#xff0c;若有不懂的可以重点看第一篇比较详细。 原理 具有梯度惩罚的 Wasserstein GAN (WGAN-GP)可以解决 GAN 的一些稳定性…