October 2017

HEVC видео с поддержкой Quick Time macOS 10.13 и iOS 11

HEVC видео с поддержкой формата файлов QuickTime для macOS 10.13 и iOS 11



В сентябре 2017 года компания Apple официально представила новые операционные системы для персональных компьютеров macOS 10.13 и мобильных устройств iOS 11 с поддержкой инновационного формата кодирования видео - HEVC (High Efficiency Video Coding). Данный формат кодирования видеоизображения позволяет значительно повысить его качество и обеспечивает лучшее сжатие. Однако, хотя все устройства, основанные на представленных OS, поддерживают формат HEVC, создавать или перекодировать уже существующие файлы не так просто, как x264 файлы. Стандартных системных ресурсов (QuickTime) для этого не достаточно. На конец сентября 2017 года в официальном магазине Apple Store программ для перекодированная не много и они пока работают не достаточно стабильно. Поиски в Интернете возможных решений, обратили внимание на хорошо известные программы HandBrake и ffmpeg. Рассмотрим особенности использования бесплатных программ декодеров.

Handbrake



Великолепная мультиплатформенная программа с огромным количеством функций перекодированная видео. HandBrake поддерживает стандарт HEVC (H265) сжатия видео. Для данных целей в ней даже реализованы стандартные предустановки (Preset: H265 MKV).
Главной особенностью использования HandBrake (версии 1.0.7) для перекодированная является поддержка только контейнеров .mkv или .mp4. Поддержки .mov формата (стандартного для Apple устройств) пока нету. Просмотреть видео стандартными средствами QucikTime (macOS) или Видео (iOS) пока не получится. Однако, HandBrake обеспечивает наглядный и достаточной удобный интерфейс для преобразования медиатеки в новый формат HEVC.
Настроек у программы много HandBrake, поэтому уточним назначение ключевых характеристик. В документации к программе рекомендуется использовать предустановленные настройки H265 MKV. Последуем рекомендации. Устанавливаем preset - H265 MKV 1080p30:
  • Параметр "Format". Возможные установки "MKV File" и "MP4 File". Так как полноценной поддержки .mp4 контейнера Apple пока нету, рекомендуется устанавливать формат "MKV File"
  • Вкладка "Video":
    • "Framerate (FPS)" (частота кадров). По умолчанию установлено значение "30" и включен параметр "Peek Framerate". Значение по умолчанию соответствует требования большинства видеофайлов, но при перекодировании различных видеофайлов можно выставить значение "Same as source" и "Variable Framerate" (частота перекодированная совпадает с частотой исходного файла)
    • "Quality": "Constant Quality" предустановленное значение RF 22 (Constant Rate Factor, CRF или Постоянное значение оценки). Чем меньше это число, тем выше качество видео и тем больше размер конечного файла. Для перекодированная из формата x264 рекомендуемое значение 22-23. В некоторых документациях для перекодированная высококачественного входного видеопотока рекомендуется значение до 28. Однако, данный показатель либо нужно оставить по умолчанию, либо определиться с личным восприятием (с учетом качества и размера выходного файла)
    • "Encoding Options": по умолчанию "slow". Часто используемые значения "fast", "medium", "slow". Как и в случае с предыдущим параметром определяется экспериментальным путем по критерия "качество-скорость кодирования". Для меня оптимальным значением является "medium".
  • Вкладка "Picture":
    • Основной параметр - разрешение выходного видеофайла. Для выбранной предустановки максимальным разрешением является "1920x1080". В документации предлагается изменить параметр "Anamorphic" на значение "Loose". То есть изображение будет либо уменьшено до "1920x1080", либо останется исходным (если исходный файл меньшего разрешения)
  • Вкладка "Audio". В данной вкладке обращаем внимание на количество аудиодорожек. По умолчания HandBrake выбирает первую дорожку или дорожку соотвествующую выбранному приоритетному языку. Если в исходном видеофайле несколько видеодорожек, очень часто по умолчанию выбирается ошибочная дорожка. Обращаем внимание на выбор аудиодорожки.
  • Вкладка "Subtitles" - настройка субтитров. Так же как и при выборе аудиодорожки, на выбор субтитров надо обращать внимание, так как по умолчанию очень часто выбирается не верный параметр.

