2018-04-11 17:16:12 +02:00
|
|
|
|
<!DOCTYPE html>
|
|
|
|
|
<html>
|
|
|
|
|
<head>
|
|
|
|
|
<meta charset="utf-8">
|
|
|
|
|
<title>FFmpeg</title>
|
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
|
|
|
<link rel="stylesheet" href="../node_modules/reveal.js/css/reveal.css">
|
|
|
|
|
<link rel="stylesheet" href="../node_modules/reveal.js/css/print/pdf.css" media="print">
|
|
|
|
|
<link rel="stylesheet" href="../node_modules/reveal.js/css/theme/black.css">
|
|
|
|
|
<link rel="stylesheet" href="../node_modules/highlight.js/styles/solarized-dark.css">
|
2018-04-28 15:00:36 +02:00
|
|
|
|
<link href="https://fonts.googleapis.com/css?family=Fira+Sans:400,700|Fira+Mono" rel="stylesheet">
|
2018-04-11 17:16:12 +02:00
|
|
|
|
<style>
|
|
|
|
|
body * {
|
|
|
|
|
font-family: "Fira Sans", Roboto, Helvetica, sans-serif !important;
|
|
|
|
|
}
|
|
|
|
|
code {
|
|
|
|
|
font-family: "Fira Mono", "Roboto Mono", monospace !important;
|
|
|
|
|
}
|
|
|
|
|
</style>
|
|
|
|
|
<script>
|
|
|
|
|
var link = document.createElement( 'link' );
|
|
|
|
|
link.rel = 'stylesheet';
|
|
|
|
|
link.type = 'text/css';
|
|
|
|
|
link.href = window.location.search.match( /print-pdf/gi ) ? '../node_modules/reveal.js/css/print/pdf.css' : '../node_modules/reveal.js/css/print/paper.css';
|
|
|
|
|
document.getElementsByTagName( 'head' )[0].appendChild( link );
|
|
|
|
|
</script>
|
|
|
|
|
</head>
|
|
|
|
|
<body>
|
|
|
|
|
<div class="reveal">
|
|
|
|
|
<div class="slides">
|
|
|
|
|
<section data-background-image="img/cinema.jpg">
|
|
|
|
|
<h1>FFmpeg</h1>
|
|
|
|
|
Muldimedia manipulation made easy
|
|
|
|
|
<aside class="notes">
|
|
|
|
|
<ul>
|
|
|
|
|
<li>I’d like to tell you about…</li>
|
|
|
|
|
<li>You might not know it</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</aside>
|
|
|
|
|
</section>
|
|
|
|
|
<section>
|
|
|
|
|
<section data-background-image="img/matrix.jpg">
|
|
|
|
|
<h2>What is FFmpeg?</h2>
|
|
|
|
|
<aside class="notes">
|
|
|
|
|
<ul>
|
|
|
|
|
<li>You might ask yourself:</li>
|
|
|
|
|
<li>Why do I have to know something about ffmpeg?</li>
|
|
|
|
|
<li>Very popular video sites like YouTube use it</li>
|
|
|
|
|
<li>I’m going to start with a quick introduction to ffmpeg</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</aside>
|
|
|
|
|
</section>
|
|
|
|
|
<section data-background-image="img/cat.jpg">
|
|
|
|
|
<h3>A/V manipulation</h3>
|
|
|
|
|
<ul>
|
|
|
|
|
<li class="fragment fade-down">one <em>format</em> to another</li>
|
|
|
|
|
<li class="fragment fade-down">reduce the file size (and quality)</li>
|
|
|
|
|
<li class="fragment fade-down">draw text on some fancy graphics while playing music</li>
|
|
|
|
|
</ul>
|
|
|
|
|
<aside class="notes">
|
|
|
|
|
<ul>
|
|
|
|
|
<li>main purpose: Manipulation</li>
|
|
|
|
|
<li>manipulation is not bad!</li>
|
|
|
|
|
<li>can be as simple as: one format to another</li>
|
|
|
|
|
<li>no time to explain, why format does not fit well</li>
|
|
|
|
|
<li>more compex case: reduce the file size and obviously the quality</li>
|
|
|
|
|
<li>another compex case: draw text on some fancy graphics while playing music</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</aside>
|
|
|
|
|
</section>
|
|
|
|
|
<section data-background-image="img/construction.jpg">
|
|
|
|
|
<h3>practical examples</h3>
|
|
|
|
|
<pre class="fragment"><code class="bash" data-trim>
|
|
|
|
|
ffmpeg -i foo.mp4 bar.mp4
|
|
|
|
|
</code></pre>
|
|
|
|
|
<pre class="fragment"><code class="bash" data-trim>
|
|
|
|
|
ffmpeg -i foo.mp4 -c:v libx264 -crf 28 \
|
|
|
|
|
-vf "scale=-2:720" -c:a aac -b:a 128k bar.mp4
|
|
|
|
|
</code></pre>
|
|
|
|
|
<pre class="fragment"><code class="bash" data-trim>
|
|
|
|
|
ffmpeg -i in.mp4 -b:v 1800k -minrate 900k -maxrate 2160k \
|
|
|
|
|
-tile-columns 2 -g 240 -threads 8 -deadline good \
|
|
|
|
|
-crf 31 -c:v libvpx-vp9 -c:a libopus -ac 2 -vbr on \
|
|
|
|
|
-b:a 96k -c:s copy -map 0 -pass 1 -cpu-used 1 out.mkv
|
|
|
|
|
</code></pre>
|
|
|
|
|
<pre class="fragment"><code class="bash" data-trim>
|
|
|
|
|
ffmpeg -i in.mp4 -b:v 1800k -minrate 900k -maxrate 2160k \
|
|
|
|
|
-tile-columns 4 -g 240 -threads 8 -deadline good \
|
|
|
|
|
-crf 31 -c:v libvpx-vp9 -c:a libopus -ac 2 -vbr on \
|
|
|
|
|
-b:a 96k -c:s copy -map 0 -pass 2 -cpu-used 1 out.mkv
|
|
|
|
|
</code></pre>
|
|
|
|
|
<aside class="notes">
|
|
|
|
|
<ul>
|
|
|
|
|
<li>so let’s get our hands dirty</li>
|
|
|
|
|
<li>the first is mostly quite useless</li>
|
|
|
|
|
<li>the second one basically reduces the file size</li>
|
|
|
|
|
<li>the big ones are used in my production setup</li>
|
|
|
|
|
<li>they change the format of the video and optimize it to achieve smaller sizes with only little quality loss</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</aside>
|
|
|
|
|
</section>
|
|
|
|
|
</section>
|
|
|
|
|
<section data-background-video="img/facepalm.mp4">
|
|
|
|
|
<h3>End</h3>
|
|
|
|
|
<aside class="notes">
|
|
|
|
|
<ul>
|
|
|
|
|
<li>so finally, we are at the end</li>
|
|
|
|
|
<li>You’ll most likely say: “I’ll never use ffmpeg”</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</aside>
|
|
|
|
|
</section>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<script src="../node_modules/reveal.js/lib/js/head.min.js"></script>
|
|
|
|
|
<script src="../node_modules/reveal.js/js/reveal.js"></script>
|
|
|
|
|
<script>
|
|
|
|
|
Reveal.initialize({
|
|
|
|
|
controls: true,
|
|
|
|
|
progress: true,
|
|
|
|
|
history: true,
|
|
|
|
|
center:true,
|
|
|
|
|
|
|
|
|
|
width: 1280,
|
|
|
|
|
height: 800,
|
|
|
|
|
|
|
|
|
|
transition: 'slide', // none, fade, slide, convex, concave, zoom
|
|
|
|
|
|
|
|
|
|
dependencies: [
|
|
|
|
|
// Syntax highlight for <code> elements
|
|
|
|
|
{ src: '../node_modules/reveal.js/plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },
|
|
|
|
|
|
|
|
|
|
// Zoom in and out with Alt+click
|
|
|
|
|
{ src: '../node_modules/reveal.js/plugin/zoom-js/zoom.js', async: true },
|
|
|
|
|
|
|
|
|
|
// Speaker notes
|
|
|
|
|
{ src: '../node_modules/reveal.js/plugin/notes/notes.js', async: true },
|
|
|
|
|
]
|
|
|
|
|
});
|
|
|
|
|
</script>
|
|
|
|
|
</body>
|
|
|
|
|
</html>
|