zjs_project 1 سال پیش
والد
کامیت
0a9fc069af

+ 3 - 0
package.json

@@ -18,6 +18,9 @@
   "dependencies": {
     "@amap/amap-jsapi-loader": "^1.0.1",
     "@better-scroll/core": "^2.4.2",
+    "@ffmpeg/core": "^0.12.6",
+    "@ffmpeg/ffmpeg": "^0.12.10",
+    "@ffmpeg/util": "^0.12.1",
     "axios": "^0.21.1",
     "better-scroll": "^2.4.2",
     "core-js": "^3.8.3",

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 16 - 0
public/ffmpeg-core.js


BIN
public/ffmpeg-core.wasm


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 0
public/ffmpeg-core.worker.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 2 - 0
public/ffmpeg.min.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 2 - 0
src/assets/ffmpeg.min.js


+ 7 - 0
src/components/newBottomCom/viewAI/viewAI.html

@@ -29,6 +29,12 @@
 								define-back-color="#fff" color="#92CE8B" 
 								text-color="#92CE8B" type="circle" :percentage="ktProgress"></el-progress>
 							</div>
+							<!-- 压缩中 -->
+							<div class="rows justify-center" v-if="uploadStatus==-1" style="width: 100%;height: 100%;">
+								<el-progress :format="format" :stroke-width="8"
+								define-back-color="#fff" color="#92CE8B" 
+								text-color="#92CE8B" type="circle" :percentage="cProgress"></el-progress>
+							</div>
 						</div>
 						<div class="item-name rows justify-center empty-text" v-if="uploadStatus==0">个人形象</div>
 						<div class="item-name rows justify-center empty-text" v-else-if="uploadStatus==1 || uploadStatus==2"  @click.stop="showPopViewHandle">
@@ -161,4 +167,5 @@
 		</div>
 	</div>
 	<!-- <video id="videoPlayer" loop muted autoplay style="display: none;" controls="false" webkit-playsinline="webkit-playsinline" playsinline="playsinline" src=""></video> -->
+	<video id="output-video" controls :src="videoSrc"></video>
 </div>

+ 5 - 0
src/components/newBottomCom/viewAI/viewAI.scss

@@ -445,4 +445,9 @@
 			}
 		}
 	}
+}
+#output-video{
+	position: relative;
+	width: 300px;
+	height: 200px;
 }

+ 74 - 27
src/components/newBottomCom/viewAI/viewAI.vue

@@ -13,6 +13,13 @@
 		Toast
 	} from 'mint-ui';
 	import lottie from "lottie-web"; //lottie
+	// const { createWorker } = require('@ffmpeg/ffmpeg');
+	import { FFmpeg } from "@ffmpeg/ffmpeg";
+	import { fetchFile, toBlobURL } from '@ffmpeg/util'
+	const baseURL = '.'
+	let ffmpeg = null;
+	// import { createFFmpeg, fetchFile } from '@/assets/ffmpeg.min.js';
+
 	// import commonMethod from '@/common/commonMethod.js';
 	// import touchHandle from '@/mixins/touchHandle.js';
 	// import requestConfig from '@/static/lib/requestConfig';
@@ -48,14 +55,15 @@
 					},
 				],
 				hasRedBox:false,	//是否添加了红包
-				limit:20,
+				limit:50,
 				videoId:'',	//上传视频的id
 				videoUrl:'',	//处理好的视频地址
 				progress:0,	//进度条
 				ktProgress:0,	//抠图进度条
+				cProgress:0,	//压缩进度条
 				showPersonView:false,	//是否显示个人形象提示弹窗
 				showPopView:false,		//是否显示确认取消框
-				uploadStatus:0,	//视频处理的状态 0 未开始,1 上传中,2绿幕抠图中-服务端处理中,3处理成功 4 处理失败
+				uploadStatus:0,	//视频处理的状态 -1 压缩中 0 未开始,1 上传中,2绿幕抠图中-服务端处理中,3处理成功 4 处理失败
 				count:0,		//结果请求次数
 				timeOut:90000,	//超时时间
 				outTimer:null,	//延时处理对象
@@ -64,6 +72,7 @@
 				stopFlag:false,	//停止上传动作
 				cancelTokenSource:null,	//取消上传的操作对象
 				repeartFlag:false,	//防止重复点击
+				videoSrc:'',
 			}
 		},
 		props: {
@@ -137,6 +146,8 @@
 					text = "上传中";
 				}else if(this.uploadStatus==2){
 					text = "抠图中";
+				}else if(this.uploadStatus==-1){
+					text = "压缩中";
 				}
 				return `${text}\n${percentage}%`;
 			},
@@ -206,13 +217,71 @@
 				this.leftList[0].url = '';
 				this.uploadStatus = 0;//处理完毕
 			},
