Вопрос или проблема
Я не совсем уверен в терминологии, но у меня есть VR-видео, которое предназначено для отображения с использованием гарнитуры с отдельными экранами для каждого глаза. Это не 3D в том смысле, что, когда вы поворачиваете голову, вы видите что-то другое, это просто “2,5D”, чтобы у вас было чувство глубины, когда вы смотрите на это. Есть два видеоканала, которые более или менее идентичны, они просто записаны под немного разным углом, аналогично тому, как человеческие глаза видят мир. Надеюсь, это проясняет, какой тип видео у меня есть, иначе, пожалуйста, задайте уточняющий вопрос в комментарии (и если есть специальная терминология для этого типа видео, пожалуйста, дайте мне знать).
Больше деталей: оригинальное видео имеет разрешение 4320×2160, фактически это 2 квадратных канала по 2160 x 2160.
Я хочу показать это видео без искажений на обычном экране.
Я прочитал следующие вопросы здесь на SO:
-
https://stackoverflow.com/questions/75165610/how-to-reproject-and-join-these-two-clips-with-ffmpeg
-
https://stackoverflow.com/questions/61348681/flatten-360-fisheye-video
-
https://stackoverflow.com/questions/61348681/flatten-360-fisheye-video
-
https://stackoverflow.com/questions/66960003/unwarping-180-vr-footage-with-ffmpeg-v360-filter
(и, вероятно, еще несколько).
Я думаю, что хочу извлечь два видеоканала (обратите внимание, что они находятся в одном видеопотоке, а не как в фильме, где могут быть несколько отдельных звуковых дорожек для разных языков) в отдельные файлы, а затем “исправить” их.
(3) дал мне команду для разделения видео на два файла:
ffmpeg -i -myclip.mp4 -filter_complex "[0]crop=iw/2:ih:0:0[left];[0]crop=iw/2:ih:ow:0[right]" -map "[left]" -map 0:a /tmp/left.mp4 -map "[right]" -map 0:a /tmp/right.mp4
Это, похоже, сработало, как и ожидалось, но затем мне также нужно “исправить” содержимое, потому что оно было снято с помощью какого-то рыбий глаз или что-то вроде этого (прямые линии не в абсолютном центре изображения более или менее круглые).
(5) предложил эту команду:
ffmpeg -i left.mp4 -vf "v360=input=hequirect:output=flat:h_fov=100:v_fov=67.5:w=1280:h=720" leftfixed.mp4
но это дало выходное изображение размером 4320×2160 (очевидно, только из одного канала, поскольку вход был всего лишь одним каналом), но только центр оригинального изображения, я оцениваю содержимое как 500×250 пикселей (увеличенное до 4320×2160, так что очень мозаичное) от средней точки оригинального изображения.
Как я могу “исправить” это видео, чтобы оно выглядело хорошо на 2D-экране при сохранении размера?
Вы описываете ваше оригинальное видео как формат 2.5D (https://en.wikipedia.org/wiki/2.5D).
Вам нужно выбрать одно из изображений и вывести его в новый файл. Я согласен с вашим скриптом для разделения видео.
Вам нужно исправить искажения от рыбий глаз. Использование V360 – это один из подходов. Команда ‘hequirect’ не поддерживается ‘h_fov’ и ‘v_fov’. Команда ‘equisolid’ поддерживается ‘h_fov’ и ‘v_fov’.
Ответ или решение
Чтобы отобразить видеозапись VR на обычном экране без искажений и с сохранением качества, необходимо выполнить несколько шагов. Данная инструкция охватывает основные действия по разделению видео на два канала, коррекции искажений, а также выводе на экран в желаемом формате.
Понимание исходного контента
Ваше видео в формате 2,5D состоит из двух идентичных каналов, записанных с незначительным смещением,что создает эффект глубины. Размер видео — 4320×2160, то есть два канала по 2160×2160 пикселей. Исходно, вы планируете разделить видео на два отдельных файла, а затем "развернуть" для правильного отображения на двухмерном экране.
Шаг 1: Разделение видео на два канала
Чтобы извлечь два видеоканала, используйте следующую команду ffmpeg
:
ffmpeg -i myclip.mp4 -filter_complex "[0]crop=iw/2:ih:0:0[left];[0]crop=iw/2:ih:iw/2:0[right]" -map "[left]" -map 0:a left.mp4 -map "[right]" -map 0:a right.mp4
Шаг 2: Коррекция искажений
После того как вы получили два отдельных видеофайла, необходимо выполнить коррекцию искажения для каждого из них. Используйте фильтр v360
в ffmpeg
для преобразования каналов. Важно отметить, что для этого видео используйте режим equisolid
, так как hequirect
не поддерживает указанные параметры поля зрения.
Пример команды для коррекции искажений:
ffmpeg -i left.mp4 -vf "v360=input=equidistant:output=flat:h_fov=110:v_fov=67.5:w=2160:h=2160" left_fixed.mp4
Здесь:
input=equidistant
определяет тип входного видео.output=flat
указывает, что результат должен быть двухмерным.h_fov
иv_fov
задают горизонтальное и вертикальное поле зрения соответственно, изменяйте их в зависимости от вашего контента.w
иh
задают ширину и высоту результирующего видео.
Аналогично выполните команду для правого канала:
ffmpeg -i right.mp4 -vf "v360=input=equidistant:output=flat:h_fov=110:v_fov=67.5:w=2160:h=2160" right_fixed.mp4
Шаг 3: Проверка и окончательные корректировки
После выполнения вышеуказанных действий вы получите видеофайлы left_fixed.mp4
и right_fixed.mp4
, которые должны отображаться корректно на обычном экране. Рекомендуется просмотреть их и внести дополнительные настройки, если это необходимо — возможно, корректировать параметры h_fov
и v_fov
для достижения лучшего результата визуализации.
Заключение
Комплексный подход к обработке VR-видео, включая разделение и коррекцию искажений, позволит вам создать привлекательный видеоконтент, пригодный для отображения на обычных экранах. Если у вас остались вопросы по выполнению вышеуказанных шагов, не стесняйтесь задавать их для более детальной информации.