일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- react
- flask
- Class
- Props
- 카톡
- 튜플
- S3
- wetube
- lambda
- dict
- socket io
- 중급파이썬
- 파이썬
- node
- docker
- merge
- async
- MongoDB
- TypeScript
- SAA
- git
- RDS
- pandas
- crud
- Vue
- AWS
- NeXT
- EC2
- 채팅
- SSA
- Today
- Total
초보 개발자
ffmpeg wasm 본문
우리는 webm확장자에서 mp4확장자로 바꿔주려고한다. 이 때 사용할 소프트웨어는 ffmpeg이다. 또 이걸 활용하여 썸네일도 추출해보려고 한다.
원래 ffmpeg는 콘솔에서 실행해야하여 백엔드에서 해줘야한다. 근데 백엔드에서 처리하려면 좋은서버가 필요하다.
메모리..그래픽장치등 여러가지가 필요하기 때문이다. 이 문제를 해결하기위해서 webassembly를 사용해보자
webassembly는 기본적으로 웹사이트가 매우 빠른 코드를 실행할 수 있게 해준다. 원래 front상에서는 html css js밖에 못쓴다 예를들어 go , c등은 쓸 수 가없고 back에서만 쓸 수 있다. 근데 webassembly를 사용하면 프론트엔드에서 매우 빠른 코드를 실행할 수 있다.
즉 webassembly를 통해서 웹에서 ffmpeg를 실행시켜 mp4로 변환하는 것이다. 이건 나의 서버에서가 아닌 사용자의 컴퓨터를 사용한다. 우리는 우리서버의 처리능력을 사용하지 않을 것이다. ffmpeg는 c언어 인데 웹어셈블리를 사용하면 브라우저에서 ffmpeg를 실행 시킬 수 있다.
공식문서에 따라설치를 진행해주자
log: true 옵션을 주면 진행상황을 log에 띄워준다.
제일 처음 ffmpeg를 await ffmpeg.load()해줘야한다. 사용자가 소프트웨어를 사용할 것이기 때문이다.
ffmpeg.FS()세가지 method가 있다. "writeFile 은 ffmpeg의 가상의 세계에 파일을 생성해준다.
ffmpeg.FS("writeFile","my.webm",await fetchFile(videoUrl))
두번째에는 파일이름 세번째에는 바이너리 데이터를 넣어줘야하는데 이때 await fetchFile(videoURL)을 적어준다.
이 파일을 mp4확장자로 바뀌기 위해서 명령어를 사용해야한다.
await ffmpeg.run("-i","my.webm","my.mp4")
지금 브라우저의 메모리에는 output.mp4라는 파일이있다.
우선 이 파일을 불러와야겠따.
const mp4File = ffmpeg.FS("readFile","my.mp4")
console.log(mp4File)
console.log(mp4File.buffer)
mp4File은 Uint8array 이다. 실제 파일을 나타낸다. 하지만 이거가지곤 아무것도 할 수가 없다. 그래서 자바스크립트 세계의 파일과 같은 blob을 만들거다. 우리는 이 배열로부터 blob을 만들어 내는거다.
Uint8Array만으로는 만들 수 없지만 binary data를 추출하면 가능하다.
arrayBuffer는 raw binary data를 나타내는 object이다.
여기서 기억해야될 것은 binary data를 사용하고 싶다면 buffer를 사용해야 한다는 것이다.
blob을 만들어 보자. const mp4Blob = new Blob()배열안에 배열을 받을 수 있다. 그래서 배열을만들고 그 안에 buffer을 넣어준다. 전에도 blob을 사용한 적이 있었다. 전에 event.data가 blob이었다.
이 data를 우리가 접근할 수 있는 URL에 넣을 수 있다는걸 알았다. mp4URL을 만들것이다. URL.createObjectURL(mp4Blob)을 통해 저번처럼 브라우저 상에 URL을 만들어 저장해두고 그 URL을 a태그에 넣어주면 된다.
여기서 버전 오류가 떴었는데, npm install @ffmpeg/core@latest 설치하고
const ffpmeg = createFFmpeg({
corePath: 'https://unpkg.com/@ffmpeg/core@0.10.0/dist/ffmpeg-core.js',
log:true
});
이렇게 해주면 오류가 뜨지 않는다. sharedArrayBuffer 라는 오류가 또 떴는데
server.js
app.use((req, res, next) => {
res.header("Cross-Origin-Embedder-Policy", "require-corp");
res.header("Cross-Origin-Opener-Policy", "same-origin");
next();
});
이러한 미들웨어를 추가해주면된다.
'RECAP - WETUBE' 카테고리의 다른 글
express-flash (0) | 2021.10.19 |
---|---|
ffmpeg Thumbnail , upload (0) | 2021.10.17 |
RECORD (0) | 2021.10.16 |
view +1 API (0) | 2021.10.12 |
Video player (0) | 2021.10.05 |