미디어 포맷 변환하기(FFmpeg in NodeJS)

박정호·2022년 3월 22일
0

노드에서 FFmpeg 라이브러리를 이용해 미디어 포맷 변환하기를 해본다.
이 글은 스트리밍에 필요한 m3u8 포맷을 생성하는 주제로 진행한다.

먼저, 언제나 공식 홈페이지 링크를 첨부하니 필요에 따라 가서 읽자
https://www.ffmpeg.org/

나무위키도 첨부하니 읽으면 도움이 될듯 하다.
https://namu.wiki/w/FFmpeg

AV1에 대한 글도 흥미로워 같이 첨부한다
https://namu.wiki/w/AV1

이 글의 주제가 처음일 때 그리고 npm이 아직 낯설다면 npm에서 읽어보아야 할 라이브러리는 3개 정도가 보였다

node-ffmpeg
https://www.npmjs.com/package/ffmpeg
: 라이센스도 없기 때문에 배제하겠다.

fluent-ffmpeg
https://www.npmjs.com/package/fluent-ffmpeg
https://github.com/fluent-ffmpeg/node-fluent-ffmpeg
: ffmpeg-API로 적절한 선택인 듯 하다.

@ffmpeg-installer/ffmpeg
https://www.npmjs.com/package/@ffmpeg-installer/ffmpeg
https://github.com/kribblo/node-ffmpeg-installer#readme
:
This library abstracts the complex command-line usage of ffmpeg into a fluent, easy to use node.js module. In order to be able to use this module, make sure you have ffmpeg installed on your system (including all necessary encoding libraries like libmp3lame or libx264).

fluent-ffmpeg 깃허브를 읽어보면 위 모듈을 사용하기 위해 ffmpeg가 설치되어 있는지 꼭 확인하라고 기술한다.
따라서 binary installer 라이브러리를 같이 사용했다.

정리해 이번 글에서
fluent-ffmpeg, @ffmpeg-installer/ffmpeg 를 이용해 코드를 작성하겠다.

시작해보자.

그리고
@ffmpeg-installer/ffmpeg npm Usage examples에 흥미롭게 볼 토픽이 있어 서두에 글을 작성한다.

fluent-ffmpeg : 이번에 사용할 환경이다. 각 메서드는 각자 필요 유무에 따라 확인하도록 한다.
const ffmpeg = require("fluent-ffmpeg");
const ffmpegInstaller = require("@ffmpeg-installer/ffmpeg");
ffmpeg.setFfmpegPath(ffmpegInstaller.path);

process.spawn() :
--정리 --

  • 데스크탑, 노트북에서 테스트를 해봤는데 본인 운영체제에 맞게 바이너리 데이터를 잘 받는다. 패키지에 이 기능 넣을 생각 못 하고 있었는데 꿀팁이다.

준비 과정은 다 되었고,
이제 미디어 파일 포맷을 바꿔보자.

간략한 과정은
input file을 어떠한 조건(inputOption)으로 디코딩(해독)하고 그 raw한 데이터를 다시 어떠한 조건으로 인코딩(암호화)해 output file을 만드는 것이다.

FFmpeg 옵션에 대한 한글 블로그가 있어 링크 첨부한다. 이해하는데 도움이 되었으면 한다.
https://saramsarang.tistory.com/214

처음 들었던 의문점은 디코딩에 조건이 들어간다면 파일을 보통 어떻게까지 잘게 부셔 놓지에 대한 궁금점이 있었다.

생각을 해보자. 여러 파일을 결합하는 경우라고 가정하자.
변인을 최대한 단순화해 크기가 결합에 요구되는 요소라고 가정한다.
A : 10 B : 20 C : 25

A+B+C => D라는 결과물을 내는 여러가지 방법이 있겠지만,
가장 쉽고, 오류가 적은 방법은 A, B, C를 모두 같은 상태로 만들고 이들을 다시 가져오는 방법일 것이다.
쉽게말해, 소속감을 준다거나 공통점을 부여하는 느낌이다.
예를 들면, 10, 20, 25의 공약수 중 하나를 단위로 자르는 것이다. 1, 5의 단위로 말이다.

그런 과정을 거친다면,
물건을 집는 사람의 입장에서는 A, B, C가 공통 단위로 나뉘어져 있으니
이제 몇 개씩 다시 집어오기만 하면 되는 상황이 만들어지는 것이다. 여기서 사람의 입맛이 outputOption이 되는 것일테고

뭐 암튼, 보통 이러한 과정의 필요성으로 inputOption을, 디코딩 옵션이 있지 않을까 싶다.

입문자용 변환 예제로 inputOption은 생략해도 무방할 것이다.

뭐 이런 글도 놓치지 말자. 이해하는데 조금이라도 더 도움이 될 것이다.
Note: the save() method is actually syntactic sugar for calling both output() and run().

참 친절하게도 익스프레스에서 스트림하는 예제를 적어주고 있다.
(예제에서는 flow player를 이용해 HTML을 이용하고 있다.
어도비 그려져있으니 플래시 느낌인데 플래시 죽지 않았나?)

언제나 말하든, 적절한 취사선택을 하기 바라고
다음 차례로 리얼 스트리밍 프로토콜에 대한 글이 이어지니 계속 읽어보면 도움이 될 듯하다
물론 다음 글에 친절히 설명이 되어 있다.
링크

profile
개발하기

0개의 댓글