aboutsummaryrefslogtreecommitdiff
path: root/_posts/2023-11-04-using-ffmpeg-to-combine-video-side-by-side.md
blob: c47a72653de7edcca251c0f52f4a5abf017269e6 (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
---
title: "Using ffmpeg to combine videos side by side"
permalink: /using-ffmpeg-to-combine-video-side-by-side.html
date: 2023-11-04T09:04:28+02:00
layout: post
type: note
draft: false
---

I had a 4 webm videos (each 492x451) that I wanted to combine to be played side
by side and I tried [iMovie](https://support.apple.com/imovie) and
[Kdenlive](https://kdenlive.org/) and failed to do it in an easy way. I needed
this for Github readme file so it also needed to be a GIF.

The following is the [ffmpeg](https://ffmpeg.org/) version of it.

```sh
ffmpeg -y \
  -i 01.webm \
  -i 02.webm \
  -i 03.webm \
  -i 04.webm \
  -filter_complex "\
  	[0:v] trim=duration=8, setpts=PTS-STARTPTS, scale=492x451, fps=6 [a0]; \
  	[1:v] trim=duration=8, setpts=PTS-STARTPTS, scale=492x451, fps=6 [a1]; \
  	[2:v] trim=duration=8, setpts=PTS-STARTPTS, scale=492x451, fps=6 [a2]; \
  	[3:v] trim=duration=8, setpts=PTS-STARTPTS, scale=492x451, fps=6 [a3]; \
  	[a0][a1][a2][a3] xstack=inputs=4:layout=0_0|w0_0|w0+w1_0|w0+w1+w2_0, scale=1000:-1 [v]" \
  -map "[v]" \
  -crf 23 \
  -preset veryfast \
  trigraphs.gif
```

- This will produce `trigraphs.gif` that is also scaled to max 1000px in width
  (refer to `scale=1000:-1`).
- The important part for 4x1 stack is `xstack=inputs=4:layout=0_0|w0_0|w0+w1_0|w0+w1+w2_0`.
- This will also cap frame rate to 6 (refer to `fps=6`) since that is enough and
  this makes playback of GIFs smoother in a browser.

![Result](./assets/notes/trigraphs.gif){:loading="lazy"}