Jellyfin Forum
Transcode issues with Intel N150 - Printable Version

+- Jellyfin Forum (https://forum.jellyfin.org)
+-- Forum: Support (https://forum.jellyfin.org/f-support)
+--- Forum: Troubleshooting (https://forum.jellyfin.org/f-troubleshooting)
+--- Thread: Transcode issues with Intel N150 (/t-transcode-issues-with-intel-n150)



Transcode issues with Intel N150 - CauliflowerBrain - 2026-02-11

Hey all,

I've been hosting a jellyfin server via docker on a GMTEK mini-pc which runs an Intel N150® CPU with onboard iGPU. Looking for some help/advice from more experienced people.

Recently I've had a few more people using the server and requesting more media via jellyseerr which requires transcoding so I've enabled hardware acceleration and currently it seems to be working with QSV for normal streams (with the CPU usage sitting at a couple %). I've verified the hw acceleration is working via jellyfin logs and also using intel_gpu_top on the mini-pc which shows gpu usage (attached). Logs below:

My issue is that when I run even just a single transcoded file (even on the same network), CPU usage skyrockets to using the max amount of available CPU threads (4 available) and then even one additional stream basically forces the mini-pc to crash/become unconnectable for a while.

Everything I've read about an N100/N150 with hw acceleration is that it should be able to support multiple transcodes and the overall cpu usage should be drastically layer over software transcoding. This just doesn't seem the case and I'm not sure why. I've attached my decode settings and can share whatever else would be useful.

Any help you can provide would be amazing


{"Protocol":0,"Id":"54b68646c65d76ac4abd78f698f4b4f1","Path":"/data/media/tv/Pantheon (2022)/Pantheon.S02E01.The.Gods.Have.Not.Died.in.Vain.1080p.AMZN.WEB-DL.DDP5.1.H.264-NTb.mkv","EncoderPath":null,"EncoderProtocol":null,"Type":0,"Container":"mkv","Size":3272748608,"Name":"Pantheon.S02E01.The.Gods.Have.Not.Died.in.Vain.1080p.AMZN.WEB-DL.DDP5.1.H.264-NTb","IsRemote":false,"ETag":"811251ce48ca6809c3796d2760ab6e31","RunTimeTicks":25222500000,"ReadAtNativeFramerate":false,"IgnoreDts":false,"IgnoreIndex":false,"GenPtsInput":false,"SupportsTranscoding":true,"SupportsDirectStream":true,"SupportsDirectPlay":true,"IsInfiniteStream":false,"UseMostCompatibleTranscodingProfile":false,"RequiresOpening":false,"OpenToken":null,"RequiresClosing":false,"LiveStreamId":null,"BufferMs":null,"RequiresLooping":false,"SupportsProbing":true,"VideoType":0,"IsoType":null,"Video3DFormat":null,"MediaStreams":[{"Codec":"h264","CodecTag":null,"Language":null,"ColorRange":null,"ColorSpace":"bt709","ColorTransfer":"bt709","ColorPrimaries":"bt709","DvVersionMajor":null,"DvVersionMinor":null,"DvProfile":null,"DvLevel":null,"RpuPresentFlag":null,"ElPresentFlag":null,"BlPresentFlag":null,"DvBlSignalCompatibilityId":null,"Rotation":null,"Comment":null,"TimeBase":"1/1000","CodecTimeBase":null,"Title":null,"Hdr10PlusPresentFlag":null,"VideoRange":1,"VideoRangeType":1,"VideoDoViTitle":null,"AudioSpatialFormat":0,"LocalizedUndefined":null,"LocalizedDefault":null,"LocalizedForced":null,"LocalizedExternal":null,"LocalizedHearingImpaired":null,"DisplayTitle":"1080p H264 SDR","NalLengthSize":"4","IsInterlaced":false,"IsAVC":true,"ChannelLayout":null,"BitRate":10380409,"BitDepth":8,"RefFrames":1,"PacketLength":null,"Channels":null,"SampleRate":null,"IsDefault":true,"IsForced":false,"IsHearingImpaired":false,"Height":1080,"Width":1920,"AverageFrameRate":24,"RealFrameRate":24,"ReferenceFrameRate":24,"Profile":"High","Type":1,"AspectRatio":"16:9","Index":0,"Score":null,"IsExternal":false,"DeliveryMethod":null,"DeliveryUrl":null,"IsExternalUrl":null,"IsTextSubtitleStream":false,"SupportsExternalStream":false,"Path":null,"PixelFormat":"yuv420p","Level":40,"IsAnamorphic":false},{"Codec":"eac3","CodecTag":null,"Language":"eng","ColorRange":null,"ColorSpace":null,"ColorTransfer":null,"ColorPrimaries":null,"DvVersionMajor":null,"DvVersionMinor":null,"DvProfile":null,"DvLevel":null,"RpuPresentFlag":null,"ElPresentFlag":null,"BlPresentFlag":null,"DvBlSignalCompatibilityId":null,"Rotation":null,"Comment":null,"TimeBase":"1/1000","CodecTimeBase":null,"Title":null,"Hdr10PlusPresentFlag":null,"VideoRange":0,"VideoRangeType":0,"VideoDoViTitle":null,"AudioSpatialFormat":0,"LocalizedUndefined":null,"LocalizedDefault":"Default","LocalizedForced":null,"LocalizedExternal":"External","LocalizedHearingImpaired":null,"DisplayTitle":"English - Dolby Digital\u002B - 5.1 - Default","NalLengthSize":null,"IsInterlaced":false,"IsAVC":false,"ChannelLayout":"5.1","BitRate":640000,"BitDepth":null,"RefFrames":null,"PacketLength":null,"Channels":6,"SampleRate":48000,"IsDefault":true,"IsForced":false,"IsHearingImpaired":false,"Height":null,"Width":null,"AverageFrameRate":null,"RealFrameRate":null,"ReferenceFrameRate":null,"Profile":null,"Type":0,"AspectRatio":null,"Index":1,"Score":null,"IsExternal":false,"DeliveryMethod":null,"DeliveryUrl":null,"IsExternalUrl":null,"IsTextSubtitleStream":false,"SupportsExternalStream":false,"Path":null,"PixelFormat":null,"Level":0,"IsAnamorphic":null},{"Codec":"subrip","CodecTag":null,"Language":"eng","ColorRange":null,"ColorSpace":null,"ColorTransfer":null,"ColorPrimaries":null,"DvVersionMajor":null,"DvVersionMinor":null,"DvProfile":null,"DvLevel":null,"RpuPresentFlag":null,"ElPresentFlag":null,"BlPresentFlag":null,"DvBlSignalCompatibilityId":null,"Rotation":null,"Comment":null,"TimeBase":"1/1000","CodecTimeBase":null,"Title":"Forced","Hdr10PlusPresentFlag":null,"VideoRange":0,"VideoRangeType":0,"VideoDoViTitle":null,"AudioSpatialFormat":0,"LocalizedUndefined":"Undefined","LocalizedDefault":"Default","LocalizedForced":"Forced","LocalizedExternal":"External","LocalizedHearingImpaired":"Hearing Impaired","DisplayTitle":"Forced - English - Default - SUBRIP","NalLengthSize":null,"IsInterlaced":false,"IsAVC":false,"ChannelLayout":null,"BitRate":null,"BitDepth":null,"RefFrames":null,"PacketLength":null,"Channels":null,"SampleRate":null,"IsDefault":true,"IsForced":true,"IsHearingImpaired":false,"Height":0,"Width":0,"AverageFrameRate":null,"RealFrameRate":null,"ReferenceFrameRate":null,"Profile":null,"Type":2,"AspectRatio":null,"Index":2,"Score":null,"IsExternal":false,"DeliveryMethod":null,"DeliveryUrl":null,"IsExternalUrl":null,"IsTextSubtitleStream":true,"SupportsExternalStream":true,"Path":null,"PixelFormat":null,"Level":0,"IsAnamorphic":null},{"Codec":"subrip","CodecTag":null,"Language":"eng","ColorRange":null,"ColorSpace":null,"ColorTransfer":null,"ColorPrimaries":null,"DvVersionMajor":null,"DvVersionMinor":null,"DvProfile":null,"DvLevel":null,"RpuPresentFlag":null,"ElPresentFlag":null,"BlPresentFlag":null,"DvBlSignalCompatibilityId":null,"Rotation":null,"Comment":null,"TimeBase":"1/1000","CodecTimeBase":null,"Title":null,"Hdr10PlusPresentFlag":null,"VideoRange":0,"VideoRangeType":0,"VideoDoViTitle":null,"AudioSpatialFormat":0,"LocalizedUndefined":"Undefined","LocalizedDefault":"Default","LocalizedForced":"Forced","LocalizedExternal":"External","LocalizedHearingImpaired":"Hearing Impaired","DisplayTitle":"English - SUBRIP","NalLengthSize":null,"IsInterlaced":false,"IsAVC":false,"ChannelLayout":null,"BitRate":null,"BitDepth":null,"RefFrames":null,"PacketLength":null,"Channels":null,"SampleRate":null,"IsDefault":false,"IsForced":false,"IsHearingImpaired":false,"Height":0,"Width":0,"AverageFrameRate":null,"RealFrameRate":null,"ReferenceFrameRate":null,"Profile":null,"Type":2,"AspectRatio":null,"Index":3,"Score":null,"IsExternal":false,"DeliveryMethod":null,"DeliveryUrl":null,"IsExternalUrl":null,"IsTextSubtitleStream":true,"SupportsExternalStream":true,"Path":null,"PixelFormat":null,"Level":0,"IsAnamorphic":null}],"MediaAttachments":[],"Formats":[],"Bitrate":11020409,"FallbackMaxStreamingBitrate":null,"Timestamp":null,"RequiredHttpHeaders":{},"TranscodingUrl":null,"TranscodingSubProtocol":0,"TranscodingContainer":null,"AnalyzeDurationMs":null,"DefaultAudioStreamIndex":null,"DefaultSubtitleStreamIndex":null,"HasSegments":true}

/usr/lib/jellyfin-ffmpeg/ffmpeg -analyzeduration 200M -probesize 1G -f matroska -init_hw_device vaapi=vaConfused-facedev/dri/renderD128,driver=iHD -init_hw_device qsv=qs@va -filter_hw_device qs -hwaccel qsv -hwaccel_output_format qsv -noautorotate -c:v h264_qsv -i file:"/data/media/tv/Pantheon (2022)/Pantheon.S02E01.The.Gods.Have.Not.Died.in.Vain.1080p.AMZN.WEB-DL.DDP5.1.H.264-NTb.mkv" -noautoscale -map_metadata -1 -map_chapters -1 -threads 3 -map 0:0 -map 0:1 -map -0:s -codec:v:0 h264_qsv -preset fast -mbbrc 1 -b:v 292000 -maxrate 292001 -rc_init_occupancy 584000 -bufsize 1168000 -profile:v:0 high -level 40 -g:v:0 72 -keyint_min:v:0 72 -vf "setparams=color_primaries=bt709:color_trc=bt709:colorspace=bt709,vpp_qsv=w=960:h=540:format=nv12" -codec:a:0 libfdk_aac -ab 128000 -af "pan=stereo|c0=c2+0.30*c0+0.30*c4|c1=c2+0.30*c1+0.30*c5" -copyts -avoid_negative_ts disabled -max_muxing_queue_size 2048 -f hls -max_delay 5000000 -hls_time 3 -hls_segment_type fmp4 -hls_fmp4_init_filename "987062323c7407b7496a83cb7db6426f-1.mp4" -start_number 0 -hls_segment_filename "/cache/transcodes/987062323c7407b7496a83cb7db6426f%d.mp4" -hls_playlist_type vod -hls_list_size 0 -hls_segment_options movflags=+frag_discont -y "/cache/transcodes/987062323c7407b7496a83cb7db6426f.m3u8"


ffmpeg version 7.1.3-Jellyfin Copyright © 2000-2025 the FFmpeg developers
  built with gcc 14 (Debian 14.2.0-19)
  configuration: --prefix=/usr/lib/jellyfin-ffmpeg --target-os=linux --extra-version=Jellyfin --disable-doc --disable-ffplay --disable-static --disable-libxcb --disable-sdl2 --disable-xlib --enable-lto=auto --enable-gpl --enable-version3 --enable-shared --enable-gmp --enable-gnutls --enable-chromaprint --enable-opencl --enable-libdrm --enable-libxml2 --enable-libass --enable-libfreetype --enable-libfribidi --enable-libfontconfig --enable-libharfbuzz --enable-libbluray --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libopenmpt --enable-libdav1d --enable-libsvtav1 --enable-libwebp --enable-libvpx --enable-libx264 --enable-libx265 --enable-libzvbi --enable-libzimg --enable-libfdk-aac --arch=amd64 --enable-libshaderc --enable-libplacebo --enable-vulkan --enable-vaapi --enable-amf --enable-libvpl --enable-ffnvcodec --enable-cuda --enable-cuda-llvm --enable-cuvid --enable-nvdec --enable-nvenc
  libavutil      59. 39.100 / 59. 39.100
  libavcodec    61. 19.101 / 61. 19.101
  libavformat    61.  7.100 / 61.  7.100
  libavdevice    61.  3.100 / 61.  3.100
  libavfilter    10.  4.100 / 10.  4.100
  libswscale      8.  3.100 /  8.  3.100
  libswresample  5.  3.100 /  5.  3.100
  libpostproc    58.  3.100 / 58.  3.100
libva info: VA-API version 1.22.0
libva info: Trying to open /usr/lib/jellyfin-ffmpeg/lib/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_22
libva info: va_openDriver() returns 0
libva info: VA-API version 1.22.0
libva info: Trying to open /usr/lib/jellyfin-ffmpeg/lib/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_22
libva info: va_openDriver() returns 0
Input #0, matroska,webm, from 'fileConfused-facedata/media/tv/Pantheon (2022)/Pantheon.S02E01.The.Gods.Have.Not.Died.in.Vain.1080p.AMZN.WEB-DL.DDP5.1.H.264-NTb.mkv':
  Metadata:
    encoder        : libebml v1.4.4 + libmatroska v1.7.1
  Duration: 00:42:02.25, start: 0.000000, bitrate: 10380 kb/s
  Stream #0:0: Video: h264 (High), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 24 fps, 24 tbr, 1k tbn (default)
      Metadata:
        BPS            : 9738236
        DURATION        : 00:42:02.250000000
        NUMBER_OF_FRAMES: 60534
        NUMBER_OF_BYTES : 3070283421
        _STATISTICS_WRITING_APP: mkvmerge v79.0 ('Funeral Pyres') 64-bit
        _STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
  Stream #0:1(eng): Audio: eac3, 48000 Hz, 5.1(side), fltp, 640 kb/s (default)
      Metadata:
        BPS            : 640000
        DURATION        : 00:42:02.240000000
        NUMBER_OF_FRAMES: 78820
        NUMBER_OF_BYTES : 201779200
        _STATISTICS_WRITING_APP: mkvmerge v79.0 ('Funeral Pyres') 64-bit
        _STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
  Stream #0:2(eng): Subtitle: subrip (srt) (default) (forced)
      Metadata:
        title          : Forced
        BPS            : 11
        DURATION        : 00:00:04.171000000
        NUMBER_OF_FRAMES: 1
        NUMBER_OF_BYTES : 6
        _STATISTICS_WRITING_APP: mkvmerge v79.0 ('Funeral Pyres') 64-bit
        _STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
  Stream #0:3(eng): Subtitle: subrip (srt)
      Metadata:
        BPS            : 71
        DURATION        : 00:40:58.915000000
        NUMBER_OF_FRAMES: 581
        NUMBER_OF_BYTES : 22118
        _STATISTICS_WRITING_APP: mkvmerge v79.0 ('Funeral Pyres') 64-bit
        _STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (h264_qsv) -> h264 (h264_qsv))
  Stream #0:1 -> #0:1 (eac3 (native) -> aac (libfdk_aac))
Press [q] to stop, [?] for help
[hls @ 0x77e22fac7580] Opening '/cache/transcodes/987062323c7407b7496a83cb7db6426f-1.mp4' for writing
Output #0, hls, to '/cache/transcodes/987062323c7407b7496a83cb7db6426f.m3u8':
  Metadata:
    encoder        : Lavf61.7.100
  Stream #0:0: Video: h264, qsv(tv, bt709, progressive), 960x540 [SAR 1:1 DAR 16:9], q=2-31, 292 kb/s, 24 fps, 12288 tbn (default)
      Metadata:
        encoder        : Lavc61.19.101 h264_qsv
      Side data:
        cpb: bitrate max/min/avg: 292001/0/292000 buffer size: 1168000 vbv_delay: N/A
  Stream #0:1: Audio: aac, 48000 Hz, stereo, s16, 128 kb/s (default)
      Metadata:
        encoder        : Lavc61.19.101 libfdk_aac
      Side data:
        cpb: bitrate max/min/avg: 128000/128000/128000 buffer size: 0 vbv_delay: N/A


RE: Transcode issues with Intel N150 - Rastin - 2026-02-13

Since no one responded and i myself have no idea i ran your question through an AI and this is what it came up with maybe it will help.



Short version: your video is hardware-accelerated, but your audio is not, and on a 4-thread CPU like the Intel N150 that alone can saturate the box — especially when multiple streams stack.

Let’s break it down.

✅ What’s Working

From your ffmpeg command:

-hwaccel qsv
-c:v h264_qsv
-vf vpp_qsv=...


And from the logs:

Video: h264, qsv(...)
encoder: h264_qsv


That confirms:

Decode → QSV

Scale (vpp_qsv) → QSV

Encode → QSV

So video is fully hardware accelerated. Good.

Your GPU showing activity in intel_gpu_top confirms this.

🚨 What’s Killing Your CPU

This line:

-codec:a:0 libfdk_aac


That is pure software AAC encoding.

Your source audio:

eac3 5.1 640kbps


Your output:

aac stereo 128kbps


And you’re also doing:

-af "pan=stereo|c0=...|c1=..."


So each stream is:

Decoding EAC3 in software

Mixing 5.1 → stereo in software

Encoding AAC in software

On a 4-thread N150, that alone can peg CPU cores.

💡 Why This Matches Your Symptoms

You said:

CPU usage skyrockets to max threads with just one stream

That makes sense because:

QSV handles video

CPU is doing:

Audio decode

Downmix

AAC encode

HLS muxing

Network handling

And when you add a second stream? You’ve doubled audio encoding load — and those small E-cores can’t keep up.

⚠️ Important: 292 kbps Video Bitrate

This also stands out:

-b:v 292000


That’s extremely low for 540p. That means Jellyfin is transcoding due to bitrate limits, likely for remote streaming.

If this is happening on your local network, something is forcing bitrate throttling.

Check:

Client quality setting

Remote bitrate limit

Reverse proxy limits

Whether Jellyfin thinks it’s remote

If local clients direct play, your CPU problem largely disappears.

🎯 The Most Likely Root Cause

It’s almost certainly:

Audio transcoding + downmixing eating your CPU

On small Intel CPUs, audio encoding is often the real bottleneck — not video.

🔧 Things You Should Try (In Order)
1️⃣ Disable Audio Transcoding Temporarily (Test)

In Jellyfin dashboard:

Playback → Transcoding

Set:

Allow audio transcoding → off

Test one stream.

If CPU drops massively → confirmed.

2️⃣ Allow Direct Play of EAC3

Most modern clients can direct play EAC3.

If users are using:

Android TV

Apple TV

Firestick

Web browsers with modern codecs

You likely don’t need audio transcoding.

Check why it’s being forced.

3️⃣ Remove 5.1 → Stereo Downmix (Huge CPU Saver)

That pan filter:

-af "pan=stereo|..."


Is expensive.

If clients can accept 5.1 AAC, don’t downmix.

4️⃣ Try Native AAC Instead of libfdk_aac

libfdk_aac is high quality but heavier.

Switching to native ffmpeg AAC reduces CPU load.

Jellyfin usually chooses automatically, but you can force:

Dashboard → Playback → Transcoding
Disable "Enable enhanced AAC encoder"

Test again.

5️⃣ Check Subtitle Burn-In

You have SRT subtitles.

If subtitles are being burned into video:

That forces full video software pipeline.

Even with QSV decode.

But in your log I see:

-map -0:s


So subtitles are NOT being burned. Good.

📊 What an N100/N150 Should Actually Handle

Realistic expectations:

With QSV working:

3–5 simultaneous 1080p → 1080p

4–6 simultaneous 1080p → 720p

Tons of direct play

But:

Multiple audio transcodes

Multiple downmix filters

HLS segmentation

Docker overhead

That changes things.

🐳 Important Docker Check

Make sure you’re running with:

--device /dev/driConfused-facedev/dri


And NOT limiting CPU cores via Docker.

Run:

docker inspect <container>


Check:

CPUQuota

CpusetCpus

If Docker only exposes 2 cores, that explains everything.

🧠 One More Subtle Thing

You’re using:

-threads 3


On a 4-thread CPU.

That means ffmpeg is grabbing almost all threads for one stream.

When a second stream starts:

Context switching explodes

System becomes unresponsive

You can limit threads per transcode in Jellyfin:

Dashboard → Playback → Transcoding → Max simultaneous video transcodes

Try setting it to 1 or 2.

🔥 What I Would Do If This Were My Box

On an N150:

Ensure local users direct play

Disable audio transcoding unless absolutely required

Disable enhanced AAC encoder

Set max transcodes to 2

Keep remote bitrate reasonable (4–6 Mbps minimum)

That alone would stabilize the system.

🚀 If You Want Deeper Debug

Run during a transcode:

htop


Check:

Which process is pegging CPU?

Is it ffmpeg?

Are all cores 100%?

Then run:

intel_gpu_top


If GPU usage is low but CPU high → audio bottleneck confirmed.

💬 A Couple Questions (Important)

Are the heavy streams local or remote?

What clients are people using?

Does CPU spike even if you disable downmix?

How much RAM does the mini-pc have?

Those answers will narrow this instantly.

You’re actually very close — your hardware acceleration is working.

This smells like audio transcoding + thread saturation, not broken QSV.

Reply with those answers and I’ll help you tune it properly.


RE: Transcode issues with Intel N150 - CauliflowerBrain - 2026-02-15

@Rastin, thanks for responding. Some good and some bad advice in there (as typical of AI) but I'm giving it a shot and seeing if there is anything that is going to work. I don't think it's making a massive difference so far but I'll keep trying.
If anyone else comes across this post and has any thoughts please feel free to send them over