summaryrefslogtreecommitdiff
path: root/doc/note/ffmpeg/ffmpeg.txt
blob: 7cfc8681d1f31149b1e88b88e42dbd8e58d69963 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109

ffmpeg
================

## Extract Audio From webm

Lookup format of audio stream with:

  ffmpeg -i in.webm

Then use that knowlege to extract that (audio) stream:

  ffmpeg -i in.webm -vn -acodec copy out.FORMAT_FROM_BEFORE



## Convert Formats

  ffmpeg -i in.opus out.wav


## Fine-tune audio codec

[See also](https://slhck.info/video/2017/02/24/vbr-settings.html)

Use  -codec:v copy  to keep video, or -codec:v no  for audio-only.

  -codec:a aac        -q:a 1.3   (min=0.1, good=1.3 max=2)
  -codec:a aac        -b:a 96k
  -codec:a libmp3lame -q:a 2
  -codec:a libopus
  -filter:a lowpass=f=16000


## Fix Loudness war, bring bass back

  -af "equalizer=f=200:w=200:t=h:g=-9,equalizer=f=400:w=600:t=h:g=-9,equalizer=f=2000:w=2000:t=h:g=-12,equalizer=f=4000:w=4000:t=h:g=-12,equalizer=f=10000:w=10000:t=h:g=-12,volume=+0.0dB"


## Audio trim

HINT: Repeat afade twice for log.

  -af "afade=t=in:d=500ms,afade=t=out:st=183427ms:d=500ms" \


## Record Desktop

  ffmpeg -f gdigrab -framerate 6 -probesize 10M -offset_x 0 -offset_y 0 \
      -video_size 1920x1200 -show_region 1 -i desktop -c:v h264_qsv \
      -pix_fmt yuv420p "output-$(date +%Y%m%d-%H%M%S).mp4"


## Trim video

  -i INFILE -ss <pos> -t <dur> OUTFILE
  -i INFILE -ss <pos> -to <pos> OUTFILE


## Concatenate

  && ffmpeg -i one.mkv -i two.mkv \
       -filter_complex '[0:v] [0:a] [1:v] [1:a] concat=n=2:v=1:a=1 [v] [a]' \
       -map "[v]" -map "[a]" out.mkv \


## Rotate Portrait

  -i INFILE -vf "transpose=2" OUTFILE



## Video to Gif

HINT: Use same filter for palette as for conversion.

  FILTERV=fps=6,scale=-1:600
  FILTERV=fps=6,scale=-1:480
  INPUTV=input.mp4

Create custom palette:
  -i "${INPUTV:?}" -vf "${FILTERV:?},palettegen=stats_mode=diff" palette.png

Use this palette:
  -i "$INPUTV" -i palette.png -filter_complex "[0:v]${FILTERV:?}[vid];[vid][1:v]paletteuse=dither=bayer:bayer_scale=5:diff_mode=rectangle" dst.gif

Working example from web (but not optimized):
  ffmpeg -ss 0 -t 2.5 -i INPUT.mp4 -filter_complex "[0:v] fps=12,scale=-1:600,split [a][b];[a] palettegen=stats_mode=diff [p];[b][p] paletteuse=new=1" OUTPUT.gif


## Pictures to Video (eg Timelapse)

  -start_number 5619 -framerate 24 -i "input/IMG_%d.JPG" \
    -vf "scale=4096:-1,crop=4096:2160:0:0" \
    out.mkv


## Create GIF by image series

  && TMPVID="tmp.mkv" \
  && PALETTE_PNG="palette.png" \
  && FPS="5" \
  && FILTERV="fps=${FPS:?}" \
  && ffmpeg -start_number 0 -framerate "${FPS:?}" -i "src%d.png" "${TMPVID:?}" \
  && ffmpeg -i "${TMPVID:?}" -vf "${FILTERV:?},palettegen=stats_mode=diff" "${PALETTE_PNG:?}" \
  && ffmpeg -i "${TMPVID:?}" -i "${PALETTE_PNG:?}" -filter_complex "[0:v]${FILTERV:?}[vid];[vid][1:v]paletteuse=dither=bayer:bayer_scale=5:diff_mode=rectangle" dst.gif \
  && rm "${TMPVID:?}" "${PALETTE_PNG:?}" \