seawolf2357 commited on
Commit
ff17f7f
ยท
verified ยท
1 Parent(s): 9d6653b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +66 -21
app.py CHANGED
@@ -629,32 +629,48 @@ var canvas=document.createElement('canvas');
629
  canvas.width=1280;canvas.height=720;
630
  var ctx=canvas.getContext('2d');
631
  var stream=canvas.captureStream(30);
632
- var opts={{mimeType:'video/webm;codecs=vp8'}};
633
- if(!MediaRecorder.isTypeSupported(opts.mimeType))opts={{mimeType:'video/webm'}};
 
 
 
 
 
 
 
 
634
  var rec=new MediaRecorder(stream,opts);
635
  var chunks=[];
636
  rec.ondataavailable=function(e){{if(e.data.size>0)chunks.push(e.data)}};
 
637
  document.getElementById('exportMsg').textContent='๋…นํ™” ์ค‘...';
638
  rec.start(100);
 
639
  var dur=S.dur;
640
- var start=performance.now();
641
- await new Promise(function(resolve){{
642
- function render(){{
643
- if(S.cancelled){{rec.stop();resolve();return}}
644
- var t=(performance.now()-start)/1000;
645
- if(t>=dur){{
646
- setTimeout(function(){{rec.stop();setTimeout(resolve,300)}},200);
647
- return;
648
- }}
649
- document.getElementById('exportBar').style.width=(t/dur*100)+'%';
650
- document.getElementById('exportMsg').textContent='๋…นํ™” ์ค‘... '+Math.round(t/dur*100)+'%';
 
651
  ctx.fillStyle='#000';
652
  ctx.fillRect(0,0,1280,720);
 
653
  var vc=getClipAt(t,'visual');
654
  if(vc){{
655
  var el=S.els[vc.mid];
656
  if(el){{
657
- if(vc.type==='video')el.currentTime=t-vc.start+vc.ts;
 
 
 
 
658
  try{{
659
  var sw=el.videoWidth||el.naturalWidth||el.width||1280;
660
  var sh=el.videoHeight||el.naturalHeight||el.height||720;
@@ -664,16 +680,25 @@ ctx.drawImage(el,(1280-dw)/2,(720-dh)/2,dw,dh);
664
  }}catch(e){{}}
665
  }}
666
  }}
667
- requestAnimationFrame(render);
 
 
668
  }}
669
- requestAnimationFrame(render);
 
 
 
 
670
  }});
 
671
  if(S.cancelled)return;
 
672
  var webmBlob=new Blob(chunks,{{type:'video/webm'}});
673
  if(webmBlob.size<1000){{document.getElementById('exportMsg').textContent='๋…นํ™” ์‹คํŒจ';return}}
 
674
  document.getElementById('exportBar').style.width='100%';
675
- document.getElementById('exportMsg').textContent='์™„๋ฃŒ! ('+Math.round(webmBlob.size/1024)+'KB) - ์•„๋ž˜์—์„œ ๋‹ค์šด๋กœ๋“œํ•˜์„ธ์š”';
676
- // WebM ๋‹ค์šด๋กœ๋“œ ๋งํฌ ์ƒ์„ฑ
677
  var downloadDiv=document.createElement('div');
678
  downloadDiv.style.marginTop='10px';
679
  var webmLink=document.createElement('a');
@@ -683,18 +708,20 @@ webmLink.className='btn btn-success';
683
  webmLink.textContent='๐Ÿ“ฅ WebM ๋‹ค์šด๋กœ๋“œ';
684
  webmLink.style.marginRight='5px';
685
  downloadDiv.appendChild(webmLink);
686
- // base64 ๋ณต์‚ฌ ๋ฒ„ํŠผ
687
  var copyBtn=document.createElement('button');
688
  copyBtn.className='btn btn-secondary';
689
  copyBtn.textContent='๐Ÿ“‹ MP4๋ณ€ํ™˜์šฉ ๋ณต์‚ฌ';