Остальные параметры можно оставлять без изменения и запускать кодированнае.
HandBrake поддерживает кодирование сразу нескольких файлов - обращаем внимание на кнопки "Add To Queue" (Добавить в очередь).

ffmpeg



ffmpeg - это великолепный мультиплатформенный и мультиформатный конвертор. Конвертирует все или почти все. Главный недостаток или преимущество (кому как) - это отсутствие в базовой версии графического интерфейса.
ffmpeg позволяет создавать видеофайлы формата HEVC для Apple контейнера .MOV (так называемый формат hvc1).

Рассмотрим стандартные параметры для создания файла формата HEVC на базе существующего видеофайла. В документации к ffmpeg рекомендуется следующая команда для создания HEVC файла:

ffmpeg -i input -c:v libx265 -preset medium -crf 28 -c:a aac -b:a 128k output.mp4

Данной командной на базе входного видеофайла "input" создается выходной файл "output.mp4" на основе алгоритма кодирования видео "libx265", с заданной установкой скорости обработки "medium" (аналогично "Encoding Options" в HandBrake) и параметра качества CRF 28. При этом аудио кодируется в формат ACC с битрейтом 128k.
В этой же документации можно почитать и об особенностях двухпроходного кодирования.
Представленная команда создает полноценный HEVC видео файл, однако с низким качеством картинки (CRF 28) и главное - данный файл не совместим со стандартными средствами Apple QuickTime, iTunes, Просмотр и т.п.

Рассмотрим ключевые параметры для перекодированная видео в формат HEVC совместимый с Apple QuickTime на примере следующей команды:

ffmpeg -i input -c:v libx265 -preset medium -crf 23 -c:s copy -f mov -pix_fmt yuv420p -tag:v hvc1 output.mov

Ключевые параметры:
-tag:v hvc1 - основной параметр, который обеспечивает совместимость со стандартом HEVC для Apple приложений (если не указать данный параметр, то файл output.mov будет соответствовать стандарту hev1).
-f mov - не обязательный, но очень рекомендуемый параметр. Принудительно указывает на формат контейнера выходного файла. Текущая версия ffmpeg не позволяет создавать .mp4 файл стандарта hvc1.
-pix_fmt yuv420p - совместимая цветовая схема. Данный параметр так же не является обязательным, если исходный файл совместим со стандартной для Apple приложений цветовой схемой (например .mp4 или .mov файлов x264). Практически всегда обязателен для контейнера видеофайлов .avi.
-c:s copy - параметр, указывающий на необходимость копировать данные субтитров из исходного файла без изменений.

Представленная команда не указывает, что необходимо сделать с аудиодорожкой (например, параметр
-v:s copy копирует первую аудиодорожку исходного файла без изменений). То есть, в данном случае аудиодорожка перекодируя в стандартный для формата HEVC вид.

Основные недостатки указанной команды, которые можно решить в индивидуальном порядке (см.
инструкцию и форум ffmpeg):
  • не поддерживается перенос метаданных (параметр -map_metadata)
  • не поддерживается перекодирование нескольких аудиодорожек (параметры -map 0:0 -map 0:a? и т.п.)

Например, для перекодирования видеофайла с несколькими аудиодорожками можна использвать следующую комманду:

ffmpeg -i input.mkv -c:v libx265 -f mov -pix_fmt yuv420p -tag:v hvc1 -crf 23 -preset
slow -map 0:0 -map 0:a? output.mov

Команда для копирования уже созданного HEVC файла без перекодированная (например, из уже созданного HandBrake "H265 MKV" файла):

ffmpeg -i input.mkv -vcodec copy -acodec copy -c:s copy -tag:v hvc1 -f mov output.mov


Пакетная обработка всех файлов в указанной папке программой ffmpeg



