Skip to content

Set up OBS Studio to record a video on an AMD laptop

Christophe TREMBLAY-GUILLOUX
Christophe TREMBLAY-GUILLOUXLinux systems engineer

The OBS Studio defaults are built for live streaming, not for recording a file that goes into an editor. A capped bitrate, the wrong container and a microphone level that is too low all go unnoticed on screen, then cost you at the editing and publishing stage.

This note gives the values to enter to record a narrated video, with your face inset over slides, on an AMD Ryzen laptop running Linux. Every setting is backed by a measurement taken on the resulting file.

ItemValue
ProcessorAMD Ryzen 7 PRO 8840HS, 16 threads
GraphicsRadeon 780M, VAAPI name Phoenix3
SystemUbuntu 24.04
Audio serverPipeWire 1.0.5 with the pipewire-pulse layer
OBS Studio32.2.0

In Settings then Output, set Output Mode to Advanced and open the Recording tab.

FieldValue
TypeStandard
Recording FormatHybrid MP4 (.mp4)
Video EncoderFFmpeg VAAPI H.264
Audio EncoderFFmpeg AAC
Audio Track1
Rescale Outputdisabled

The hybrid format writes the file in fragments while recording, then finalises it into a standard MP4 when you stop. You get an ordinary file that any editor can read, while staying protected if OBS is interrupted mid take.

Fragmented MP4, on the other hand, stays fragmented for good. It is a delivery format, the basis of DASH and HLS. Browsers read it; video editors handle it far less consistently.

Tick a second audio track only if you record several sound sources and want to rebalance them separately in the edit. With a single microphone, both tracks would be identical.

Expected result: the Recording Format field reads Hybrid MP4 (.mp4).

Further down the same tab, under Encoder Settings:

FieldValue
VAAPI DevicePhoenix3
ProfileHigh
LevelAuto
Rate ControlCQP
QP18
Keyframe Interval1 s
Maximum B-frames2

CQP targets a constant quality and spends bits where the scene needs them. CBR, offered by default, is a live streaming setting: it caps the bitrate to fit inside a bandwidth you do not have to worry about here.

A QP of 18 produces around 2,200 kb/s on slides with little motion, against 1,500 kb/s at QP 22. The file doubles in size, which does not matter for an intermediate handed to an editor, and you avoid stacking losses ahead of the platform's own re-encode.

A keyframe interval of 1 second places a reference frame every 30 frames at 30 frames per second. Your cuts in the edit land more precisely.

Expected result: the Rate Control field reads CQP and the QP field reads 18.

In Settings then Video:

FieldValue
Base (Canvas) Resolution1920x1080
Output (Scaled) Resolution1920x1080
Common FPS Values30

Both resolutions must be identical. Any difference introduces a pointless rescale that softens the text on your slides.

In Settings then Audio, section Global Audio Devices:

FieldValue
Desktop AudioDisabled
Desktop Audio 2Disabled
Mic/Auxiliary Audioyour microphone

Section General:

FieldValue
Sample Rate48 kHz
ChannelsMono

A headset or USB microphone produces a mono signal. Recorded in stereo, it is simply duplicated across two identical channels, which doubles the weight of the track and adds nothing.

Leave desktop audio disabled as long as you are not filming a demonstration with sound. When active, it picks up system notifications and whatever a browser tab decides to play. The day you need it, add an Audio Output Capture (PulseAudio) source in the one scene concerned, rather than turning it back on globally.

Gain is taken as early in the chain as possible, where it costs the least noise.

Open pavucontrol, Input Devices tab, and set your microphone to 100%. On the command line:

sh
pactl get-source-volume @DEFAULT_SOURCE@
pactl set-source-volume @DEFAULT_SOURCE@ 100%

Never go past 100%. Beyond that it is no longer hardware gain but digital amplification, which lifts the hiss along with the voice.

The source volume slider in the OBS mixer stays at 0.0 dB. That slider is there to balance one source against the others, not to make up for an input level. Using it as gain leaves you unable to tell which stage does what the day you have to troubleshoot.

Then speak normally and read the mixer's level meter. The OBS scale is green up to -20 dBFS, yellow from -20 to -9, red above -9. Clipping only happens at 0 dBFS, when the bar hits the far right end. Your target is -6 dBFS: it sits in the red, and that is expected.

Expected result: the bar enters the red without ever reaching the far right end.

Right click the microphone source in the mixer, then Filters. Order matters, each filter receives the output of the previous one.

OrderFilterSettings
1Noise Gatedisabled
2Noise SuppressionRNNoise
3Gainto calibrate, see below
4Upward CompressorRatio 0.5:1, Threshold -16 dB, Attack 10 ms, Release 50 ms, Output Gain 0 dB, Knee Width 10
5LimiterThreshold -3 dB, Release 60 ms

