javascriptを使い30秒だけ切り取ったオーディオデータを投稿するポートフォリオアプリを作っています。
FFmpeg.jsライブラリを使いwavデータに変換させてinputのrangeでスタート地点をきめてそこから30秒切り取る動作にしたいのですが、blob.slice() https://lab.syncer.jp/Web/API_Interface/Reference/IDL/Blob/slice/
の第一引数が0のときは0秒から30秒切り取られたものがaudioタグのsrcに反映されて再生します。しかし0以外にするとaudioタグが再生できなくなってしまいます。
自力で解決できなく困ってます。どうかご助力の方お待ちしてます。
HTML
1コード 2<input class="upload_hidden offset-9" type="file" id="sound" accept="audio/*" name="sound"> 3<div id="currentTime"></div> 4<div id="audition"></div> 5<div id="resize"></div> 6
javascript
1コード 2<script src="https://unpkg.com/@ffmpeg/ffmpeg@0.9.4/dist/ffmpeg.min.js"></script> 3 <script> 4const sound = document.getElementById('sound'); 5const title = document.getElementById('title'); 6const resize = document.getElementById('resize'); 7const audition = document.getElementById('audition'); 8const currentTime = document.getElementById('currentTime'); 9 10 11const { 12 createFFmpeg, 13 fetchFile 14 } = FFmpeg; 15 const ffmpeg = createFFmpeg({ 16 log: true 17 }); 18 const transcode = async ({ 19 target: { 20 files 21 } 22 }) => { 23 await ffmpeg.load(); 24 ffmpeg.FS('writeFile', 'music', await fetchFile(files[0])); 25 await ffmpeg.run('-i', 'music', '-vn', '-ac', '2', '-ar', '44100', '-acodec', 'pcm_s16le', '-f', 'wav', 'output.wav'); 26 27 const data = ffmpeg.FS('readFile', 'output.wav'); 28 29 dataUrl = URL.createObjectURL(new Blob([data.buffer], { 30 type: 'audio/wav' 31 })); 32 audition.innerHTML = '<audio src="' + dataUrl + '"controls id="sample"></audio>'; 33 34 const fileTitle = (() => { 35 const files = sound.files; 36 const reader = new FileReader(); 37 reader.readAsDataURL(files[0]); 38 39 reader.onload = () => { 40 currentTime.innerHTML = '<input type="range" value="0" id="sampleCurrentTime" min="0" step="1" onchange="setCurrentTime(this.value)">'; 41 const elementReference = document.getElementById('sample'); 42 const sampleCurrentTime = document.getElementById('sampleCurrentTime'); 43 44 const timer = setInterval(() => { 45 if (elementReference.readyState > 0) { 46 sampleCurrentTime.max = elementReference.duration; //デフォルトでrangeの総再生時間が反映されないのでそれを処理 47 clearInterval(timer); 48 } 49 }, 300); 50 51 52 console.log(elementReference.duration); 53 resize.innerHTML = '<button type="button" id=change>30秒ピックアップ<button>' 54 const change = document.getElementById('change'); 55 change.addEventListener('click', async () => { 56 let postForm = null; 57 const byte = { 58 'start': parseInt(elementReference.currentTime * 0.172 * 1024 * 1024), 59 'end': parseInt((elementReference.currentTime + 30) * 0.172 * 1024 * 1024) 60 }; 61 62 const sliceData = new Blob([data.buffer], { 63 type: "audio/wav" 64 }).slice(byte.start, byte.end, 'audio/wav'); 65 66 const reader = new FileReader(); 67 reader.readAsDataURL(sliceData); 68 reader.onload = () => { 69 let dataURI = reader.result; 70 console.log(dataURI); 71 audition.innerHTML = '<audio src="' + dataURI + '"controls id="sample"></audio>'; 72 } 73 }); 74 }; 75 }) 76 fileTitle(); 77 } 78 79 const setCurrentTime = (currentTime) => { 80 const elementReference = document.getElementById('sample'); 81 82 elementReference.currentTime = currentTime; 83 } 84 85 sound.addEventListener('change', transcode); 86</script>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/25 09:45
2021/03/26 00:46