<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: C.Y. Park</title>
    <description>The latest articles on DEV Community by C.Y. Park (@cypark).</description>
    <link>https://dev.to/cypark</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F636073%2F30265953-71f6-44b0-8030-e83801f90a10.jpeg</url>
      <title>DEV Community: C.Y. Park</title>
      <link>https://dev.to/cypark</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cypark"/>
    <language>en</language>
    <item>
      <title>Useful ffmpeg Commands by Examples</title>
      <dc:creator>C.Y. Park</dc:creator>
      <pubDate>Tue, 12 Oct 2021 07:28:28 +0000</pubDate>
      <link>https://dev.to/cypark/useful-ffmpeg-commands-by-examples-5dj4</link>
      <guid>https://dev.to/cypark/useful-ffmpeg-commands-by-examples-5dj4</guid>
      <description>&lt;p&gt;This article presents a number of different ffmpeg use cases assuming the reader has basic knowledge of the software. You will see various practical examples in this article. For more details, please refer to the &lt;a href="https://ffmpeg.org/ffmpeg.html"&gt;official documentation pages&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;All below examples are &lt;strong&gt;one liners&lt;/strong&gt; although they are presented in multiple lines. Simply copy and paste them in your terminal and hit enter.&lt;/p&gt;


&lt;center&gt;⋅ ⋅ ⋅&lt;/center&gt;
&lt;br&gt;
&lt;center&gt;◆ ◆ ◆&lt;/center&gt;
&lt;br&gt;
&lt;center&gt;⋅ ⋅ ⋅&lt;/center&gt;
&lt;h2&gt;
  
  
  1. Codec Options
&lt;/h2&gt;

&lt;p&gt;Setting up codecs is the crucial part of encoding media assets. You will usually want to either keep source file’s encoding or apply a new encoder.&lt;/p&gt;

&lt;p&gt;There are so many available codecs that ffmpeg supports. Below examples are some of the most popular combos that have been used in a number of different commercial projects.&lt;/p&gt;


&lt;center&gt;⋅ ⋅ ⋅&lt;/center&gt;
&lt;h3&gt;
  
  
  1.1 Convert to MP4
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; source.mov &lt;span class="nt"&gt;-c&lt;/span&gt;:v libx264 &lt;span class="nt"&gt;-c&lt;/span&gt;:a aac output.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;em&gt;libx264&lt;/em&gt; is one of the most popular H.264 encoders. &lt;code&gt;libx264&lt;/code&gt; + &lt;code&gt;aac&lt;/code&gt; combo supports IE11. Use &lt;code&gt;-crf&lt;/code&gt; option to control the output quality.&lt;/p&gt;


&lt;center&gt;⋅ ⋅ ⋅&lt;/center&gt;
&lt;h3&gt;
  
  
  1.2 Convert to WebM
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; source.mov &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-c&lt;/span&gt;:v libvpx-vp9 &lt;span class="nt"&gt;-crf&lt;/span&gt; 31 &lt;span class="nt"&gt;-b&lt;/span&gt;:v 1M &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-c&lt;/span&gt;:a libvorbis &lt;span class="se"&gt;\&lt;/span&gt;
output.webm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;code&gt;-crf&lt;/code&gt; stands for Constant Rate Factor. &lt;em&gt;libvpx&lt;/em&gt; doesn’t have default CRF value. &lt;code&gt;-crf 31&lt;/code&gt; for 1080p is usually considered good enough while it accepts any number between 0 (lossless) and 63 (worst quality). For your information, &lt;em&gt;libx264&lt;/em&gt; has default value of 28 with range from 0 to 51.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;-b:v&lt;/code&gt; is an option for bitrate. The value &lt;code&gt;1M&lt;/code&gt; is identical to &lt;code&gt;1000k&lt;/code&gt;. &lt;/p&gt;


&lt;center&gt;⋅ ⋅ ⋅&lt;/center&gt;
&lt;h3&gt;
  
  
  1.3 Convert to Ogg
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; source.mov &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-c&lt;/span&gt;:v libtheora &lt;span class="nt"&gt;-q&lt;/span&gt;:v 5 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-c&lt;/span&gt;:a libvorbis &lt;span class="nt"&gt;-q&lt;/span&gt;:a 5 &lt;span class="se"&gt;\&lt;/span&gt;
output.ogg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;code&gt;-q:v&lt;/code&gt; (video) and &lt;code&gt;-q:a&lt;/code&gt; (audio) are options for Variable Bit Rate (VBR) quality level. The value range is 1-31 where 1 is the highest quality and 31 is the lowest quality. Alternatively, they are identical to &lt;code&gt;-qscale:v&lt;/code&gt; and &lt;code&gt;-qscale:a&lt;/code&gt; respectively.&lt;/p&gt;