-			uploadImgObj(e,form,type=1){
+			async transcode(file,ffmpeg){
+				// if(!crossOriginIsolated) {
+				// 	SharedArrayBuffer = ArrayBuffer;
+				// }
+				const { name } = file;
+				console.warn('正在加载 ffmpeg-core.js')
+				await ffmpeg.load();
+				console.warn('开始压缩');
+				ffmpeg.FS('writeFile', name, await fetchFile(file));
+				// '-b','2000000'  值越小  压缩率越大
+				await ffmpeg.run('-i', name,'-b','2000000','output.mp4');
+				console.warn('压缩完成');
+				var data = ffmpeg.FS('readFile', 'output.mp4');
+				var newfile = new File([data.buffer], name, { type: "video/mp4" });
+				var video = document.getElementById('output-video');
+				video.src = URL.createObjectURL(new Blob([data.buffer], {
+					type: 'video/mp4'
+				}));
+				// this.uploadMaterielFile(newfile)
+			},
+			async transcodeNew(file,form){
+				if (ffmpeg === null) {
+					ffmpeg = new FFmpeg();
+				}
+				ffmpeg.on("log", ({ message }) => {
+					console.warn(message);
+				})
+				ffmpeg.on("progress", ({ progress }) => {
+					let pro  = `${progress * 100} %`;
+					console.warn("***progress***",pro)
+					this.cProgress = parseInt(progress * 100);
+				});
+				await ffmpeg.load({
+					// coreURL: "/packages/core/dist/esm/ffmpeg-core.js",
+					coreURL: await toBlobURL(`${baseURL}/ffmpeg-core.js`, 'text/javascript'),
+					wasmURL: await toBlobURL(`${baseURL}/ffmpeg-core.wasm`, 'application/wasm'),
+					workerURL: await toBlobURL(`${baseURL}/ffmpeg-core.worker.js`, 'text/javascript')
+				});
+				
+				const {name} = file;
+				console.warn('开始压缩');
+				this.uploadStatus = -1;
+				let d0 = Date.now();
+				await ffmpeg.writeFile(name, await fetchFile(file));
+				await ffmpeg.exec(['-i', name,  'output.mp4']);
+				this.uploadStatus = 1;
+				let d1 = Date.now();
+				console.warn("***time1**", d0, d1,d1 - d0)
+				console.warn('压缩完成');
+				const data = await ffmpeg.readFile('output.mp4');
+				
+				// const video = document.getElementById('output-video');
+				// video.src = URL.createObjectURL(new Blob([data.buffer], { type: 'video/mp4' }));
+				
+				var newfile = new File([data.buffer], name, { type: "video/mp4" });
+				this.uploadMaterielFile({file:newfile},form)
+			},
+			async uploadImgObj(e,form,type=1){
 				this.stopFlag = false;//上传开始时,开启上传
 				if(type==2){
 					this.initStatus();//重置上传状态到初始值
 				}
 				//上传图片
 				var file = e.target.files[0];
+				// this.transcodeNew(file,form);
 				var fileSize = file.size / 1024 / 1024;
 				// alert('**文件**' + e.target.value + "-fileName=" + file.name);
 				if (!/\.(MP4|mp4|MOV|mov)$/.test(e.target.value)) {
@@ -234,30 +303,6 @@
 					return false;
 				}
 				if(this.$parent.isIOS){//IOS则直接上传
-					// let reader = new FileReader();
-					// reader.onload = (event) => {
-					// 	alert("onloadedmetadata0")
-					// 	let video = document.getElementById('videoPlayer');
-					// 	video.setAttribute("crossOrigin", "Anonymous");
-					// 	video.src = event.target.result;
-					// 	video.controls = false;
-					// 	video.autoplay = true;
-					// 	video.preload = 'auto';
-					// 	video.setAttribute('webkit-playsinline', true);
-					// 	video.setAttribute('playsinline', true);
-					// 	video.load();
-					// 	// video.play();
-					// 	video.onloadedmetadata = (event) => {
-					// 		alert("onloadedmetadata1")
-					// 		if(!this.stopFlag){
-					// 			var item = {};
-					// 			item.file = file;
-					// 			console.warn("***uploadImgObj***",file)
-					// 			this.uploadMaterielFile(item, form); //正常上传图片
-					// 		}
-					// 	}
-					// };
-					// reader.readAsDataURL(file);
 					if(!this.stopFlag){
 						var item = {};
 						item.file = file;
@@ -378,6 +423,8 @@
 				}else if (res.success && res.single) {
 					this.videoId = res.single;//根据Id查询结果
 					this.startInterval();//开始轮询获取结果
+				}else{
+					this.initStatus();//还原初始状态
 				}
 				var videoForm = document.getElementById(form); //获取表单对象
 				videoForm && videoForm.reset(); // 重置表单

+ 1 - 1
src/pages/webgl_rxdz_krpano720/webgl_rxdz_krpano720.vue

@@ -144,7 +144,7 @@
 						this.lottieAni()
 					}else if(this.result.status==99){
 						Toast({
-							message: '网络异常,请稍后再试',
+							message: '礼包已抢完',
 						});
 					}
 				}else{

+ 1 - 0
src/services/request.js

@@ -7,6 +7,7 @@ var requestCount = 0; //记录下同时的请求数
 
 axios.defaults.headers.post['elabEnvironment'] = '4'; //axios默认的请求方式,可以自己设置
 axios.defaults.headers.post['userType'] = '1000'; //axios默认的请求方式,可以自己设置
+axios.defaults.timeout = '1000000'; //axios默认的请求方式,可以自己设置
 // axios.defaults.headers.post['Authorization'] = 'Token 9837b7480a99ab4df7e3a06ad0d990fbc7b941e4'; //axios默认的请求方式,可以自己设置
 axios.interceptors.request.use(function(config) {
 	if(config.noLoading){

+ 4 - 0
vue.config.js

@@ -13,6 +13,10 @@ module.exports = {
 	assetsDir: 'static', //放置生成的静态资源 (js、css、img、fonts) 的 (相对于 outputDir 的) 目录。-打包时才有意义
 	indexPath: 'index.html', //指定生成的 index.html 的输出路径 (相对于 outputDir)。也可以是一个绝对路径。-打包时才有意义
 	devServer: {
+		headers: {
+			"Cross-Origin-Opener-Policy": "same-origin",
+			"Cross-Origin-Embedder-Policy": "require-corp",
+		},
 		open: false,
 		proxy:{},
 	},