Как получить четкое и точное соответствие цветов для скринкаста без потерь?

Задний план

Запись скринкаста (без звука) в Xubuntu Linux. На следующем изображении показано параллельное сравнение видео (слева) и рабочего стола (справа):

Кодирование без потерь

Скрин-каст записывается с использованием:

ffmpeg -r 30 -f x11grab -s $WIN_GEO -i :0.0+$WIN_XY -vcodec huffyuv -preset ultrafast -qp 0 output.mkv

Здесь $WIN_GEOхранятся размеры браузера (1030x794) и $WIN_XYместоположение браузера (1020x221).

$ cat /etc/issue
Ubuntu Trusty Tahr (development branch) \n \l

Проблема

Цвета в видео отличаются от цветов, показанных на рабочем столе, что приводит к слегка размытому воспроизведению. Я читал, что это может быть связано с преобразованием между цветами RGB и YUV.

Вопрос

Как записать видео на рабочем столе (скрин-каст), которое при воспроизведении (например, с помощью mplayer, VLC или ffplay) дает точное соответствие цветам и четкости исходного рабочего стола?

Связанный

Соответствующие страницы:

Каков окончательный контекст, который потребует такого точного воспроизведения? Если вы планируете использовать видео в Интернете, в какой-то момент его нужно будет перекодировать и сжать, что приведет к гораздо большему изменению и потере четкости. Вы, скорее всего, правы насчет сдвига цветового пространства, но я не могу найти никаких подробностей о том, как убедиться, что ffmpeg использует huffyuv в режиме RGB (который он поддерживает).
huffyuv в rgb по умолчанию должен быть без потерь, здесь FFV1 без потерь? Если нет, то ввод какой-то плохой...

Ответы (1)

Захват видеокадров в формате XWD с последующим преобразованием в PNG дает результаты, почти идеальные для пикселя при кодировании с помощью ffmpeg.

Установите xvidcap :

mkdir -p $HOME/dev
cd $HOME/dev
svn checkout svn://svn.code.sf.net/p/xvidcap/code/trunk xvidcap-code
cd xvidcap*
./autogen.sh
LIBS="-ldl -lX11 -lXext" ./configure --prefix=/usr/local
make && sudo make install

Делайте снимки со скоростью 25 кадров в секунду:

mkdir -p $HOME/video
cd $HOME/video
xvidcap --fps 25 --quality 100 --cap_geometry 1024x768+768+288 --file out%05d.xwd

Это создает серию файлов захвата X Windows внутри $HOME/video. Преобразуйте файлы в формат PNG с помощью ImageMagick , а затем объедините их в видео:

for i in out*.xwd; do convert -define png:color-type=2 $i $(basename $i .xwd).png; done
ffmpeg -i out%05d.png -c:v huffyuv -preset veryslow -qp 0 -qscale:v 0 output.avi

Пример скрипта:

echo "Click window to capture..."

INFO=$(xwininfo -frame)
WIN_GEO=$(echo $INFO | grep -oEe 'geometry [0-9]+x[0-9]+' | grep -oEe '[0-9]+x[0-9]+')
WIN_XY=$(echo $INFO | grep -oEe 'Corners:\s+\+[0-9]+\+[0-9]+' | grep -oEe '[0-9]+\+[0-9]+' | sed -e 's/\+/,/' )

OUTPUT_DIR=$HOME/video

echo Capturing to $OUTPUT_DIR...
rm -rf $OUTPUT_DIR
mkdir -p $OUTPUT_DIR
cd $OUTPUT_DIR

WIN_XY=$(echo $WIN_XY | tr , +)

xvidcap --fps 25 --quality 100 --cap_geometry $WIN_GEO+$WIN_XY --file out%05d.xwd

# Convert captured images to PNG format
echo "Converting XWD to PNG..."
for i in out*.xwd; do convert -define png:color-type=2 $i $(basename $i .xwd).png; done

ffmpeg -i out%05d.png -c:v huffyuv -preset veryslow -qp 0 -qscale:v 0 output.avi

Это создает высококачественное видео, которое выглядит четким с VLC , может быть отредактировано в OpenShot и загружено на различные видеохостинги. Воспроизведение с помощью MPlayer дает слегка нечеткие и бесцветные результаты.