![]() |
|
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=va dev/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 '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':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/dri dev/driAnd 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 |