После замены SSD на старом Dell Latitude E7470 я поставил свежую Kubuntu 26.04 и начал заново собирать рабочую систему. Xray поднялся, OpenCode завёлся, Thunderbird после небольшого танца с профилями тоже ожил. Оставалось проверить привычные сайты, в том числе страницу с онлайн-камерой на bolotnaya.online.
И вот тут Яндекс Браузер решил напомнить, что Linux без маленького квеста не считается установленным. Сайт открылся, плеер появился, HLS-поток вроде начал буферизоваться, но вместо видео браузер показал сообщение: «Отсутствует видеокодек. Для воспроизведения видео данного формата установите библиотеки».
На первый взгляд всё странно. Система свежая, браузер свежий, ffmpeg установлен. Но потоковое видео не играет. Разбираемся, где именно закопался кодек и почему обычной установки системного ffmpeg оказалось мало.
Симптом: сайт открывается, но HLS-видео не воспроизводится
Проблема выглядела так: страница с камерой открывается нормально, плеер отображается, но вместо живой картинки висит предупреждение Яндекс Браузера об отсутствующем видеокодеке.
Для начала я запустил Яндекс Браузер из терминала. Это хороший способ быстро понять, что происходит под капотом. В выводе сразу появилась важная подсказка:
/usr/lib64/ffmpeg-plugin-browser/libffmpeg.so: Ffmpeg not found. /opt/yandex/browser/libffmpeg.so: Ffmpeg not found. find_ffmpeg failed, using the integrated library.
Вот это уже не абстрактное «видео не работает», а конкретная проблема. Яндекс Браузер не нашёл подходящую библиотеку libffmpeg.so, которая нужна ему для нормальной работы с мультимедийными форматами.
Почему установленного ffmpeg оказалось мало
В Linux легко попасть в ловушку. Ставишь системный ffmpeg, видишь, что пакет установлен, и думаешь, что теперь все браузеры обязаны проигрывать всё на свете. Но Chromium-подобные браузеры часто живут по своим правилам.
Им может понадобиться отдельная сборка libffmpeg.so, которую браузер ищет в своих путях. То есть системный ffmpeg может быть установлен, но конкретный браузер всё равно не найдёт нужную библиотеку или не сможет использовать её из-за несовместимости.
Проверяем системные пакеты:
apt policy ffmpeg libavcodec-extra kubuntu-restricted-extras
На моей системе ffmpeg и libavcodec-extra уже были доступны из репозитория Ubuntu 26.04:
ffmpeg: Установлен: 7:8.0.1-3ubuntu2 libavcodec-extra: Установлен: 7:8.0.1-3ubuntu2
Но это не решило проблему автоматически. Браузер продолжал искать собственный libffmpeg.so в двух местах:
/usr/lib64/ffmpeg-plugin-browser/libffmpeg.so /opt/yandex/browser/libffmpeg.so
Если этих файлов нет или они неподходящей версии, HLS-видео может не стартовать. В моём случае именно это и произошло.
Что такое HLS и почему тут важны кодеки
HLS это потоковая передача видео небольшими фрагментами. Браузер получает плейлист, потом по нему загружает куски видео и собирает воспроизведение на лету. Такая схема часто используется для онлайн-камер, трансляций и адаптивного видео.
Но сам HLS это только способ доставки. Внутри потока всё равно лежит видео в конкретном кодеке, часто H.264. Если браузер не умеет декодировать этот формат, плеер может быть на месте, плейлист может открываться, а картинки всё равно не будет.
Поэтому проблема может быть не в сайте, не в HLS.js и не в самом потоке камеры. Иногда всё упирается в то, что браузер не нашёл нужную ffmpeg-библиотеку. Маленький файл, большое настроение.
Подключаем universe и multiverse
Первым делом стоит убедиться, что в системе подключены компоненты репозиториев universe и multiverse. Без них часть мультимедийных пакетов может быть недоступна.
sudo add-apt-repository universe sudo add-apt-repository multiverse sudo apt update
После этого ставим системные мультимедийные пакеты:
sudo apt install -y ffmpeg libavcodec-extra
При желании можно добавить набор restricted extras для Kubuntu:
sudo apt install -y kubuntu-restricted-extras
Если установщик спросит про лицензию Microsoft fonts, нужно принять её через Tab и Enter. Да, хотел просто камеру посмотреть, а оказался на переговорах со шрифтами. Добро пожаловать в Linux.
Проверяем служебные скрипты Яндекс Браузера
У Яндекс Браузера есть несколько полезных служебных скриптов в каталоге /opt/yandex/browser. Они как раз помогают работать с ffmpeg-кодеками.
ls -lah /opt/yandex/browser/update-ffmpeg ls -lah /opt/yandex/browser/update_codecs ls -lah /opt/yandex/browser/find_ffmpeg
Проверить, видит ли браузер ffmpeg-библиотеку, можно так:
/opt/yandex/browser/find_ffmpeg
В моём случае вывод был плохой:
/usr/lib64/ffmpeg-plugin-browser/libffmpeg.so: Ffmpeg not found. /opt/yandex/browser/libffmpeg.so: Ffmpeg not found. find_ffmpeg failed, using the integrated library.
Значит браузер не видит подходящий libffmpeg.so и пытается пользоваться встроенной библиотекой. Для моего HLS-потока этого оказалось недостаточно.
Почему update-ffmpeg не помог
Логичный следующий шаг: запустить штатный скрипт обновления ffmpeg-кодеков.
sudo /opt/yandex/browser/update-ffmpeg
Но он завершился ошибкой:
FFMPEG codecs installation failed: there are no download urls for the current browser version: 146.0.7680
То есть скрипт Яндекса не нашёл адреса для загрузки кодеков под текущую версию Chromium, на которой собран браузер. Проблема была не в сети. Даже запуск через локальный SOCKS-прокси ничего не менял.
Для контекста, версия браузера была такая:
yandex-browser-stable --version
Yandex 26.4.1.1101 stable
На этом месте можно было бы начать ругаться на браузер, но ругань кодеки не ставит. Поэтому пошёл дальше.
Главная тонкость: update_codecs нужно запускать на каталог
Дальше я попробовал второй скрипт: update_codecs. И тут есть важный нюанс. Его нужно запускать с путём к каталогу, а не с путём к будущему файлу libffmpeg.so.
Неправильный вариант:
sudo /opt/yandex/browser/update_codecs \ /usr/lib64/ffmpeg-plugin-browser/libffmpeg.so
Такой запуск дал ошибку:
Target path for codecs does not exist.
Правильная схема такая:
sudo mkdir -p /usr/lib64/ffmpeg-plugin-browser sudo /opt/yandex/browser/update_codecs \ /usr/lib64/ffmpeg-plugin-browser
Если нужен доступ через локальный прокси, например через Xray на 127.0.0.1:1080, можно запустить так:
sudo env \ ALL_PROXY=socks5h://127.0.0.1:1080 \ HTTPS_PROXY=socks5h://127.0.0.1:1080 \ HTTP_PROXY=socks5h://127.0.0.1:1080 \ /opt/yandex/browser/update_codecs /usr/lib64/ffmpeg-plugin-browser
После этого снова проверяем, появился ли файл и видит ли его браузер:
find /usr/lib64/ffmpeg-plugin-browser -maxdepth 2 -type f -ls /opt/yandex/browser/find_ffmpeg
Потом полностью перезапускаем браузер. Просто закрыть окно иногда недостаточно, потому что процесс может остаться висеть в фоне.
pkill -f yandex 2>/dev/null || true yandex-browser-stable &
Что я пробовал, но не советую как основной путь
В процессе я также попробовал вручную взять libffmpeg.so из сборки nwjs-ffmpeg-prebuilt. Архив скачался, файл распаковался, я положил его туда, где Яндекс Браузер ищет библиотеку.
sudo install -m 0644 /tmp/nwffmpeg/libffmpeg.so \ /usr/lib64/ffmpeg-plugin-browser/libffmpeg.so sudo install -m 0644 /tmp/nwffmpeg/libffmpeg.so \ /opt/yandex/browser/libffmpeg.so
Но этот вариант не подошёл. Проверка показала ошибку:
dlsym fail : /usr/lib64/ffmpeg-plugin-browser/libffmpeg.so: undefined symbol: avcodec_version /usr/lib64/ffmpeg-plugin-browser/libffmpeg.so: Found ffmpeg of unknown version.
То есть файл был на месте, но браузер не смог нормально использовать эту библиотеку. Поэтому я откатил её и вернулся к штатному update_codecs.
sudo mv /usr/lib64/ffmpeg-plugin-browser/libffmpeg.so \ /usr/lib64/ffmpeg-plugin-browser/libffmpeg.so.bad-nwjs 2>/dev/null || true sudo mv /opt/yandex/browser/libffmpeg.so \ /opt/yandex/browser/libffmpeg.so.bad-nwjs 2>/dev/null || true
Вывод простой: вручную подсовывать libffmpeg.so можно только если вы точно понимаете, какая сборка подходит к вашей версии Chromium. Иначе браузер может увидеть файл, но не сможет его использовать. Получится как запчасть от другой машины: похожа, блестит, но мотор не заводится.
Отдельная проблема: VAAPI и старый Intel
В логах Яндекс Браузера также были ошибки аппаратного видеодекодирования:
vaapi_video_decoder.cc: failed Initialize()ing the frame pool Failed to create video pipeline.
Это уже другая часть истории. На старых Intel-видеочипах Chromium-браузеры иногда ломаются на аппаратном декодировании. Если кодек уже установлен, но видео всё равно не запускается, можно проверить запуск с отключённым ускоренным видеодекодированием:
pkill -f yandex 2>/dev/null || true yandex-browser-stable \ --disable-accelerated-video-decode \ --disable-features=VaapiVideoDecoder,VaapiVideoDecodeLinuxGL &
Если с такой командой видео заработало, значит кодеки уже на месте, а мешает именно аппаратное декодирование. В таком случае можно отключить аппаратное ускорение в настройках браузера или сделать отдельный ярлык для запуска камер.
Как понять, что проблема именно в кодеках
Перед тем как чинить всё подряд, полезно отделить проблему сайта от проблемы браузера. В моём случае признаки были такие:
- страница с камерой открывалась нормально;
- плеер загружался;
- ошибка была именно про отсутствующий видеокодек;
- в терминале браузер писал, что не нашёл
libffmpeg.so; - системный
ffmpegбыл установлен, но браузер всё равно не видел нужную библиотеку; - после обновления браузерных кодеков HLS-поток заработал.
Если HLS-видео не работает только в одном браузере, а в другом открывается нормально, это тоже хороший намёк. Значит сайт и поток, скорее всего, живые, а проблема в конкретном браузере или его кодеках.
Результат: HLS-поток заработал
После установки кодеков и правильного обновления браузерной ffmpeg-библиотеки HLS-поток на сайте заработал. Камера снова показала картинку, а плеер получил нормальный статус подключения.
Короткая памятка команд
Если нужно быстро повторить рабочую схему на Kubuntu или Ubuntu 26.04, команды такие:
sudo add-apt-repository universe sudo add-apt-repository multiverse sudo apt update sudo apt install -y ffmpeg libavcodec-extra kubuntu-restricted-extras pkill -f yandex 2>/dev/null || true sudo mkdir -p /usr/lib64/ffmpeg-plugin-browser sudo /opt/yandex/browser/update_codecs \ /usr/lib64/ffmpeg-plugin-browser /opt/yandex/browser/find_ffmpeg yandex-browser-stable &
Если обновление кодеков нужно выполнить через локальный SOCKS-прокси:
sudo env \ ALL_PROXY=socks5h://127.0.0.1:1080 \ HTTPS_PROXY=socks5h://127.0.0.1:1080 \ HTTP_PROXY=socks5h://127.0.0.1:1080 \ /opt/yandex/browser/update_codecs /usr/lib64/ffmpeg-plugin-browser
Где обычно ломается
По итогам этой возни можно выделить несколько типичных мест, где всё идёт не туда:
- не подключены
universeиmultiverse; - не установлен
libavcodec-extra; - Яндекс Браузер не видит
libffmpeg.so; update-ffmpegне находит URL для текущей версии браузера;update_codecsзапускают на файл, а не на каталог;- вручную подсовывают неподходящую сборку
libffmpeg.so; - мешает аппаратное декодирование VAAPI на старом Intel.
То есть проблема может быть не одна. Но начинать лучше с простого: системные пакеты, find_ffmpeg, потом update_codecs, потом уже VAAPI и ручные эксперименты.
Вывод
Проблема была не в сайте, не в HLS.js и не в самом потоке камеры. Яндекс Браузер в свежей Kubuntu 26.04 просто не видел подходящий libffmpeg.so, хотя системный ffmpeg уже был установлен.
Главная мысль: для Chromium-подобных браузеров в Linux иногда мало поставить системные мультимедийные пакеты. Нужно ещё проверить, видит ли сам браузер свою ffmpeg-библиотеку. В случае Яндекс Браузера это удобно делать через /opt/yandex/browser/find_ffmpeg, а исправлять через /opt/yandex/browser/update_codecs.
После этого потоковое HLS-видео снова заработало. А старый Dell с новым SSD получил ещё одну маленькую победу над реальностью. В Linux такие победы надо ценить. Они иногда достаются дороже, чем сам SSD.