NodeJS의 웹 GIF를 사용하여 MP4로 변환
Originally published @ puruvj.dev
누가 이런 좋은 선물을 좋아하지 않습니까?이런 것들이 소셜미디어에서 대량으로 사용되고 있는데, 우리 중 많은 사람들(* 기침 * 나 자신 * 기침 *)은 이것들을 떠날 수 없다(내가 틀렸다는 것을 증명한다)😎)
그러나 이 선물들은 매우 비싸다.그것들은 대량의 CPU와 GPU 전원을 소모하여 파일 크기가 매우 크다.위에 있는 이 GIF.👆 다운로드 시 890kb입니다.이 숫자는 크지 않아 보일 수도 있지만, MP4 버전은 132kb에 불과하다.
It's 85% smaller 😮
그것은 CPU를 거의 소모하지 않는다.가장 오래된 장치라도 쉽게 재생할 수 있다
어떻게 변환합니까
이 명령을 실행하면 GIF를 MP4로 변환할 수 있습니다.
ffmpeg -i harry-eats-cupcake.gif -pix_fmt yuv420p -c:v libx264 -movflags +faststart -filter:v crop='floor(in_w/2)*2:floor(in_h/2)*2' output.mp4
그 이상한 선택들은 무엇입니까?이따가 설명할게요.
그러나 이 기능은 각 GIF에서 수동으로 실행해야 합니다.
그러나 우리는 개발자가 이렇게 하는 것을 좋아하지 않는다🙄. 이 과정을 자동화합시다.
종속 항목 설치ffmpeg
의 바이너리 파일이 필요하며 어떻게 사용하는지 고려해야 합니다.우리는 정확한 바이너리 파일을 다운로드해야 한다.실제 응용 프로그램에서 클라우드/서버에 코드를 배치하고 FFMPEG가 필요하다는 뜻입니다.
만약 그것이 당신의 서버라면, 당신은 수동으로 거기에 업로드할 수 있으며, 그것은 작동할 것이다.그러나 대량의 사전 처리와 테스트를 하지 않으면 바이너리 파일을 구글 클라우드 기능/AWS lambda 등 클라우드 환경에 직접 업로드할 수 없다.운영체제 기반의 바이너리 파일 옆에 Ubuntu와 호환되는 FFMPEG 바이너리 파일을 보존해야 하지만, 여전히 정상적으로 작동하지 않습니다.
하지만 NPM 제신에게 감사드립니다. 우리는 @ffmpeg-installer/ffmpeg 패키지를 가지고 있습니다. 이것은 운영체제를 바탕으로 정확한 바이너리 파일을 설치했습니다.Windows를 실행하면 ffmpeg.exe
파일이 다운로드됩니다.만약 운영체제가 linux를 기반으로 한다면, 이것은 특정한 바이너리 파일을 다운로드할 것이다.
fluent-ffmpeg이라는 믿을 수 없는 패키지가 있는데 이것은 매우 성명적이고 리셋 기반 API를 제공하여 FFMPEG와 상호작용을 한다.
이것들을 다운로드해 주세요.npm 설정이 있는지 확인하십시오.
npm i -D @ffmpeg-installer/ffmpeg fluent-ffmpeg @ffprobe-installer/ffprobe
FFMPEG에는 @ffprobe-installer/ffprobe
팩이 더 필요합니다.
비밀번호
먼저 index.js
파일에서 FFMPEG 경로를 설정합니다.
const ffmpegInstaller = require("@ffmpeg-installer/ffmpeg");
const ffprobe = require("@ffprobe-installer/ffprobe");
const ffmpeg = require("fluent-ffmpeg")()
.setFfprobePath(ffprobe.path)
.setFfmpegPath(ffmpegInstaller.path);
The code snippet above ☝ is not optional. Not having this config will break your program
이제 GIF를 MP4로 변환하는 코드
ffmpeg
.input(gifPath)
.noAudio()
.output(`vidgif.mp4`)
.on("end", () => {
console.log("Finished");
})
.on("error", (e) => console.log(e))
.run();
ffmpeg -i harry-eats-cupcake.gif -pix_fmt yuv420p -c:v libx264 -movflags +faststart -filter:v crop='floor(in_w/2)*2:floor(in_h/2)*2' output.mp4
ffmpeg
의 바이너리 파일이 필요하며 어떻게 사용하는지 고려해야 합니다.우리는 정확한 바이너리 파일을 다운로드해야 한다.실제 응용 프로그램에서 클라우드/서버에 코드를 배치하고 FFMPEG가 필요하다는 뜻입니다.만약 그것이 당신의 서버라면, 당신은 수동으로 거기에 업로드할 수 있으며, 그것은 작동할 것이다.그러나 대량의 사전 처리와 테스트를 하지 않으면 바이너리 파일을 구글 클라우드 기능/AWS lambda 등 클라우드 환경에 직접 업로드할 수 없다.운영체제 기반의 바이너리 파일 옆에 Ubuntu와 호환되는 FFMPEG 바이너리 파일을 보존해야 하지만, 여전히 정상적으로 작동하지 않습니다.
하지만 NPM 제신에게 감사드립니다. 우리는 @ffmpeg-installer/ffmpeg 패키지를 가지고 있습니다. 이것은 운영체제를 바탕으로 정확한 바이너리 파일을 설치했습니다.Windows를 실행하면
ffmpeg.exe
파일이 다운로드됩니다.만약 운영체제가 linux를 기반으로 한다면, 이것은 특정한 바이너리 파일을 다운로드할 것이다.fluent-ffmpeg이라는 믿을 수 없는 패키지가 있는데 이것은 매우 성명적이고 리셋 기반 API를 제공하여 FFMPEG와 상호작용을 한다.
이것들을 다운로드해 주세요.npm 설정이 있는지 확인하십시오.
npm i -D @ffmpeg-installer/ffmpeg fluent-ffmpeg @ffprobe-installer/ffprobe
FFMPEG에는 @ffprobe-installer/ffprobe
팩이 더 필요합니다.비밀번호
먼저 index.js
파일에서 FFMPEG 경로를 설정합니다.
const ffmpegInstaller = require("@ffmpeg-installer/ffmpeg");
const ffprobe = require("@ffprobe-installer/ffprobe");
const ffmpeg = require("fluent-ffmpeg")()
.setFfprobePath(ffprobe.path)
.setFfmpegPath(ffmpegInstaller.path);
The code snippet above ☝ is not optional. Not having this config will break your program
이제 GIF를 MP4로 변환하는 코드
ffmpeg
.input(gifPath)
.noAudio()
.output(`vidgif.mp4`)
.on("end", () => {
console.log("Finished");
})
.on("error", (e) => console.log(e))
.run();
const ffmpegInstaller = require("@ffmpeg-installer/ffmpeg");
const ffprobe = require("@ffprobe-installer/ffprobe");
const ffmpeg = require("fluent-ffmpeg")()
.setFfprobePath(ffprobe.path)
.setFfmpegPath(ffmpegInstaller.path);
The code snippet above ☝ is not optional. Not having this config will break your program
ffmpeg
.input(gifPath)
.noAudio()
.output(`vidgif.mp4`)
.on("end", () => {
console.log("Finished");
})
.on("error", (e) => console.log(e))
.run();
.input(gifPath)
이 경로를 통해 GIF 파일을 입력하고 있습니다.상대 경로는 여기에서 ../../harry-eats-cupcake.gif
과 유사하게 작용한다..noAudio()
은 파일에서 모든 오디오를 삭제합니다.일리가 있다.GIFs는 말을 못해요.😉. .output('vidgif.mp4')
은 출력 파일을 써야 하는 경로입니다.FFMPEG는 출력 파일의 형식을 보고 (이곳은 .mp4
) 인코딩에 사용되는currect 라이브러리를 자동으로 선택하며 libx264
은 mp4 파일에 사용됩니다.
libx264
is a video encoding library that encodes the video file into H.264 encoding, the most widely supported video codec. See here: Caniuse H.264
.on("end")
과 .on("error")
은 각각 프로세스가 완성되거나 오류가 발생하고 닫힐 때 발생하는 이벤트입니다..run()
은 이곳에서 가장 중요한 선이다.그것이 없으면 이 과정은 시작되지 않을 것이다. 너는 너의 공백 단말기를 쳐다보며 어떤 일도 일어나기를 기다릴 것이다. 이것은 일어나지 않을 것이다😏. vidgif.mp4
이 당신이 원하는 곳에 앉을 것입니다.그것의 사이즈는 훨씬 작을 뿐만 아니라, 아주 잘 놀 수 있다.교체만 하면 됩니다.
<img src="harry-eats-cupcake.gif" />
가지다<video autoplay loop muted playsinline>
<source src="vidgif.mp4" type="video/mp4" />
Your browser doesn't support HTML5 video playback.
<a href="harry-eats-cupcake.gif" target="_blank" rel="noopener"
>See the gif here</a
>
</video>
이제 GIF처럼 재생됩니다!playsinline
은 IOS Safari에서 자동으로 실행되는 데 필요하며 성능에도 좋습니다.근데 잠깐만!함정이 하나 있어!
이 파일을 운영 환경으로 전송하고 Android 또는 IOS에서 보려면 GIF가 표시되는 빈 영역이 표시됩니다.왜?
호환성
위의 코드는 최대 호환성을 위해 새로운 MP4 영상을 인코딩하지 않았습니다.
생성된 파일은 각종 인코더가 미리 설치된 컴퓨터에서 정상적으로 작동합니다.하지만 당신 핸드폰의 브라우저는 동영상 파일을 해석할 수 없습니다.
솔루션
위의 코드 세션을 기억하십니까?또 왔어요👇
ffmpeg -i harry-eats-cupcake.gif -pix_fmt yuv420p -c:v libx264 -movflags +faststart -filter:v crop='floor(in_w/2)*2:floor(in_h/2)*2' output.mp4
이 코드는 매우 유효하다.출력이곳의 mp4도 휴대전화에 적용된다.그런데 저희가 어떻게 fluent-ffmpeg
형식으로 번역할 수 있을까요?🤔?fluent-ffmpeg
에는 outputOptions
방법이 있습니다. 이 방법은 모든 출력 옵션의 그룹을 받아들입니다.요컨대 -i inputFile.gif
이후의 모든 옵션은 outputOption
입니다.
비밀번호입니다.
ffmpeg
.input(gifPath)
.outputOptions([
"-pix_fmt yuv420p",
"-c:v libx264",
"-movflags +faststart",
"-filter:v crop='floor(in_w/2)*2:floor(in_h/2)*2'",
])
.noAudio()
.output(`vidgif.mp4`)
.on("end", () => {
console.log('Ended')
})
.on("error", (e) => console.log(e))
.run();
위의 코드 세션을 기억하십니까?또 왔어요👇
ffmpeg -i harry-eats-cupcake.gif -pix_fmt yuv420p -c:v libx264 -movflags +faststart -filter:v crop='floor(in_w/2)*2:floor(in_h/2)*2' output.mp4
이 코드는 매우 유효하다.출력이곳의 mp4도 휴대전화에 적용된다.그런데 저희가 어떻게 fluent-ffmpeg
형식으로 번역할 수 있을까요?🤔?fluent-ffmpeg
에는 outputOptions
방법이 있습니다. 이 방법은 모든 출력 옵션의 그룹을 받아들입니다.요컨대 -i inputFile.gif
이후의 모든 옵션은 outputOption
입니다.비밀번호입니다.
ffmpeg
.input(gifPath)
.outputOptions([
"-pix_fmt yuv420p",
"-c:v libx264",
"-movflags +faststart",
"-filter:v crop='floor(in_w/2)*2:floor(in_h/2)*2'",
])
.noAudio()
.output(`vidgif.mp4`)
.on("end", () => {
console.log('Ended')
})
.on("error", (e) => console.log(e))
.run();
webm
영화를 추가로 인코딩할 필요가 없고 인코딩 속도가 상당히 느리다.yuv420p
으로 Firefox와 호환되며 원본gif보다 색이 포화도가 낮은 단점이 있습니다.-movflags +faststart
로고는 브라우저 Reference
이 문제에 관하여(NodeJS의 웹 GIF를 사용하여 MP4로 변환), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/puruvj/gif-to-mp4-conversion-for-web-using-nodejs-135o텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)