Перейти к главному содержимому

ffmpeg tips

FFMPEG tips

выдрать звук и сохранить в mp3 с высшим качеством

ffmpeg -i inputfile -q:a 0 outputfile.mp3

Масштабирование

Без сохранения aspect ratio

ffmpeg -i complex.mov -crf 20 -vf scale=640:360 complex-small.mp4

С сохранением aspect ratio

ffmpeg -i input.jpg -vf scale=320:-1 output_320.png

Some codecs require the size of width and height to be кратны n. Для этого в качестве высоты надо установить -n.

ffmpeg -i input.jpg -vf scale=320:-2 output_320.png

Подробней про хитрое масштабирование.

concat files

ffmpeg -f concat -i mylist.txt -c copy complex.mov

mylist.txt:

file filename1
#comment
file filename2
....

speedup without sound

ffmpeg -i o1-20.mp4 -an -filter:v "setpts=0.25*PTS" o-fast.mp4

ffmpeg -i complex-small.mp4  -movflags +faststart -pix_fmt yuv420p -crf 20 -an -filter:v "setpts=0.2*PTS" complex-fast.mp4

speedup with sound

ffmpeg -i complex-small.mp4  -movflags +faststart -pix_fmt yuv420p -crf 20  -filter_complex "[0:v]setpts=0.125*PTS[v];[0:a]atempo=2.0,atempo=2.0,atempo=2.0[a]" -map "[v]" -map "[a]" compex-fast-big.mp4

crop

Use the crop filter:

ffmpeg -i in.mp4 -filter:v "crop=out_w:out_h:x:y" out.mp4

To crop a 80x60 section, starting from position (200, 100):

ffmpeg -i in.mp4 -filter:v "crop=80:60:200:100" -c:a copy out.mp4

The audio is stream copied in this example, so re-encoding is avoided.

To crop the bottom right quarter:

ffmpeg -i in.mp4 -filter:v "crop=in_w/2:in_h/2:in_w/2:in_h/2" -c:a copy out.mp4

This is the same as:

ffmpeg -i in.mp4 -filter:v "crop=320/2:240/2:320/2:240/2" -c:a copy out.mp4

Which is the same as:

ffmpeg -i in.mp4 -filter:v "crop=240:120:240:120" -c:a copy out.mp4

You can refer to the input image size with in_w and in_h as shown in this first example. The output width and height can also be used with out_w and out_h.

Crop 20 pixels from the top, and 20 from the bottom:

ffmpeg -i in.mp4 -filter:v "crop=in_w:in_h-40" -c:a copy out.mp4

The filter will automatically center the crop if x and y are omitted such as in this example.

Preview:

ffplay -i input -vf "crop=in_w:in_h-40"

Яркость/контраст/гамма/насыщенность

ffmpeg -i in.mp4 -vf eq=gamma=0.5:saturation=0.3 -crf 5 -y out.mp4

crop и сохранение в animated gif

ffmpeg -i in.mp4 -filter:v "crop=300:800:200:-400" -pix_fmt rgb24 -r 10 -y tower1.gif

Сохранение в webm для стикеров telegram

Надо constant quality, не constrained, поэтому -b:v 0.

ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 0 output.webm

Ещё вариант с масштабом жестким без сохранения aspect ratio:

ffmpeg -i input_file.mp4 -framerate 30 -c:v libvpx-vp9 -an -vf scale=512:512 -pix_fmt yuva420p output_sticker.webm

cut

ffmpeg -i input.wmv -ss 00:00:30.0 -c copy -t 00:00:10.0 output.wmv
ffmpeg -i input.wmv -ss 30 -c copy -t 10 output.wmv

ffmpeg -i input.mp4 -ss 30 -to 40 output.mp4

You can also put -ss before -i !!!

The -t option doesn't work for short videos, but it does for longer videos. For short videos it seems that -frames:v is better. This is what worked for me.

ffmpeg -ss 4 -i input.mp4 -frames:v 200 -vcodec copy -acodec copy output.mp4

For me -t option didn't work, but -vframes worked. I prefer using #frames, since I would rather cut at I-Frames and I found out GOP for video using ffprobe.

The command line that worked for me is:

ffmpeg -ss 60s -i input.wmv -vframes 1800 -acodec copy -vcodec copy output.wmv

By the way, putting -ss in the front of -i makes a big difference in execution time.

Inaccurate seek:

ffmpeg -noaccurate_seek -ss 120 -i input.mp4 -y -vcodec copy -acodec copy -to 8 -avoid_negative_ts make_zero output.mp4

For browser

ffmpeg -i input_file -q:v 4 -q:a 7 -movflags +faststart -pix_fmt yuv420p -acodec libvorbis -vcodec libtheora output.ogv

After that create html file:

<html><body>

<h2>TITLE</h2>

<video width="1024" height="576" controls="controls">
<source src="output.ogv" type='video/ogg; codecs="theora, vorbis"'>
  Тег video не поддерживается вашим браузером.
</video>
<br><br>
</body></html>

Генерация сигналов

ffmpeg -f lavfi -i "sine=frequency=1000:sample_rate=48000:duration=5" -af "volume=-6dB" -c:a pcm_s16le test.wav