ffmpeg замечательная программа, но возникают сложности при обработке значительного числа видеофайлов. На помощь приходят инструменты пакетной обработки.
Пример простейшего bash-фала для пакетной обработки видео приведен ниже.

bash.sh



#!/bin/bash

INPUTPATH="."
EXTENSION="avi"
OUTPUTPATH="."
STOPFLAG="$OUTPUTPATH/ffenc.txt"
FFREPORT="$OUTPUTPATH/ffenc.log"

echo -------------------------------------------------------
echo INPUTPATH = "${INPUTPATH}"
echo EXTENSION = "${EXTENSION}"
echo OUTPUTPATH = "${OUTPUTPATH}"
echo FNAME = "${FNAME}"
echo EXTENSION = "${EXTENSION}"
echo NAME = "${NAME}"
echo OUTFILE = "${OUTFILE}"
echo -------------------------------------------------------

for a in "${INPUTPATH}"/*."${EXTENSION}"; do
# MOVINFULL="${a[@]/%${EXTENSION}/mov}"
MOVINFULL="${a%.*}-hvc1.mov"
MOVNAME="$(basename "${MOVINFULL}")"
MOVOUTFULL="${OUTPUTPATH}"/"${MOVNAME}"
echo "${a}" "==>" "${MOVOUTFULL}"
done
echo -------------------------------------------------------
read -p "Press any key to continue. Ctrl-C to break... " -n1 -s
echo
for a in "${INPUTPATH}"/*."${EXTENSION}"; do
if [ -e "${STOPFLAG}" ]; then
break
fi
# MOVINFULL="${a[@]/%${EXTENSION}/mov}"
MOVINFULL="${a%.*}-hvc1.mov"
MOVNAME="$(basename "${MOVINFULL}")"
MOVOUTFULL="${OUTPUTPATH}"/"${MOVNAME}"

if [ ! -e "${MOVOUTFULL}" ]; then
# echo "$MOVOUTFULL"
ffmpeg -i "$a" -c:v libx265 -preset medium -crf 23 -c:s copy -f mov -pix_fmt yuv420p -tag:v hvc1 "$MOVOUTFULL"
if [ $? -eq 0 ]; then
date >> "$FFREPORT"
echo "$MOVOUTFULL converted OK" >> "$FFREPORT"
echo >> "$FFREPORT"
else
date >> "$FFREPORT"
echo "$MOVOUTFULL converted with ERROR" >> "$FFREPORT"
echo >> "$FFREPORT"
fi
else
date >> "$FFREPORT"
echo "$MOVOUTFULL already exists" >> "$FFREPORT"
echo >> "$FFREPORT"
fi
done


Что делает данный bash-файл:
  • в папке INPUTPATH ищутся все файлы с расширением EXTENSION (в данном примере .avi)
  • создается шаблон для переименования выходного файла в вид: OUTPUTPATH/<Имя исходного файла>-hvc1.mov
  • после подтверждения пользователем, начинается процесс пакетного преобразования всех найденных файлов в формат HEVC (файлы пропускаются, если в папке OUTPUTPATH уже есть одноименный выходной HEVC файл).
  • после успешного создания каждого нового видеофайла вносится соответствующая строчка в log-файл (FFREPORT="$OUTPUTPATH/ffenc.log")
  • при необходимость, процесс пакетного преобразования можно "корректно" остановить путем создания в папке OUTPUTPATH флаг-файла (STOPFLAG="$OUTPUTPATH/ffenc.txt"). В таком случае после завершения перекодированная очередного файла, bash процесс останавливается.

Пользователям Windows bat-файл для перекодирования всех файлов в текущем каталоге формата .avi в HEVC (hvc1) формат .MOV можно использовать следующую команду:

for %%a in ("*.avi") do c:\ffmpeg\bin\ffmpeg.exe -i "%%a" -c:v libx265 -preset medium -crf 23 -f mov -pix_fmt yuv420p -tag:v hvc1 "%%~na.mov"

Рекомендации и предложения по дальнейшему развитию представленного подхода прошу направлять в почту или оставлять в комментариях.
Надеюсь данное руководство поможет не только мне.