To set the Gain, temporarily disable the compressor and the limiter, set the gain to 0 dB, speak normally and note the peak reached. The value to enter is then -6 minus the observed peak: a peak at -19 dBFS calls for +13 dB, a peak at -12 dBFS calls for +6 dB.

The upward compressor lifts quiet passages towards the threshold. It is a tool for consistency, not for level: if it has to manufacture 7 dB because the gain is missing, it flattens the dynamics of your voice. Set the gain first, the compression second.

The Noise Gate stays disabled. On a decent microphone RNNoise is enough, and a badly set gate cuts the ends of your sentences.

Expected result: speaking normally, the level meter lives between -12 and -6 dBFS.

Record ten seconds speaking normally, then measure the file.

Frame types, to confirm that B-frames are active and that the keyframe interval really is one second:

sh
ffprobe -v error -select_streams v -show_entries frame=pict_type \
-of csv=p=0 recording.mp4 | sort | uniq -c

The output must contain a B line. Without it, the setting was not honoured.

Container structure, to confirm that the hybrid format did finalise the file:

sh
ffprobe -v error -show_entries format=format_name -of csv=p=0 recording.mp4
mediainfo recording.mp4 | grep "Writing application"

The writing application must read OBS Studio, not Lavf, which would point to the FFmpeg muxer used by the fragmented format.

Sound level:

sh
ffmpeg -hide_banner -nostats -i recording.mp4 \
-af ebur128=peak=true -f null - 2>&1 | tail -20

On a correctly calibrated take, the true peak sits between -3 and -1 dBFS and the integrated loudness between -20 and -16 LUFS.

Looking for clipping:

sh
ffmpeg -hide_banner -i recording.mp4 \
-af "astats=measure_perchannel=none" -f null - 2>&1 | grep -E "Flat factor|Peak level"

A flat factor of 0 means no run of samples was clipped.

Expected result: a B line in the frame types, OBS Studio as the writing application, and a flat factor of 0.

The file OBS produces is a master headed for your video editor, not a publishing file. It is never sent to a platform as is.

Two settings from the earlier steps exist for that reason. The one second keyframe interval gives an entry point every 30 frames, which makes scrubbing the timeline smoother and cuts more precise. The QP of 18 leaves headroom: the edit re-encodes, and a master that is already degraded cannot be recovered.

Nor should you try to reach -14 LUFS in OBS. That is the normalisation target of the delivery platforms, and it applies to the final file, not to the raw material. OBS only has to deliver a healthy, unclipped signal with a little headroom below 0 dBFS so the edit has room to work.

Your video editor exports a file ready to publish. That is the one you normalise, and the only one.

The operation does not touch the picture. By copying the video stream as is, you re-encode audio only and avoid a generation of loss on the video:

sh
ffmpeg -i edit.mp4 -af loudnorm=I=-14:TP=-1:LRA=11:print_format=summary -f null -

This first command measures and writes nothing. Carry the four reported values into the second one:

sh
ffmpeg -i edit.mp4 -c:v copy \
-af loudnorm=I=-14:TP=-1:LRA=11:measured_I=…:measured_TP=…:measured_LRA=…:measured_thresh=… \
-c:a aac -b:a 192k -movflags +faststart publication.mp4

The -c:v copy is the point that matters: the video is copied byte for byte, with no re-encoding.

A single pass works too, without the measured_ parameters, but handles level variations across the video poorly.

Expected result: the integrated loudness measured on publication.mp4 is close to -14 LUFS and the true peak does not exceed -1 dBFS.

The input gain moves on its own. The WebRTC processing in browsers, used by every video call in Chrome or Firefox, includes an automatic gain control that writes straight into the device volume. A call in the morning can leave you with a microphone at 40% in the afternoon. Read pactl get-source-volume @DEFAULT_SOURCE@ again before every recording.

The mouse pointer is captured by default. A screen capture source faithfully reproduces what you see, arrow included. It then stays visible for the whole video, and moves at the slightest touch of the trackpad. Untick Show Cursor in the source properties.

A webcam captured through its window locks you into its size. If you film the window of an application displaying the camera rather than the camera itself, OBS only receives the pixels shown on screen. The image stays sharp as long as the inset keeps that size, but you will never be able to enlarge it or change framing without loss. A Video Capture Device (V4L2) source receives the camera's native stream. If 1080p is only offered there in MJPEG, choose MJPEG: the YUYV format often caps at a few frames per second for lack of USB bandwidth.

The software encoder remains a fallback. On this machine, x264 at the veryfast preset encodes around seven times faster than real time on slides with little motion, with better compression efficiency than the hardware encoder. It is only worth it if you want more compact masters, and it consumes a processor you will probably rather leave free while recording.