&lt;center&gt;⋅ ⋅ ⋅&lt;/center&gt;
&lt;h3&gt;
  
  
  1.4 Convert to GIF
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; source.mov &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-vf&lt;/span&gt; &lt;span class="s2"&gt;" &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
    scale=960:-1, &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
    fps=16, &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
    split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse
  "&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-loop&lt;/span&gt; 0 &lt;span class="se"&gt;\&lt;/span&gt;
output.gif
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;center&gt;⋅ ⋅ ⋅&lt;/center&gt;
&lt;h3&gt;
  
  
  1.5 Keep original encoding
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; source.mov &lt;span class="nt"&gt;-c&lt;/span&gt; copy output.mov
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This creates a duplicate copy of the source file.&lt;/p&gt;


&lt;center&gt;⋅ ⋅ ⋅&lt;/center&gt;
&lt;h3&gt;
  
  
  1.6 Remove audio track
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; source.mov &lt;span class="nt"&gt;-c&lt;/span&gt;:v copy &lt;span class="nt"&gt;-an&lt;/span&gt; output.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Use &lt;code&gt;-an&lt;/code&gt; to remove audio track while keeping video track with &lt;code&gt;-c:v copy&lt;/code&gt; option.&lt;/p&gt;


&lt;center&gt;⋅ ⋅ ⋅&lt;/center&gt;
&lt;h3&gt;
  
  
  1.7 Export the 99th frame to an image
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; source.mov &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-vf&lt;/span&gt; &lt;span class="s2"&gt;"select=eq(n&lt;/span&gt;&lt;span class="se"&gt;\,&lt;/span&gt;&lt;span class="s2"&gt; 98)"&lt;/span&gt; &lt;span class="nt"&gt;-vframes&lt;/span&gt; 1 &lt;span class="se"&gt;\&lt;/span&gt;
output.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Since the frame count starts from 0, the option should be &lt;code&gt;"select=eq(n\, 98)"&lt;/code&gt;, not &lt;code&gt;"select=eq(n\, 99)"&lt;/code&gt;.&lt;/p&gt;


&lt;center&gt;⋅ ⋅ ⋅&lt;/center&gt;
&lt;h3&gt;
  
  
  1.8 Export a frame at 5 second to an image
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; source.mov &lt;span class="nt"&gt;-ss&lt;/span&gt; 00:05:00 &lt;span class="nt"&gt;-vframes&lt;/span&gt; 1 output.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;center&gt;⋅ ⋅ ⋅&lt;/center&gt;
&lt;br&gt;
&lt;center&gt;◆ ◆ ◆&lt;/center&gt;
&lt;br&gt;
&lt;center&gt;⋅ ⋅ ⋅&lt;/center&gt;
&lt;h2&gt;
  
  
  2. Advanced Editing Features
&lt;/h2&gt;

&lt;p&gt;You can combine below options with any of above codec settings.&lt;/p&gt;


&lt;center&gt;⋅ ⋅ ⋅&lt;/center&gt;
&lt;h3&gt;
  
  
  2.1 Cut specific range from the source
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; source.mov &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-ss&lt;/span&gt; 00:05:00 &lt;span class="nt"&gt;-t&lt;/span&gt; 12 &lt;span class="se"&gt;\&lt;/span&gt;
output.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Output file will start from 5 minutes of the source file with the max length of 12 seconds, meaning that the output video will end at 00:05:12 of the source video if the source is longer than that.&lt;/p&gt;

&lt;p&gt;Alternatively, &lt;code&gt;-ss 00:05:00 -to 00:05:12&lt;/code&gt; or &lt;code&gt;-ss 300 -t 12&lt;/code&gt; can be used for the same result. &lt;code&gt;-ss&lt;/code&gt; can be used without &lt;code&gt;-t&lt;/code&gt; option.&lt;/p&gt;


