-
[Javascript] blob으로 저장된 미디어파일 재생처리Javascript & TypeScript 2021. 2. 2. 21:48반응형
지난 시간에 firebase storage에 저장된 음악파일을 blob 형식으로 받아 indexdDB에 저장하는 기능을 구현했었다. 해당내용은 아래 포스트를 통해 확인할 수 있다.
https://ddochea.tistory.com/86
[javascript] 브라우저의 indexedDB 및 WebSQL을 손쉽게 사용할 수 있는 localForage 라이브러리
개인 프로젝트로 firebase + react + (필요에 따라 node 호스팅?)를 이용해 브라우저 기반 스트리밍 mp3 플레이어를 개발해보려고 하고 있다. 아직 본작업은 아니고 될지 안될지 따져보는 중이다. 음악
ddochea.tistory.com
파일을 받았으니 이번엔 재생을 다뤄볼 차례이다. blob 형식을 재생하는 방법은 의외로 쉽게 찾을 수 있었다.
import React, { useEffect, useRef, useState } from "react"; import firebase from "firebase/app"; import localforage from "localforage"; import "firebase/storage"; import logo from './logo.svg'; import './App.css'; firebase.initializeApp({ // firebase 프로젝트 config 설정영역 }) function App() { const [srcValue, setSrcValue] = useState(''); function play() { localforage.getItem("test", (err, value) => { console.log(err); console.log(value); const url = URL.createObjectURL(value.file); setSrcValue(url); }) } function getMusicFile() { const storage = firebase.storage(); var storageRef = storage.ref(); storageRef.child('음악파일.mp4').getDownloadURL().then((url) => { var xhr = new XMLHttpRequest(); xhr.responseType = 'blob'; xhr.onload = function(event) { const blob = xhr.response; localforage.setItem("test", { "name":"음악파일.mp4", "file": blob}); }; console.log(url); xhr.open('GET', url); xhr.send(); }); } return ( <div className="App"> <header className="App-header"> <img src={logo} className="App-logo" alt="logo" /> <p> Edit <code>src/App.js</code> and save to reload. </p> <a className="App-link" href="https://reactjs.org" target="_blank" rel="noopener noreferrer" > Learn React </a> <video src={srcValue} autoPlay={true}> </video> <button onClick={getMusicFile}>getStorage</button> <button onClick={play}>PlaySavedFile</button> </header> </div> ); } export default App;
기존 소스에서 play함수 및 해당 함수를 실행할 수 있는 버튼과 State를 추가했다. 버튼을 누르면 indexedDB에 저장된 음악 Blob을 가져와 URL로 바꾼 뒤 video 태그의 src 값에 바인딩한다.
결과화면은 저작권 문제 소지가 있어 올리지 못하지만 화면과 함께 음악이 들리는 것을 확인할 수 있었다.
인터넷이 끊어진 환경에서도 동작여부를 확인해야 하는데 해당 부분은 호스팅 서비스가 필요할 듯 싶다.
반응형'Javascript & TypeScript' 카테고리의 다른 글
[React Hook] 컴포넌트 내 Effect Hook(useEffect) 사용 개념정리 (0) 2021.02.11 [Javascript] React 웹 앱 Firebase에 호스팅하기 (0) 2021.02.04 [Javascript] 브라우저의 indexedDB 및 WebSQL을 손쉽게 사용할 수 있는 localForage 라이브러리 (0) 2021.02.01 [Javascript] 객체를 손쉽게 깊은 복사(Deep copy) 하는 라이브러리 fast-copy 소개 (1) 2021.01.26 [VueJS] Gridsome을 이용한 정적페이지 생성 (0) 2020.08.16