damianociarla/node-ffmpeg
ffmpeg module for nodejs
소개
node-ffmpeg은 코드에서 명령줄 도구인 ffmpeg와 ffprobe를 제어할 수 있게 해주는 JavaScript/TypeScript 라이브러리입니다. 셸 명령을 직접 입력하는 대신 setVideoCodec('libx264') 또는 save('/output.mp4')와 같은 메서드를 호출합니다. 널리 사용되는 기존 ffmpeg 패키지의 API를 래핑하면서도 네이티브 Promise, TypeScript 타입 지원, ESM 및 CommonJS 호환성 등 현대적인 기능을 추가했습니다.
요구 사항
- Node.js 24 이상.
ffmpeg와ffprobe가 시스템에 설치되어 있고PATH에 있어야 합니다. 또는 정확한 경로를 제공해야 합니다.- 이 라이브러리는 의도적으로 자체 FFmpeg 바이너리를 다운로드하지 않습니다. 이는 패키지 크기를 작게 유지하고 필요한 FFmpeg 빌드와 코덱을 직접 선택할 수 있게 합니다.
설치
npm install ffmpeg
빠른 시작 (TypeScript)
import ffmpeg from 'ffmpeg';
const video = await ffmpeg('/media/input.mp4');
video.on('progress', ({ percent, time }) => {
console.log(percent === undefined ? `${time}s` : `${percent.toFixed(1)}% (${time}s)`);
});
await video
.setVideoCodec('libx264')
.setVideoBitRate(2_000)
.setAudioCodec('aac')
.setAudioBitRate(192)
.setVideoSize('1280x?', true, true, 'black')
.save('/media/output.mp4');
메서드는 체인 가능하며, 연속해서 호출할 수 있습니다. 작업은 save()와 같은 터미널 메서드를 호출할 때 시작됩니다. 기존 패키지의 콜백 스타일 API도 지원하며, timeout 및 overwrite와 같은 옵션을 지원하는 명명된 팩토리 create()도 제공합니다.
많은 파일을 처리하는 서비스의 경우 createClient()를 사용하여 클라이언트를 한 번 생성하고 FFmpeg 설정을 재사용할 수 있습니다.
실행 파일 경로
ffmpeg와 ffprobe의 경로를 전역(레거시 앱용) 또는 작업별로 설정할 수 있습니다. 절대 경로인 ffmpegPath를 제공하고 ffprobePath를 제공하지 않으면, 라이브러리는 ffprobe가 해당 경로 옆에 있다고 가정합니다.
설정 (README의 표)
| 설정 | 기본값 | 의미 |
|---|---|---|
encoding |
utf8 |
프로세스 출력 인코딩 |
timeout |
0 |
최대 작업 시간(ms); 0 = 타임아웃 없음 |
maxBuffer |
16 MiB | 유지할 변환 출력량; 프로브 출력의 최대치이기도 함 |
overwrite |
false |
-y를 사용하여 덮어쓰기; 그렇지 않으면 -n으로 대화형 프롬프트 방지 |
ffmpegPath |
ffmpeg |
FFmpeg 실행 파일 |
ffprobePath |
ffprobe |
ffprobe 실행 파일 |
signal |
— | 작업을 취소하기 위한 AbortSignal |
cwd, env |
상속 | 자식 프로세스 작업 디렉토리 및 환경 변수 |
장시간 실행되는 변환은 출력의 마지막 maxBuffer 바이트만 유지합니다. 프로브 출력은 maxBuffer 내에 완전히 맞아야 하며, 그렇지 않으면 작업이 오류 119와 함께 실패합니다.
API 하이라이트
- 세터(모두 체인 가능):
setDisableVideo,setVideoCodec,setVideoBitRate등의 비디오 세터;setDisableAudio,setAudioCodec,setAudioBitRate등의 오디오 세터;setMetadata,setThreads,setWatermark,addInput,addCommand,addOutputOption,addFilterComplex,getCommand(빌드된 명령 반환) 등의 일반 세터. - 터미널 메서드:
save,fnExtractSoundToMP3,fnExtractFrameToJPG,fnAddWatermark. 이 메서드들이 실제 프로세스를 시작합니다. copy는 코덱 값으로 허용되며, "재인코딩 없이 스트림 복사"를 의미합니다.- 사용자 지정 옵션 반복(예: 여러
-map또는-metadata항목)이 허용됩니다.
터미널 메서드 내의 유효성 검사는 Promise 거부 또는 선택적 콜백을 통해 오류를 반환합니다. 세터 유효성 검사는 동기적으로 유지됩니다. 동일한 비디오 객체에 대한 동시 작업은 격리된 옵션 스냅샷을 사용합니다.
메타데이터 및 이벤트
video.metadata는 원래 형태(duration,video,audio, 태그)를 유지하며video.metadata.raw에서 전체 ffprobe 응답을 노출합니다.- 수명 주기 이벤트를 수신할 수 있습니다:
'start','progress'(백분율/시간 포함),'stderr','end','error'. 'error'리스너는 선택 사항입니다. 실패한 Promise는 리스너 없이도 정상적으로 거부됩니다.
프레임 추출
const files = await video.fnExtractFrameToJPG('/media/frames', {
start_time: '00:00:10',
every_n_seconds: 5,
number: 10,
size: '640x?',
quality: 2,
file_name: 'preview_%s',
});
every_n_frames, every_n_seconds, every_n_percentage 중 하나만 설정할 수 있습니다. 반환된 경로에는 추출 패턴과 일치하는 파일만 포함됩니다.
사용자 지정 FFmpeg 옵션
addCommand를 사용하여 원시 인수를 전달합니다. 이 인수는 셸 해석 없이 spawn으로 직접 전달되므로 셸 따옴표를 추가하지 마십시오. 이 메서드들은 신뢰할 수 있는 탈출구이므로 검증되지 않은 사용자 입력을 절대 전달하지 마십시오. -로 시작하는 출력 대상은 거부됩니다. 대신 ./-name.ext를 사용하십시오.
0.0.4 버전에서의 마이그레이션
- Node.js 24+ 및
ffprobe가 필수입니다. - 네이티브 Promise가 이전
when라이브러리를 대체했습니다.await는 이전과 동일하게 작동합니다. - 오류는 이제 과거의 숫자
code및msg필드를 가진FfmpegError인스턴스입니다. - 워터마크 나침반 위치는 이제 일반적인 의미를 따릅니다(
NE= 오른쪽 상단, 이전 반전 문제 수정). - 비트레이트는
-b:v/-b:a를 사용하며, 숫자 값은 kbit/s로 처리됩니다. - 기존 출력은
-n으로 보호됩니다. 덮어쓰려면overwrite: true를 설정하여-y를 사용하십시오. - 패키지에 TypeScript 선언이 포함되어 있으므로
@types/ffmpeg는 필요하지 않습니다.
보안
FFmpeg는 신뢰할 수 없고 복잡한 미디어를 처리합니다. 시스템 FFmpeg에 패치를 적용하고, 리소스 제한을 적용하며, 신뢰할 수 없는 입력을 수락하기 전에 SECURITY.md를 읽으십시오.
라이선스
MIT © Damiano Ciarla
관련
- 프로젝트
- 프로젝트
- 프로젝트
- 프로젝트