690
  copyBtn.onclick=async function(){{
 
691
  var reader=new FileReader();
692
  reader.onload=function(){{
693
  var base64=reader.result.split(',')[1];
694
  navigator.clipboard.writeText(base64).then(function(){{
695
- alert('๋ณต์‚ฌ ์™„๋ฃŒ!\\n\\n์œ„ Gradio์˜ "WebM ๋ฐ์ดํ„ฐ" ์ž…๋ ฅ๋ž€์— ๋ถ™์—ฌ๋„ฃ๊ธฐ(Ctrl+V) ํ›„\\n"MP4 ๋ณ€ํ™˜" ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์„ธ์š”.');
 
696
  }}).catch(function(){{
697
- prompt('์•„๋ž˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•˜์„ธ์š” (Ctrl+A, Ctrl+C):', base64);
698
  }});
699
  }};
700
  reader.readAsDataURL(webmBlob);
@@ -703,6 +730,24 @@ downloadDiv.appendChild(copyBtn);
703
  document.querySelector('.modal-box').appendChild(downloadDiv);
704
  }}
705
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
706
  function cancelExport(){{S.cancelled=true;document.getElementById('exportModal').style.display='none'}}
707
 
708
  document.addEventListener('keydown',function(e){{
 
629
  canvas.width=1280;canvas.height=720;
630
  var ctx=canvas.getContext('2d');
631
  var stream=canvas.captureStream(30);
632
+
633
+ // ๊ณ ํ™”์งˆ ์„ค์ •
634
+ var opts={{mimeType:'video/webm;codecs=vp9',videoBitsPerSecond:8000000}};
635
+ if(!MediaRecorder.isTypeSupported(opts.mimeType)){{
636
+ opts={{mimeType:'video/webm;codecs=vp8',videoBitsPerSecond:8000000}};
637
+ }}
638
+ if(!MediaRecorder.isTypeSupported(opts.mimeType)){{
639
+ opts={{mimeType:'video/webm',videoBitsPerSecond:5000000}};
640
+ }}
641
+
642
  var rec=new MediaRecorder(stream,opts);
643
  var chunks=[];
644
  rec.ondataavailable=function(e){{if(e.data.size>0)chunks.push(e.data)}};
645
+
646
  document.getElementById('exportMsg').textContent='๋…นํ™” ์ค‘...';
647
  rec.start(100);
648
+
649
  var dur=S.dur;
650
+ var fps=30;
651
+ var totalFrames=Math.ceil(dur*fps);
652
+ var frameTime=1/fps;
653
+
654
+ // ํ”„๋ ˆ์ž„ ๋‹จ์œ„๋กœ ์ •ํ™•ํ•˜๊ฒŒ ๋ Œ๋”๋ง
655
+ for(var frame=0;frame<totalFrames;frame++){{
656
+ if(S.cancelled)break;
657
+
658
+ var t=frame*frameTime;
659
+ document.getElementById('exportBar').style.width=(frame/totalFrames*100)+'%';
660
+ document.getElementById('exportMsg').textContent='๋…นํ™” ์ค‘... '+Math.round(frame/totalFrames*100)+'% ('+Math.floor(t)+'/'+Math.floor(dur)+'์ดˆ)';
661
+
662
  ctx.fillStyle='#000';
663
  ctx.fillRect(0,0,1280,720);
664
+
665
  var vc=getClipAt(t,'visual');
666
  if(vc){{
667
  var el=S.els[vc.mid];
668
  if(el){{
669
+ if(vc.type==='video'){{
670
+ var clipT=t-vc.start+vc.ts;
671
+ // seekํ•˜๊ณ  ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ
672
+ await seekVideo(el,clipT);
673
+ }}
674
  try{{
675
  var sw=el.videoWidth||el.naturalWidth||el.width||1280;
676
  var sh=el.videoHeight||el.naturalHeight||el.height||720;
 
680
  }}catch(e){{}}
681
  }}
682
  }}
683
+
684
+ // ํ”„๋ ˆ์ž„ ๊ฐ„๊ฒฉ๋งŒํผ ๋Œ€๊ธฐ (MediaRecorder๊ฐ€ ํ”„๋ ˆ์ž„ ์บก์ฒ˜ํ•  ์‹œ๊ฐ„)
685
+ await new Promise(function(resolve){{setTimeout(resolve,33)}});
686
  }}
687
+
688
+ // ๋…นํ™” ์ข…๋ฃŒ
689
+ await new Promise(function(resolve){{
690
+ rec.onstop=resolve;
691
+ rec.stop();
692
  }});
693
+
694
  if(S.cancelled)return;
695
+
696
  var webmBlob=new Blob(chunks,{{type:'video/webm'}});
697
  if(webmBlob.size<1000){{document.getElementById('exportMsg').textContent='๋…นํ™” ์‹คํŒจ';return}}
698
+
699
  document.getElementById('exportBar').style.width='100%';
700
+ document.getElementById('exportMsg').textContent='์™„๋ฃŒ! ('+Math.round(webmBlob.size/1024/1024*10)/10+'MB) - ์•„๋ž˜์—์„œ ๋‹ค์šด๋กœ๋“œ';
701
+
702
  var downloadDiv=document.createElement('div');
703
  downloadDiv.style.marginTop='10px';
704
  var webmLink=document.createElement('a');
 
708
  webmLink.textContent='๐Ÿ“ฅ WebM ๋‹ค์šด๋กœ๋“œ';
709
  webmLink.style.marginRight='5px';
710
  downloadDiv.appendChild(webmLink);
711
+
712
  var copyBtn=document.createElement('button');
713
  copyBtn.className='btn btn-secondary';
714
  copyBtn.textContent='๐Ÿ“‹ MP4๋ณ€ํ™˜์šฉ ๋ณต์‚ฌ';
715
  copyBtn.onclick=async function(){{
716
+ document.getElementById('exportMsg').textContent='๋ฐ์ดํ„ฐ ์ค€๋น„ ์ค‘...';
717
  var reader=new FileReader();
718
  reader.onload=function(){{
719
  var base64=reader.result.split(',')[1];
720
  navigator.clipboard.writeText(base64).then(function(){{
721
+ document.getElementById('exportMsg').textContent='๋ณต์‚ฌ ์™„๋ฃŒ! ์œ„ ์ž…๋ ฅ๋ž€์— ๋ถ™์—ฌ๋„ฃ๊ธฐ';
722
+ alert('๋ณต์‚ฌ ์™„๋ฃŒ!\\n\\nGradio์˜ "WebM ๋ฐ์ดํ„ฐ" ์ž…๋ ฅ๋ž€์— ๋ถ™์—ฌ๋„ฃ๊ธฐ(Ctrl+V) ํ›„\\n"MP4 ๋ณ€ํ™˜" ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์„ธ์š”.');
723
  }}).catch(function(){{
724
+ prompt('์•„๋ž˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•˜์„ธ์š”:', base64.substring(0,100)+'...');
725
  }});
726
  }};
727
  reader.readAsDataURL(webmBlob);
 
730
  document.querySelector('.modal-box').appendChild(downloadDiv);
731
  }}
732
 
733
+ // ๋น„๋””์˜ค seek ์™„๋ฃŒ ๋Œ€๊ธฐ ํ•จ์ˆ˜
734
+ function seekVideo(video,time){{
735
+ return new Promise(function(resolve){{
736
+ if(Math.abs(video.currentTime-time)<0.05){{
737
+ resolve();
738
+ return;
739
+ }}
740
+ var onSeeked=function(){{
741
+ video.removeEventListener('seeked',onSeeked);
742
+ resolve();
743
+ }};
744
+ video.addEventListener('seeked',onSeeked);
745
+ video.currentTime=time;
746
+ // ํƒ€์ž„์•„์›ƒ (ํ˜น์‹œ seeked ์ด๋ฒคํŠธ๊ฐ€ ์•ˆ ์˜ค๋ฉด)
747
+ setTimeout(resolve,200);
748
+ }});
749
+ }}
750
+
751
  function cancelExport(){{S.cancelled=true;document.getElementById('exportModal').style.display='none'}}
752
 
753
  document.addEventListener('keydown',function(e){{