A collection of tricks to become more productive with FFmpeg.
Trim Track
If I am too lazy to open Audacity to trim songs I downloaded from YouTube:
ffmpeg -i "track.mp3" -ss 00:00:00 -t 00:00:08 -c:a libopus -b:a 96k "output.ogg"
The time is in hh:mm:ss format. With -ss and -t, specify the start time and duration. By replacing -t with -to, user can specify start time and end time.
Pipe From PV
pv is a terminal-based tool to monitor progress of data being sent through a pipe. It is a great tool to visualize an encoding progress. A minimal working example is shown below:
pv input.ext | ffmpeg -i pipe:0 -c:v hevc -c:a libopus output.ext
Making FFmpeg Less Verbose
I frequently encode videos into HEVC format. It gets noisy, especially when running from bash script to perform encoding over a bulk of files. To suppress verbosity for both ffmpeg and hevc, here is the minimal working example:
ffmpeg -i input.ext -v warning -c:v hevc -x265-params log-level=warning output.ext
The -v flag tells ffmpeg to reduce its verbosity to show all warnings and errors. FFmpeg has other loglevels too such as quiet and info.
The -x265-params is for sending user-defined parameters to the x265 encoder itself, which in this case telling the encoder to be less verbose with log-level=warning.
How Long Did It Take
To know the duration of an encoding, excute /usr/bin/time (do not confuse with time shell builtin).
/usr/bin/time --format='took %e seconds' \
    ffmpeg -i input.ext -c:v hevc output.ext
The command above will output took n seconds after the encoding is done. Definitely useful, but to make it more useful for data collection purposes, let’s write the output into a file.
/usr/bin/time --format='took %e seconds' -a -o output.time.txt
-a flag tells it to append, -o is to specify the output.