Speaker: Fabrizio A. Vitale
No birds were harmed in the making of this talk.
FFmpeg is the leading multimedia framework, able to decode, encode, transcode, mux, demux, stream, filter and play pretty
much anything that humans and machines have created.
ffmpeg website
A powerful, quick and relatively intuitive suite of CLI tools
to manipulate audio and videos.
Me
a simple CLI media player.
ffplay [options] input_file
ffplay [options] input_file
ffplay -ss 24 public/media/big_buck_bunny.mp4
ffplay -ss 24 public/media/big_buck_bunny.mp4
Simple multimedia streams analyzer.
ffprobe -hide_banner public/media/big_buck_bunny.mp4
ffprobe -hide_banner public/media/big_buck_bunny.mp4
-hide_banner
Hides verbose banner.public/media/big_buck_bunny.mp3
file to analyze.Hyper fast Audio and Video encoder.
ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
ffmpeg [options] [[infile options] -i infile] {[outfile options] outfile}
ffmpeg [options] [[infile options] -i infile] {[outfile options] outfile}
ffmpeg -y -i public/media/big_buck_bunny.mp4 \ -vcodec libvpx -acodec libvorbis public/media/big_buck_bunny.webm
ffmpeg -y -i public/media/big_buck_bunny.mp4 \ -vcodec libvpx -acodec libvorbis public/media/big_buck_bunny.webm
-y
overwrite output files.-i public/media/big_buck_bunny.mp4
input file.-vcodec libvpx
set video codec.-acodec libvorbis
set audio codec.public/media/big_buck_bunny.webm
output file.ffmpeg -y -i public/media/big_buck_bunny.mp4 public/media/big_buck_bunny.mp3
ffmpeg -y -i public/media/big_buck_bunny.mp4 public/media/big_buck_bunny.mp3
-y
overwrite output files.-i public/media/big_buck_bunny.mp4
input file.public/media/big_buck_bunny.mp3
output file.ffmpeg -y -ss 24 -t 3 \ -i public/media/big_buck_bunny.mp4 public/media/big_buck_bunny.gif # or ffmpeg -y -ss 24 -to 27 \ -i public/media/big_buck_bunny.mp4 public/media/big_buck_bunny.gif
ffmpeg -y -ss 24 -t 3 \ -i public/media/big_buck_bunny.mp4 public/media/big_buck_bunny.gif # or ffmpeg -y -ss 24 -to 27 \ -i public/media/big_buck_bunny.mp4 public/media/big_buck_bunny.gif
-y
overwrite output files.-ss 24
| -ss 00:00:24
seek to 24th second.-t 3
set duration to 3 seconds.-to 27
| -ss 00:00:27
end video at the 27th second.ls -lh public/media/big_buck_bunny.gif | awk -F " " {'print $5'} 1.4M
ls -lh public/media/big_buck_bunny.gif | awk -F " " {'print $5'} 1.4M
ffmpeg -y \ -ss 24 -t 3 -i public/media/big_buck_bunny.mp4 \ -vf "fps=12,scale=320:-1" \ public/media/big_buck_bunny_fps_scale.gif
ffmpeg -y \ -ss 24 -t 3 -i public/media/big_buck_bunny.mp4 \ -vf "fps=12,scale=320:-1" \ public/media/big_buck_bunny_fps_scale.gif
-y
overwrite output files.-vf 'fps=12'
Sets output framerate to 12fps.-vf "scale=320:-1"
Scales width to 320px while preserving the aspect ratio.ls -lh public/media/big_buck_bunny.gif | awk -F " " {'print $5'} 1.4M # before ls -lh public/media/big_buck_bunny_fps_scale.gif | awk -F " " {'print $5'} 184K # after
ls -lh public/media/big_buck_bunny.gif | awk -F " " {'print $5'} 1.4M # before ls -lh public/media/big_buck_bunny_fps_scale.gif | awk -F " " {'print $5'} 184K # after
ffmpeg -y \ -ss 00:00:24.82 \ -i public/media/big_buck_bunny.mp4 \ -frames:v 1 \ public/media/big_buck_bunny_pic.jpg
ffmpeg -y \ -ss 00:00:24.82 \ -i public/media/big_buck_bunny.mp4 \ -frames:v 1 \ public/media/big_buck_bunny_pic.jpg
-y
overwrite output files.-ss 00:00:24.82
seek input file to 24th second.-frames:v 1
set the number of frames to output 1.// run with "node examples/node/extract-audio.mjs --input public/media/big_buck_bunny.mp4" import { spawn } from "node:child_process"; import { z } from "zod"; import process from "node:process"; import parse from "yargs-parser"; function extractAudio(params) { const parsedArgs = z.object({ input: z.string().min(3) }).parse(params); const childProcess = spawn( "ffmpeg", ["-y", "-i", parsedArgs.input, `${parsedArgs.input}-node.mp3`], { stdio: "inherit", shell: true } ); childProcess.on("error", (err) => { console.log(err); process.exitCode = 1; }); childProcess.on("close", (code) => { if (code) { console.error(`ffmpeg exit code=${code}`); process.exitCode = 1; } }); } extractAudio(parse(process.argv.slice(2), { string: ["input"] }));
// run with "node examples/node/extract-audio.mjs --input public/media/big_buck_bunny.mp4" import { spawn } from "node:child_process"; import { z } from "zod"; import process from "node:process"; import parse from "yargs-parser"; function extractAudio(params) { const parsedArgs = z.object({ input: z.string().min(3) }).parse(params); const childProcess = spawn( "ffmpeg", ["-y", "-i", parsedArgs.input, `${parsedArgs.input}-node.mp3`], { stdio: "inherit", shell: true } ); childProcess.on("error", (err) => { console.log(err); process.exitCode = 1; }); childProcess.on("close", (code) => { if (code) { console.error(`ffmpeg exit code=${code}`); process.exitCode = 1; } }); } extractAudio(parse(process.argv.slice(2), { string: ["input"] }));
// run with "node examples/node/extract-audio-wasm.mjs --input public/media/big_buck_bunny.mp4" import { z } from "zod"; import process from "node:process"; import parse from "yargs-parser"; import path from "node:path"; import fs from 'node:fs'; import { createFFmpeg, fetchFile } from '@ffmpeg/ffmpeg'; const ffmpeg = createFFmpeg({ log: true }); async function extractAudio(params) { const parsedArgs = z.object({ input: z.string().min(3) }).parse(params); const inputBasename = path.basename(parsedArgs.input) const outputFilepath = `${parsedArgs.input}-node-wasm.mp3` const outputBasename = path.basename(outputFilepath) await ffmpeg.load(); ffmpeg.FS('writeFile', inputBasename, await fetchFile(parsedArgs.input)); await ffmpeg.run('-i', inputBasename, outputBasename); await fs.promises.writeFile(outputFilepath, ffmpeg.FS('readFile', outputBasename)); } await extractAudio(parse(process.argv.slice(2), { string: ["input"] })); process.exit(0); // You have to force the exit with ffmpeg.wasm
// run with "node examples/node/extract-audio-wasm.mjs --input public/media/big_buck_bunny.mp4" import { z } from "zod"; import process from "node:process"; import parse from "yargs-parser"; import path from "node:path"; import fs from 'node:fs'; import { createFFmpeg, fetchFile } from '@ffmpeg/ffmpeg'; const ffmpeg = createFFmpeg({ log: true }); async function extractAudio(params) { const parsedArgs = z.object({ input: z.string().min(3) }).parse(params); const inputBasename = path.basename(parsedArgs.input) const outputFilepath = `${parsedArgs.input}-node-wasm.mp3` const outputBasename = path.basename(outputFilepath) await ffmpeg.load(); ffmpeg.FS('writeFile', inputBasename, await fetchFile(parsedArgs.input)); await ffmpeg.run('-i', inputBasename, outputBasename); await fs.promises.writeFile(outputFilepath, ffmpeg.FS('readFile', outputBasename)); } await extractAudio(parse(process.argv.slice(2), { string: ["input"] })); process.exit(0); // You have to force the exit with ffmpeg.wasm
// run with "deno run -A examples/deno/extract-audio.ts --input public/media/big_buck_bunny.mp4" import { parse } from "https://deno.land/std@0.187.0/flags/mod.ts"; import { z } from "https://deno.land/x/zod@v3.21.4/mod.ts"; async function extractAudio(params: unknown) { const parsedArgs = z.object({ input: z.string().min(3) }).parse(params); const command = new Deno.Command("ffmpeg", { args: [ "-y", "-i", parsedArgs.input, `${parsedArgs.input}-deno.mp3`, ], }); const { code } = await command.spawn().output() if (code) { throw new Error(`ffmpeg exit-code=${code}`); } } await extractAudio(parse(Deno.args, { string: ["input"] }));
// run with "deno run -A examples/deno/extract-audio.ts --input public/media/big_buck_bunny.mp4" import { parse } from "https://deno.land/std@0.187.0/flags/mod.ts"; import { z } from "https://deno.land/x/zod@v3.21.4/mod.ts"; async function extractAudio(params: unknown) { const parsedArgs = z.object({ input: z.string().min(3) }).parse(params); const command = new Deno.Command("ffmpeg", { args: [ "-y", "-i", parsedArgs.input, `${parsedArgs.input}-deno.mp3`, ], }); const { code } = await command.spawn().output() if (code) { throw new Error(`ffmpeg exit-code=${code}`); } } await extractAudio(parse(Deno.args, { string: ["input"] }));
Conclusions /1
Conclusions /2