&lt;center&gt;⋅ ⋅ ⋅&lt;/center&gt;
&lt;h3&gt;
  
  
  2.2 Resize video
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Resize to 1920x1080&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; source.mov &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-vf&lt;/span&gt; &lt;span class="s2"&gt;"scale=1920:1080"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
output.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Resize width to 1920 keeping source ratio&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; source.mov &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-vf&lt;/span&gt; &lt;span class="s2"&gt;"scale=1920:-1"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
output.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Resize width to 1920 but make height 2160 with black paddings&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; source.mov &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-vf&lt;/span&gt; &lt;span class="s2"&gt;"scale=1920:-1, pad=1920:2160:-1:-1:color=black"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
output.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;center&gt;⋅ ⋅ ⋅&lt;/center&gt;
&lt;h3&gt;
  
  
  2.3 Change video playback speed
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;2x faster&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; source.mov &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-vf&lt;/span&gt; &lt;span class="s2"&gt;"setpts=PTS/2"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-af&lt;/span&gt; &lt;span class="s2"&gt;"asetpts=PTS/2"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
output.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1/2x speed&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; source.mov &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-vf&lt;/span&gt; &lt;span class="s2"&gt;"setpts=PTS/.5"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-af&lt;/span&gt; &lt;span class="s2"&gt;"asetpts=PTS/.5"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
output.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;code&gt;PTS&lt;/code&gt; stands for Presentation TimeStamp. You can apply different video and audio speeds by giving different numbers on video filter (&lt;code&gt;-vf&lt;/code&gt;) and audio filter (&lt;code&gt;-af&lt;/code&gt;) respectively.&lt;/p&gt;


&lt;center&gt;⋅ ⋅ ⋅&lt;/center&gt;
&lt;h3&gt;
  
  
  2.4 Set frames per second (FPS)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; source.mov &lt;span class="nt"&gt;-vf&lt;/span&gt; &lt;span class="s2"&gt;"fps=30"&lt;/span&gt; output.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;center&gt;⋅ ⋅ ⋅&lt;/center&gt;
&lt;h3&gt;
  
  
  2.5 Combine multiple videos
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-safe&lt;/span&gt; 0 &lt;span class="nt"&gt;-f&lt;/span&gt; concat &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-i&lt;/span&gt; &amp;lt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;f &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;$PWD&lt;/span&gt;/&lt;span class="k"&gt;*&lt;/span&gt;.@&lt;span class="o"&gt;(&lt;/span&gt;mov|mp4&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
      &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;"file &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;f&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-c&lt;/span&gt; copy &lt;span class="se"&gt;\&lt;/span&gt;
output.mov
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Above command combines all the .mov and .mp4 files in the current directory and create &lt;em&gt;output.mov&lt;/em&gt; file. All videos must have same dimension ratio to avoid stretch or distortion.&lt;/p&gt;


&lt;center&gt;⋅ ⋅ ⋅&lt;/center&gt;
&lt;h3&gt;
  
  
  2.6 Set group of pictures (GOP)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; source.mov &lt;span class="nt"&gt;-g&lt;/span&gt; 300 output.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;GOP means distance between two keyframes.&lt;/p&gt;


&lt;center&gt;⋅ ⋅ ⋅&lt;/center&gt;
&lt;h3&gt;
  
  
  2.7 Copy source media’s metadata
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; source.mov &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-map_metadata&lt;/span&gt; 0 &lt;span class="nt"&gt;-movflags&lt;/span&gt; use_metadata_tags &lt;span class="se"&gt;\&lt;/span&gt;
output.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;As some videos store custom metadata, this command might not copy all the data correctly. &lt;/p&gt;

&lt;p&gt;If you want to check metadata, install &lt;a href="https://exiftool.org/"&gt;exiftool&lt;/a&gt; and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;exiftool &lt;span class="nt"&gt;-g1&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-gps&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt; output.mp4&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alternatively, you can copy metadata using exiftool as below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;exiftool &lt;span class="nt"&gt;-tagsFromFile&lt;/span&gt; source.mov &lt;span class="nt"&gt;-All&lt;/span&gt;:All output.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;center&gt;⋅ ⋅ ⋅&lt;/center&gt;

</description>
      <category>webdev</category>
      <category>gamedev</category>
      <category>linux</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
