2021-01-11 17:34:38 +00:00
|
|
|
---
|
|
|
|
title: Lossless screen recording
|
|
|
|
subtitle: Never waste resources with OBS again
|
2021-11-10 08:07:08 +00:00
|
|
|
author: Amolith
|
2021-01-11 17:34:38 +00:00
|
|
|
description: Recording your screen (or monitors) with ffmpeg for a high-quality lossless video that uses very few system resources
|
|
|
|
date: 2018-08-12T17:15:20-04:00
|
|
|
|
cover: /assets/pngs/ffmpeg-lossless.png
|
|
|
|
categories:
|
|
|
|
- Technology
|
|
|
|
tags:
|
|
|
|
- FFmpeg
|
|
|
|
- CLI
|
|
|
|
- Minimalism
|
|
|
|
---
|
|
|
|
|
2021-06-26 20:51:30 +00:00
|
|
|
I've been trying off and on for the past few weeks to figure out how to
|
|
|
|
record my 1920x1080 monitor. The recording is going to be some music
|
|
|
|
videos for a friend. Originally, it was just going to be a single
|
|
|
|
background image for the whole video then I had the idea of using
|
|
|
|
[cava](https://github.com/karlstav/cava) in a transparent terminal on
|
|
|
|
top of the background. This didn't work at all because it actually kept
|
|
|
|
freezing when I tried to record it. So I tried switching to
|
|
|
|
[ncmpcpp's visualiser.](http://ncmpcpp.rybczak.net/) This still had
|
|
|
|
horrible lag so I've been puzzling over how to use ffmpeg to
|
|
|
|
*losslessly* record my second monitor. The reason OBS and similar screen
|
|
|
|
recorders are so slow is because, most of the time, they encode to the
|
|
|
|
end format while recording and that uses a lot of system resources. I
|
|
|
|
finally figured it out and have pasted the command below.
|
|
|
|
|
|
|
|
``` bash
|
2021-01-11 17:34:38 +00:00
|
|
|
ffmpeg -video_size 1920x1080 -framerate 30 -f x11grab -draw_mouse 0 -i :0.0+1366,0 -c:v libx264 -crf 0 -preset ultrafast output.mkv
|
|
|
|
```
|
|
|
|
|
2021-06-26 20:51:30 +00:00
|
|
|
Above is exactly what I used for my 1080p monitor with 768p laptop
|
|
|
|
screen. I've modified the command so you can see what you need to edit
|
|
|
|
for your use-case.
|
2021-01-11 17:34:38 +00:00
|
|
|
|
2021-06-26 20:51:30 +00:00
|
|
|
``` bash
|
2021-01-11 17:34:38 +00:00
|
|
|
ffmpeg -video_size <target-resolution> -framerate 30 -f x11grab -i :0.0+<width-of-unused-monitor>,0 -c:v libx264 -crf 0 -preset ultrafast <filename>.mkv
|
|
|
|
```
|
|
|
|
|
2021-06-26 20:51:30 +00:00
|
|
|
If you do *not* want the cursor recorded, add `-draw_mouse 0` directly
|
|
|
|
after `x11grab` like I did in the first command.
|
2021-01-11 17:34:38 +00:00
|
|
|
|
2021-06-26 20:51:30 +00:00
|
|
|
My video was 470mb for a ~13 minute video. If you're going to archive
|
|
|
|
the recording or are concerned about file size, re-encode it with a
|
|
|
|
slower preset. This will be a lot slower and take a lot of CPU but the
|
|
|
|
resulting file is *significantly* smaller than the original and still
|
|
|
|
lossless. I this as a general purpose screen recorder. Previously, I was
|
|
|
|
using OBS and the lag in the video was incredible but with ffmpeg, it's
|
|
|
|
smooth as butter. The command for re-encoding is below:
|
2021-01-11 17:34:38 +00:00
|
|
|
|
2021-06-26 20:51:30 +00:00
|
|
|
``` bash
|
2021-01-11 17:34:38 +00:00
|
|
|
ffmpeg -i output.mkv -c:v libx264 -crf 0 -preset veryslow output-smaller.mkv
|
|
|
|
```
|
|
|
|
|
|
|
|
![](/assets/gifs/ffmpeg-lossless.gif)
|
|
|
|
|
2021-03-22 06:55:30 +00:00
|
|
|
## Note
|
2021-06-26 20:51:30 +00:00
|
|
|
This command only works with X, not Wayland. Skimming `ffmpeg`'s man
|
|
|
|
page, I see that `video4linux2` is another option for capturing video so
|
|
|
|
you may be able to replace `x11grab` with it for the same result. I have
|
|
|
|
not tested this so I don't know if it'll work or not.
|