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_fileffplay [options] input_file
ffplay -ss 24 public/media/big_buck_bunny.mp4ffplay -ss 24 public/media/big_buck_bunny.mp4
Simple multimedia streams analyzer.
ffprobe -hide_banner public/media/big_buck_bunny.mp4ffprobe -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.webmffmpeg -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.mp3ffmpeg -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.gifffmpeg -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.4Mls -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.gifffmpeg -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 # afterls -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.jpgffmpeg -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
