Но в интернете я не нашёл ответа. Наконец, дошли руки проделать такой эксперимент.
Ширина нового видео в таком случае равняется количеству кадров исходного, а количество кадров нового видео — ширине исходного. Я прикинул, что лучше ограничиться небольшим форматом видео (640х360) и отрезком в 640 кадров, чтобы итоговое видео получилось не утомительным по времени и достаточным, для наблюдения эффекта. Экспортировал кадры из VirtualDub в png, набросал программку для Node.js (что первое под руку попалось), обработал, собрал новые кадры обратно в видео. И вот, что получилось.
Исходное видео:
Вид сбоку:
Результат оказался интереснее, чем я ожидал. Я думал меньше распознаваемых деталей будет. Просмотрел несколько раз, чтобы разглядеть каждую сцену, потом решил взглянуть «сверху».
Вид сверху:
Вид сверху получился квадратным, более коротким (360 кадров) и менее забавным. Учитывая полученный опыт, я попытался подобрать сцену, которая смотрелась бы интереснее — с плавно перемещающимися относительно камеры персонажами в полный рост или лицо крупным планом.
Исходное видео:
Вид сбоку:
var FRAME_WIDTH = 640;
var FRAME_HEIGHT = 360;
var FRAMES_COUNT = 640;
var fs = require('fs');
var PNG = require('node-png').PNG;
function makeFileName(i, prefix) {
prefix = prefix || "src2/";
return prefix + ("000" + i).substr(-4) + ".png";
}
function addStripe(dstFrame, dstFrameIdx, srcFrameIdx, callback) {
fs.createReadStream(makeFileName(srcFrameIdx)).pipe(new PNG({filterType: 4})).on("parsed", function () {
for (var p = 0; p < FRAME_HEIGHT; p++) {
var srcIdx = (FRAME_WIDTH * p + (FRAME_WIDTH - dstFrameIdx - 1)) << 2;
var dstIdx = (FRAMES_COUNT * p + srcFrameIdx) << 2;
dstFrame.data[dstIdx] = this.data[srcIdx];
dstFrame.data[dstIdx + 1] = this.data[srcIdx + 1];
dstFrame.data[dstIdx + 2] = this.data[srcIdx + 2];
dstFrame.data[dstIdx + 3] = this.data[srcIdx + 3];
}
if (++srcFrameIdx < FRAMES_COUNT) {
addStripe(dstFrame, dstFrameIdx, srcFrameIdx, callback);
} else {
dstFrame.pack().pipe(fs.createWriteStream(makeFileName(dstFrameIdx, "dst2/"))).on("finish", callback);
}
});
}
function createFrame(dstFrameIdx) {
addStripe(new PNG({ width: FRAMES_COUNT, height: FRAME_HEIGHT }), dstFrameIdx, 0, function () {
console.log("done " + dstFrameIdx);
if (++dstFrameIdx < FRAME_WIDTH) {
createFrame(dstFrameIdx);
}
});
}
createFrame(+process.argv[2]);
Не старался и не думал об оптимизации, хотел скорее получить хоть какой-то результат. После обработки первых кадров понял, что ждать не много (минут 10-15), если запустить сразу несколько процессов, и успокоился.
YouTube вроде попортил качество видео немного, поэтому прилагаю оригинальные файлы на всякий случай. Кстати, видео «с другого направления» сжимаются хуже при тех же настройках кодека.
Если кто-то уже делал нечто подобное или встречал, или есть другие идеи по необычному представлению видео или звука, делитесь в комментариях. Спасибо за внимание :)
Комментарии (78)
NeoCode
24.07.2016 09:57А с чем связаны явно выраженные ветрикальные полосы?
madixi
24.07.2016 10:00+3Очевидно, монтажные склейки.
NeoCode
24.07.2016 10:21Точно! Я как-то не подумал о них) Было бы интересно посмотреть в таком виде видео без монтажных склеек… только удастся ли найти такое видео? Разве что самостоятельно снять.
Smi1e
24.07.2016 12:49Можно «делать срез» предварительно разбив видео на сцены. При этом видео будет варьироваться по ширине в зависимости от длительности каждой сцены.
valera5505
24.07.2016 14:09+5Бёрдмэн
Grief
24.07.2016 18:35В Бёрдмэне десятки склеек, но они действительно хорошо замаскированы. Есть фильм, снятый совсем без склеек, одним дублем. Это фильм 2015 года Виктория. К сожалению, сам фильм, как по мне, средненький.
Stalker_RED
24.07.2016 14:30+3Фрагмент из кф «Самый лучший день»
Авторы утверждают, что снято без склеекTheIseAse
24.07.2016 15:07Насчитал четыре :) Но все равно хорошая работа
Stan_1
24.07.2016 21:50Я одну — вылет камеры из автобуса, и тут же показ целого автобуса с того бока, откуда камера вылетела. А не подскажите еще? Видел и раньше этот момент — никогда не понимал, как сделано. :) Хотя круто, конечно.
AndreyNagih
24.07.2016 15:54https://www.youtube.com/watch?v=G6u-TomcyD4
И другие творения коллектива.
mosinnik
24.07.2016 20:14Есть фильм «Виктория» — ~2 часа одним дублем. При этом там достаточно много перемещений как по улице и внутри зданий, даже есть отрезок, когда главные герои в машине едут.
agmt
25.07.2016 02:36Я специально для такого эксперимента поставил камеру на забор и заснял прибытие поезда. Практическое применение? По 1 изображению можно оценить скорость при проходе каждого вагона (чем медленнее, тем длиннее вагон). В случае с разными сценами можно сразу увидеть моменты переключения.
А вот фантазии на действительно красивое видео не хватило.
CTAPOBEP
25.07.2016 17:49«Глаза змеи» — первые 12 минут одним кадром (причем там целый стадион людей задействован).
«Миссия Серенити» — с момента входа Серенити в атмосферу следующие 5 минут сняты одним кадром с проходом камеры по всему кораблю.
Bellicus
27.07.2016 13:31Ну уж, коли начали перечислять.
Джон Ашер — Кто-нибудь, женитесь на мне
Мирослав Момчилович — Смерть человека на Балканах
Линда Вендель — Один кадр
Юрий Зельцер — Круг
Майк Фиггис — Тайм-код.
Mercury13
24.07.2016 10:59Я тут подумал: а неплохо бы иметь подобный инструмент в видеопрограммах. Без движения, разумеется. Полоса — монтажная склейка, сцены как-то узнаются.
FluffyMan
24.07.2016 12:43+1Недавно писал реализацию щелевой фотографии на bash — один кадр для видео в Вашем случае)
BubaVV
24.07.2016 13:57+3Почему-то напомнилоSurvtur
24.07.2016 14:21+1Интересно. Это же у вас фотофиниши в видеосклейке по линии среза.
Если интересно, поделать фотофиниши, то вот простой скрипт, который я набросал после того, как я прочитал пост «Щелевая съёмка: сжатие времени по горизонтали».
# взять видео v.mp4
# для первых 10 секунд видео
# каждый кадр марштабировать в 800х600,
# вырезать 2х600 с оффсетом 399:0 (средний столбец)
# и сохранить как кадр temp-aa-00000.png
ffmpeg -i v.mp4 -t 10 -vf «scale=800:600,crop=2:600:399:0» temp-aa-%5d.png
# слить столбцы по горизонтали в одну картинку
# и уменьшить ширину в два раза
convert +append temp-aa-* -resize 50%x100 out.png
#удалить лишнее
rm temp-aa-*
qwerty123123
24.07.2016 14:57-11Видео хранится в виде диффов между кадрами.Откуда целиковые кадры? Хуже, чем статьи про собеседования где возмущаются зачем спрашивают сортировки.
Hayate
24.07.2016 14:59-9Но… Зачем? Это какая-то интересная и полезная технологическая задача? И тогда причём здесь хабр? Node.js потому что?
NLO
24.07.2016 15:05НЛО прилетело и опубликовало эту надпись здесь
brdsoft
24.07.2016 15:07Можно использовать в искусстве, например, как разновидность щелевой съемки. Если снять видео целенаправленно, учитывая то, что получается на выходе, можно добиться интересных результатов.
Survtur
27.07.2016 07:29Террористы так могут шифровать послания. Особо продвинутые смогут шифровать видеообращения.
gorodskih
24.07.2016 16:01+5Эх, жалко конечно, что мы ограничены только тремя измерениями и можем видеть четырёхмерные вещи только в проекции.
А в статье интересный эксперимент получился. Мы видим четырёхмерную реальность в проекции по времени, а как-то так могли бы видеть мир существа, видящие его в проекции на одно из измерений расстояния. Такие существа спокойно могли бы двигаться по времени, но в пространстве они ощущали бы себя лишь в одной плоскости.ivan386
24.07.2016 16:44+2Мы и трёхмерные вещи видим только в проекции)
gorodskih
24.07.2016 17:18+2Однако мы ощущаем трехмерность и можем перемещаться в трех измерениях, а в четырех перемещаться не можем сами по себе. Мы не можем взглянуть на объект с «другой стороны» и увидеть его из другого времени.
Tretikona
24.07.2016 18:03Напоминает игрушку из детства Калейдоскоп. Толку от этого помоему столько же — просто прикольные картинки, а тех применения нет.
nikitazvonarev
25.07.2016 01:15Я думаю, что примерно так же могли бы наблюдать нашу жизнь трафальмадорцы из «Бойни номер пять...» Воннегута :)
Quiensabe
25.07.2016 03:28+1Теперь можно попробовать сделать щелевое сканирование для полученного видео :)
gaki
25.07.2016 04:10Круто. А нельзя это как-то приспособить для программ видеомонтажа, ну вот там показывать смены планов и т. п. (вертикальные линии)? Хотя есть, наверное, и проще способы…
entomolog
25.07.2016 05:59Напомнило Line Scan Camera от Elm Chan.
LoadRunner
25.07.2016 08:37А что будет, если полученное «видео сбоку» обработать таким же алгоритмом?
defecator
25.07.2016 10:20А что если не фильмы брать, а реальные съёмки камерой?
Например, камера снимает за один день улицу, никаких склеек, реальные данные.
silvansky
25.07.2016 11:03+10Приветствую собрата по сумасшедшей обработке видео! =)
Я делал похожую штуку, жёсткий программный rolling shutter. В совокупности с замедленной съёмкой даёт интересные результаты.
Конечно, по сути то срез "по диагонали слева направо" Вашего прямоугольного параллелипипеда на схеме. Но можно делать срезы в принципе под разными углами, например, "диагональ сверху вниз", будет интересный эффект. ;)
AndreySemikMironov
25.07.2016 11:42Возможно, автору будет интересна моя система получения подобного рода изображений:
7act.ru/ekspozzer.phpdeNULL
28.07.2016 03:24Стало интересно: в той части, где вы «усредняете» изображения, чтобы убрать людей с фото — вы именно среднее арифметическое используете? Кажется, что медиана подойдёт лучше — не будет «призраков» от долго стоящих на одном месте людей (но могут появиться отдельные случайные артефакты).
Кстати, в Photoshop есть аналогичный инструмент для этого (File–Scripts–Statistics...).
Lertmind
Это достаточно старая штука — Slit-scan photography (щелевая съёмка или щелевое сканирование). На хабре как минимум три статьи. Вот такое делают:
AllexIn
Это не совсем тоже самое.
Lertmind
Почему?
rPman
в вашем видео ось времени осталась временем, а в статье предложен вариант когда ось времени взята из горизонтальной или вертикальной осей изображений.
vagran
Тут в центре полоска из исходного видео шириной в один пиксель, положение полоски в кадре исходного видео фиксировано. У автора статьи положение полосок из кадров исходного видео не фиксированы — они движутся одного края кадра к другому.
gaki
Судя по приведенной иллюстрации метода — это «срез», плоскость которого перпендикулярна плоскости кадра, полоска не будет двигаться. Она будет двигаться только если «резать» «наискосок».
gaki
А, нет, чушь сморозил, не подумавши — vagran прав.
sajtpro
Нельзя увидеть плоскость XYO, и то что там находится с оси Z. Нельзя ничего увидеть сбоку страницы книги.
samodum
«то же самое»