<!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">
    <link href="https://fonts.googleapis.com/css?family=Fira+Sans:400,700|Fira+Mono" rel="stylesheet">
    <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>