Как сгладить видео VR для отображения на обычном экране?

Я не уверен в терминологии, но у меня есть VR-видео, которое предназначено для показа с помощью гарнитуры с отдельными экранами для каждого глаза. Это не 3D в том смысле, что, повернув голову, вы увидите что-то другое, это просто «2,5D», поэтому при взгляде на него возникает ощущение глубины. Есть два видеоканала, которые более-менее идентичны, просто они записаны под немного разным углом, подобно тому, как видят мир человеческие глаза. Надеюсь, это прояснило, какой тип видео у меня есть, в противном случае, пожалуйста, попросите разъяснений в комментарии (и если для этого типа видео существует специальная терминология, дайте мне знать).

Подробнее: исходное видео имеет разрешение 4320x2160, в основном 2 квадратных канала с разрешением 2160x2160.

Я хочу показать это видео неискаженным на обычном экране.

Я прочитал следующие вопросы здесь, на SO:

  1. https://stackoverflow.com/questions/75165610/how-to-reproject-and-join-these-two-clips-with-ffmpeg

  2. https://stackoverflow.com/questions/62238714/how-to-de-warp-180-grade-or-360-grade-fisheye-video-with-ffmpeg

  3. https://stackoverflow.com/questions/61348681/flatten-360-fisheye-videohttps://stackoverflow.com/questions/61348681/flatten-360-fisheye-video

  4. 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

но это привело к выходу размером 4320x2160 (очевидно, только из одного канала, поскольку вход был только одним каналом), но только в центре исходного изображения, я оцениваю содержимое как 500x250 пикселей (увеличенное до 4320x2160, поэтому очень блочное) середина исходного изображения.

Как мне «неискажать» это видео, чтобы оно хорошо выглядело на 2D-экране, сохраняя при этом размер?

1 ответ

Вы описываете исходное видео как формат 2.5D (https://en.wikipedia.org/wiki/2.5D).

Вам необходимо выбрать одно из изображений и вывести его в новую копию. Я согласен с вашим сценарием разделения видео.

Вам необходимо исправить искажение «рыбий глаз». Использование V360 – это один из подходов. Команда «hequirect» не поддерживается «h_fov» и «v_fov». Команда «equisolid» поддерживается «h_fov» и «v_fov».

Ссылка https://ffmpeg.org/ffmpeg-filters.html#toc-v360.

Другие вопросы по тегам