如何通过vue+ flask实现视频的合成及上传

目录

拖拽上传
上传文件
flask处理文件
拼接获取文件路径
首先我们看flask
前端获取
配置代理说明
额外说明(如果你使用uni-app)
完整代码
flask代码
md5random.py 用于随机字符串生成
app_service.py 服务代码
vue代码
vue+flask实现视频合成
效果如下

在这里插入图片描述

拖拽上传我们之前一个文章有写过
//www.jb51.net/article/206543.htm

原理就是 监听drop事件 来获取拖拽的文件列表

在这里插入图片描述
在这里插入图片描述

上传文件
通过axios 上传文件

this,.fileList就是我们的文件列表

let files = this.fileList;
let formd = new FormData();
let i = 1;

//添加上传列表
files.forEach(item => {
formd.append(i + “”, item, item.name)
i++;
})
formd.append(“type”, i)
let config = {
headers: {
“Content-Type”: “multipart/form-data”
}
}

//上传文件请求
axios.post("/qwe", formd, config).then(res => {
console.log(res.data)
})

flask处理文件
完整代码见最底部

逻辑如下
接收文件
为每次合成请求随机生成一个文件夹 临时保存文件
拼接视频
返回文件路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
@app.route("/file",methods=[‘POST’])
def test():

#获取文件
files = request.files
#合成队列
videoL = [ www.dc-focus.com ]

#随机字符串
dirs = sjs()
#生成文件夹
os.mkdir(dirs)
#保存文件并添加至合成队列
for file in files.values():
print(file)
dst = dirs + “/” + file.name + “.mp4”
file.save(dst)
video = VideoFileClip(dirs + “/” + file.name + “.mp4”)
videoL.append(video)

#拼接视频
final = concatenate_videoclips(videoL)
#文件路径
fileName = dirs + “/” +"{}.mp4".format(sjs())
#生成视频
final.to_videofile(fileName)

#销毁文件夹
def sc():
shutil.rmtree(dirs)

#30秒后销毁文件夹
timer = threading.Timer(30, sc)
timer.start()

返回文件路径

return fileName

拼接获取文件路径

首先我们看flask
逻辑如下
通过文件名 获取文件 返回文件

app.route("/getvoi",methods=[‘GET’])
def getImg():
#获取文件名
ss = request.args[‘name’]
#文件加至返回响应
response = make_response(
send_file(ss))

#删除文件
def sc():
os.remove(ss)

#30秒后删除文件
timer = threading.Timer(30, sc)
timer.start()

return response

前端获取
通过a标签下载

1
下载
herfs如下

在这里插入图片描述

我们上传文件后 通过falsk处理返回文件路径 拼接后获取文件地址

a标签添加download属性可以给下载的文件命名

如果你对/qwe /voi有疑惑 请看下面的配置代理说明

配置代理说明
配置代理是为了解决跨域问题 开发环境可在vue.config.js配置即可使用
生产环境需要额外配置nginx

在这里插入图片描述

/qwe实际上就是 http://127.0.0.1:8087/file
/voi实际上就是 http://127.0.0.1:8087/getvoi
对应我们flask中的

在这里插入图片描述

额外说明(如果你使用uni-app)
如果你使用uni-app 可参照文档使用api
上传文件api https://uniapp.dcloud.io/api/request/network-file?id=uploadfile
下载文件api https://uniapp.dcloud.io/api/request/network-file?id=downloadfile
或者直接使用别人封装好的 插件毕竟比较方便

完整代码
如果你不想一个一个复制可以去下载
下载途径1: https://download.csdn.net/download/qq_42027681/15561897
下载途径2:https://github.com/dmhsq/vue-flask-videoSynthesis

flask代码

md5random.py 用于随机字符串生成

import random
import hashlib
def sjs():
a = random.randint(0, 100)
a = “a” + str(a);
b = random.randint(100, 10000);
b = “b” + str(b);
c = hashlib.md5(a.encode(encoding=‘UTF-8’)).hexdigest() + hashlib.md5(b.encode(encoding=‘UTF-8’)).hexdigest();
c = “c” + str©;
d = random.randint(10, 100);
d = “d” + str(d);
e = hashlib.md5(c.encode(encoding=‘UTF-8’)).hexdigest() + hashlib.md5(d.encode(encoding=‘UTF-8’)).hexdigest();
e = hashlib.md5(e.encode(encoding=‘UTF-8’)).hexdigest()
return e;

app_service.py 服务代码

from flask import Flask,request,send_file,make_response
import os,json,threading,shutil
from moviepy.editor import *
from md5random import sjs

app = Flask(name)

@app.route("/file",methods=[‘POST’])
def test():

#获取文件
files = request.files
#合成队列
videoL = []
#随机字符串
dirs = sjs()
#生成文件夹
os.mkdir(dirs)
#保存文件并添加至合成队列
for file in files.values():
print(file)
dst = dirs + “/” + file.name + “.mp4”
file.save(dst)
video = VideoFileClip(dirs + “/” + file.name + “.mp4”)
videoL.append(video)

#拼接视频
final = concatenate_videoclips(videoL)
#文件路径
fileName = dirs + “/” +"{}.mp4".format(sjs())
#生成视频
final.to_videofile(fileName)

#销毁文件夹
def sc():
shutil.rmtree(dirs)

#30秒后销毁文件夹
timer = threading.Timer(30, sc)
timer.start()

返回文件路径

return fileName

@app.route("/getvoi",methods=[‘GET’])
def getImg():
#获取文件名
ss = request.args[‘name’]
#文件加至返回响应
response = make_response(
send_file(ss))

#删除文件
def sc():
os.remove(ss)

#30秒后删除文件
timer = threading.Timer(30, sc)
timer.start()

return response

if name == ‘main’:
app.run(host=‘0.0.0.0’,port=8087)

vue代码
演示文件代码

{{ dt }}

{{ item.name }}

{{ item.type }}
{{ item.size | sizeType }}

<el-button style=“position: relative;top: 50px” type=“success” @click=“ups()” :disabled="!isCan">合成
。。。
下载

文件下载有效时间{{times}}s

vue.config.js

module.exports = {
devServer: {
// assetsSubDirectory: ‘static’,
// assetsPublicPath: ‘/’,
proxy: {
“/qwe”: {
target: “http://127.0.0.1:8087/file”,
changeOrigin: true,
pathRewrite: {
“^/qwe”: “”
}
},
“/voi”: {
target: “http://127.0.0.1:8087/getvoi”,
changeOrigin: true,
pathRewrite: {
“^/voi”: “”
}
}
}
}
};

本文介绍了 vue+ flask实现视频合成功能(上传)的文章,更多相关 vue视频合成内容请搜索脚本之家之前的文章或者继续浏览下面的相关文章,希望大家以后多多支持脚本之家!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值