Увеличиваем качество видео с помощью waifu2x на macos
Недавно я перевёл и озвучил старый боян
Но оригинальное видео (датируется 2007)[https://www.imdb.com/title/tt10943642/] годом, так что его качество оставляет желать лучшего. Я слышал, что нейронки умеют его улучшать.
Быстрый гуглёж по инструментам навёл меня на (waifu2x)[https://github.com/nagadomi/waifu2x], которая как раз позволяет улучшать качество картинок… картинок, а не видео.
Для видео я нашел, например, (video2x)[https://github.com/k4yt3x/video2x]. Или более быстрая реализация (как утверждают авторы) (dandere2x)[https://github.com/aka-katto/dandere2x]. Но не было бы этой статьи если бы у меня получилось их скомпилировать под мак и всё было бы так просто.
** Может оно и просто, но у меня не получилось быстро, а долго я не пытался **
Приступим
Это ручная реализация в лоб из того, что было. Главное, чтобы работало.
Нам потребуется 3 вещи: waifu2x, ffmpeg и bash
К счастью, на момент написания этой статьи (macOS Catalina 10.15.4), всё это было в brew:
brew install imxieyi/waifu2x/waifu2x ffmpeg
Но, для любителей, под macos у меня получилось собрать (c++ реализацию waifu2x)[https://github.com/tanakamura/waifu2x-converter-cpp] по (этому гайду)[https://www.reddit.com/r/waifu2x/comments/8whxl1/i_got_waifu2x_to_work_on_my_mac_heres_what_i_did/], но разницы с версией из brew лично я не ощутил (у cpp версии параметров больше)
Превращаем видео в картинки
mkdir frames
ffmpeg -i video.mp4 frames/frame-%d.png
Улучшаем качество каждой картинки
Для удобства я создал простеший bash скриптец
vim v2x.sh && chmod +x v2x.sh
Туда вписываем пути.
#!/bin/bash
BASEPATH=$(PWD)
INPATH=$BASEPATH/frames
OUTPATH=$BASEPATH/x2frames
mkdir $OUTPATH
for f in $INPATH/*.png; do
waifu2x -s 2 -n 0 -i $f -o $OUTPATH/$(basename -- $f) > /dev/null
done
Можно убрать
> /dev/null
, если хотите видеть вывод И в зависимости от версии waifu2x параметры меняются, на это тоже стоит обратить внимание
Запускаем и ждём… процесс не быстрый.
./v2x.sh
Потом можно поменять INPATH на x2frames, а OUTPATH на x4frames и прогнать ещё разок, чтобы улучшить качество ещё разок
Собираем обратно в видео
Для начала надо узнать fps оригинального видео. Для этого делаем ffmpeg -i video.mp4
и ищем там fps
И дальше выполняем очень большую, но простую команду:
ffmpeg -r 29.97 -pattern_type sequence -i x2frames/frame-%d.png -i video.mp4 -map 0:v:0 -map 1:a:0 -vcodec libx264 -pix_fmt yuv420p scaled.mp4
Где
- -r - fps
- -pattern_type sequence -i x2frames/frame-%d.png - способ поиска кадров для видео
- -i video.mp4 - исходное видео для изъятия звука
- -map 0:v:0 - из 0 (первого) инпута (наши кадры) берём v(видеодорожку) под номером 0(первую)
- -map 1:a:0 - значит из 1 (второго) инпута берём a(аудиодорожку) с индексом 0(первую)
- -vcodec libx264 -pix_fmt yuv420p - кодек и формат пикселей, как на исходном видео
- scaled.mp4 - название выходного файла
Результат
Для сравнения:
Оргинальные картинки
Вот и всё!
Решение в лоб, ручное, но оно работает. Можно всё это целиком обернуть в питоновский или баш скрипт, распараллелить, привлечь видеокарту… И многое-многое другое, но это всё многообразие и простор для творчества я оставляю вам!