1 (edited by tracker35 11-08-2016 23:47:21)

Topic: VFR в CFR используя таймкоды.

Имеется весьма специфичные сорсы с VFR фпс'ом, не дропы по 1,2 или 3 кадра, а именно float проседание по 10-20 кадров от заданного (допустим 30fps).
Поиском пользовался но в основном натыкался на дроп-фиксы, что данной задаче не пригодно.

Как вариант, можно взять файл таймкодов, взятый из mkvextract, и оперируя им добавлять необходимое кол-во кадров в временные промежутки.

Тема весьма актуальна например для тех кто делает записи игр, или различных rtmp(flv) потоков.
Собственно ищется решение сей проблемы ...

Re: VFR в CFR используя таймкоды.

tracker35
Какой характер именно Ваших файлов с переменной частотой кадров?
Если это запись видеоигры, то должна быть опорная частота кадров, например 30 к/сек. Тогда такую запись вполне можно рассматривать как запись с постоянной частотой кадров и дропами.
Можете привести здесь пример таймкодов любого Вашего VFR-файла?

3 (edited by tracker35 12-08-2016 09:28:28)

Re: VFR в CFR используя таймкоды.

Вариант 1:

mediainfo http://www.beetxt.com/CDq/
Таймкоды из mkv2vfr http://www.beetxt.com/p56/
Таймкоды из mkvextract http://www.beetxt.com/s0V/

Вариант 2:
mediainfo http://www.beetxt.com/1vk/
Таймкоды из mkv2vfr http://www.beetxt.com/b8z/
Таймкоды из mkvextract http://www.beetxt.com/HSj/

Re: VFR в CFR используя таймкоды.

Ответ, "нет, такой возможности на данный момент нет" тоже устроит ...

Re: VFR в CFR используя таймкоды.

взять файл таймкодов, взятый из mkvextract, и оперируя им добавлять необходимое кол-во кадров в временные промежутки

Решения из коробки пока "нет, такой возможности на данный момент нет" smile

Но конкретно для Ваших файлов можно написать Avisynth-скрипт. Он будет использовать библиотеки SVP и получать видео с добавленными кадрами. Можете дать ссылку на любой короткий видео-фрагмент. 20-30 сек будет вполне достаточно.

6 (edited by tracker35 16-08-2016 11:46:29)

Re: VFR в CFR используя таймкоды.

там файл захвата rtmp потока,
и vfr созданный вручную через замедление и ускорение видео.

https://cloud.mail.ru/public/L88H/nAKapzKSm

Немного для справки. AviSynth не умеет vfr в принципе и все инпут-плагины открывая VFR преобразуют его в два вида СFR:
- с сохранением количеств кадров и созданием четкого fps, соответственно изменяется время.
- с дублированием кадров для соответствия времени.

Для того чтобы кодить VFR в AviSynth'е, его необходимо открывать по 1'му способу, и в дальнейшем, уже при мюксировании в контейнер, использовать файл таймкодов.

Именно поэтому я и сделал акцент на таймкоды, даже добавил в название темы, т.к. SVP в AviSynth'е необходимо выступать в роли 'мюксатора' который будет использовать файл таймкодов

Re: VFR в CFR используя таймкоды.

фильтр ависинта в принципе не может выставить конкретному кадру конкретный таймкод
вот фильтр vapoursynth-а - вроде как может...

Re: VFR в CFR используя таймкоды.

tracker35
vfr созданный вручную не совсем подходит, т.к. это неестественное видео. Даже с восстановлеными кадрами не получится добиться плавности и равномерности видео. Ведь в этом цель?
А вот с захватом rtmp потока поколдую. Общая задумка - подать на вход видео с дублированием кадров для соответствия времени (2-ой способ). Вот как раз эти дубли и станут исходником для замены их промежуточными кадрами. Надо будет только подготовить правильный файл с временными метками для замены.

9 (edited by tracker35 16-08-2016 16:43:16)

Re: VFR в CFR используя таймкоды.

из vfr'а созданного вручную нет необходимости востанавливать изначальную скорость воспроизведения, а только уплавнить моменты когда эта скорость уменьшается (проседает vfr), до номинальной.
в игровых записях происходит примерно тоже самое, за исключением момента, что изначальная скорость воспроизведения не меняется.
Данный файл я привел на скорую руку

rtmp поток как мне кажется сложнее, если судить по таймкодам из mkv2vfr, т.к. он почти никогда не достигает номинальной, а порой даже перескакивает её.

Схематичные графики:
rtmp: http://s020.radikal.ru/i716/1608/10/83fc960e91e7.png
game: http://s020.radikal.ru/i703/1608/f2/d8fdb54711e8.png

---

Общая задумка - подать на вход видео с дублированием кадров для соответствия времени (2-ой способ). Вот как раз эти дубли и станут исходником для замены их промежуточными кадрами. Надо будет только подготовить правильный файл с временными метками для замены.

1. способ работает когда на инпуте у плагина извлеченная raw дорожка. (FFVideoSource в этом более всеядный, в особенности rtmp потоков)
2. способ работает например у directshowsource + lavfilters, а на инпуте контейнер с vfr.

Re: VFR в CFR используя таймкоды.

Картинки графиков посмотрел. Да. Я как раз про это и говорил. Что желательно видео не синтетическое, а приближенное к задаче: сделать плавным игровое видео, записанное с переменной частотой кадров (VFR).
Может есть кусок такого видео, чтобы именно с ним тренироваться?

11 (edited by tracker35 19-08-2016 02:23:20)

Re: VFR в CFR используя таймкоды.

MAG79 wrote:

Может есть кусок такого видео, чтобы именно с ним тренироваться?

Ну посути такие куски можно сделать на подавляющем большинстве компьютеров ...
держите: https://cloud.mail.ru/public/8L99/oDc9VB78z
Bandicam, VFR mode, locked 30fps max.

И запись 3dmark'a, со счетчиками кадров, фпс и времени, для удобства.
https://cloud.mail.ru/public/J7a5/LXhzMDafA

Re: VFR в CFR используя таймкоды.

Видео по ссылкам оказалось не совсем с плавающей частотой кадров. Их можно приравнять к видео с постоянной частотой кадров, но с дропами в 1 или 2 кадра.

Проверял утилитой mp4dump. Эта утилита возвращает интервалы с определенной частотой кадров. Показывает межкадровые интервалы (sampleDelta):

entryCount = 371 (0x00000173)
        sampleCount = 1 (0x00000001)
        sampleDelta = 999 (0x000003e7)
        sampleCount[1] = 36 (0x00000024)
        sampleDelta[1] = 1000 (0x000003e8)
        sampleCount[2] = 1 (0x00000001)
        sampleDelta[2] = 2000 (0x000007d0)
        sampleCount[3] = 29 (0x0000001d)
        sampleDelta[3] = 1000 (0x000003e8)
        sampleCount[4] = 1 (0x00000001)
        sampleDelta[4] = 2000 (0x000007d0)
        sampleCount[5] = 25 (0x00000019)
        sampleDelta[5] = 1000 (0x000003e8)

Видно, что значения sampleDelta кратны 1000. 999 - редкое исключение, близкое к 1000. Можно пренебречь.

Конкретно по каждому ролику. Посчитал статистику при помощи excel. Получил такие межкадровые интервалы.

NMS.mp4

1000 - 1187 интервалов
2000 - 1174 интервала
3000 - 19 интервалов
4000 - 5 интервалов
999 - 2 интервала
5000 - 2 интервала
1001 - 1 интервал
3999 - 1 интервал
6000 - 1 интервал
9001 - 1 интервал
22000 - 1 интервал

3DMarkICFWorkload 2016-08-19 05-03-13-297.mp4

1000 - 185 интервалов
2000 - 184 интервала
3000 - 1 интервал
999 - 1 интервал

3DMarkICFWorkload 2016-08-19 05-03-57-801.mp4

1000 - 320 интервалрв
2000 - 319 интервалов
999 - 1 интервал

3DMarkSkyDiver 2016-08-19 05-05-41-325.mp4

1000 - 288 интервалов
2000 - 284 интервала
3000 - 2 интервала
999 - 1 интервал
35000 - 1 интервал

3DMarkSkyDiver 2016-08-19 05-06-30-212.mp4

1000 - 196 интервалов
2000 - 195 интервалов
999 - 1 интервал

3DMarkSkyDiver 2016-08-19 05-15-10-113.mp4

2000 - 663 интервала
1000 - 426 интервалов
3000 - 251 интервал
4000 - 2 интервала
999 - 1 интервал

Можно и эти файлы уплавнить, но это будет всего лишь разновидность устранения дропов.

tracker35
Разговр в начале темы был ведь про другое видео? Или именно про такое?

13 (edited by tracker35 21-08-2016 19:32:56)

Re: VFR в CFR используя таймкоды.

Я к тому, что использование directshowsource, directshowsource2, и прочих инпутов напрямую с контейнером, иногда может дропать кадры на проблемных VFR, в отличии от извлеченной видеодорожки с последующим подключеннием таймкодов на мюксировании.
Но, такой способ не даёт работать GameDropFix'у т.к. дублей там не будет.

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

Есть примеры файлов, но они так сказать 18+ если через личку скину.

14 (edited by tracker35 21-08-2016 21:35:06)

Re: VFR в CFR используя таймкоды.

Я тут конечно нашел плагин по преобразованию VFRtoCFR с использованием файла таймкодов.
оригинал http://forum.doom9.org/showthread.php?t=165045
пересборка под новый ависинт: http://forum.gleitz.info/showthread.php?47538

Но он всё время ругается на неправильный файл таймкодов :\
хотя пробывал делать его и через ffmpeg и через mkvmerge->mkvextract

UPD: получилось извлечь правильный для VFRtoCFR файл таймкодов, нужно было указать vsync 0
ffmpeg -vsync 0 -i file -f mkvtimestamp_v2 timeccodes.txt

Вот теперь, кажется(нужно проверять вручную) все кадры на месте + GameDropFixv5 так-же работает tongue

UPD2: VFRtoCFR все-же с косяком, обрезал длину видео по времени равной если сорс открыть как CFR ... т.е. требует доработки.

Re: VFR в CFR используя таймкоды.

использование directshowsource, directshowsource2, и прочих инпутов напрямую с контейнером, иногда может дропать кадры на проблемных VFR

Я использовал DirectShowSource и DSS2 для файлов NMS и 3DMark. Длительность совпала до кадра.
И да, оба открывают видео с заполнением кадрами-дублями мест, где в VFR раполагаются кадры увеличенной продолжительности.
Для такого видео с кадрами-дублями GameDropFix использовать можно, другое дело, что в данном случае будет производиться поиск кадров дублей по внутрикадровым движениям вместо использования имеющегося файла тайм-кодов.

есть пожелания на шестую версию - прикрутить использование файла таймкодов

Это прикрутить можно, на досуге поэкспериментирую.

Спасибо за ссылку на VFRtoCFR. С первого раза не уяснил из описания, чем этот плагин может мне помочь, учитывая, что текущие версии DSS и DSS2 сами достойно преобразуют VFR в CFR, но в моих следующих экспериментых все же покручу этот плагин, познакомлюсь с ним на практике.

16 (edited by tracker35 22-08-2016 13:45:48)

Re: VFR в CFR используя таймкоды.

Попробуйте, я думаю это должно дать как минимум выигрыш в скорости, т.к. идёт замена поиска на уже готовую модель.
Ну еще, можно посоветовать реализовать опционал по замене овер 20 дублей, - полезно на VFR где дропы идёт по секунде и более.

p.s. если интересно, могу пособирать различных VFR'ов, есть даже такие дампы, в которых поток меняет размер картинки в ходе проигрывания, с ними только ffvideoSource более-менее нормально работает, а всякие dss и libav либо крашаться либо выдают непоймичто.

Re: VFR в CFR используя таймкоды.

tracker35
Спасибо за предложение пособирать еще VFR записей. Мне пока для экспериментов достаточно. Но буду иметь в виду wink

Насчет замен большого количества дропов подряд (20 и более) подумаю как это универсально реализовать в скрипте. До сих пор (GameDropFix_v5) заменялись только 3 подряд идущих дропа. Все что больше - оставалось без изменений.

18 (edited by tracker35 24-08-2016 20:42:26)

Re: VFR в CFR используя таймкоды.

Кстати, в некоторых VFR'ах где у контейнера не указан max.fps (например у дампов mpeg-ts с перископа, да и в остальных случаях когда данное значение хоть и указано но не достигается), необходимо высчитывать максимальный фпс:
Делается, это просто, опять таки через файл таймкодов:
1000 делим на (значение вычесть пред.значение), получим межкадровый фпс.
Из получившегося массива находим максимальное, но которое не будет больше 30, 60 (ибо могут быть быстрые кадры с 1000fps)

В последующем, при открытии потока с найденной частотой кадров, VFR будет преобразован к более правильно-единой частоте кадров, для того, чтобы не было лишних дублей для GameDropFix'a.

По сути делается, это через эксель, но неплохо бы иметь такой-же правильный подход к преобразованию VFR to CFR на автоматике и в самом ависинте.



К примеру, зачем уплавнять VFR до 30fps, если поток имеет максимум ~27fps т.е. три якобы 'лишних' кадра GameDropFix посчитает дропом, когда как мог-бы 'дропфикснуть' уже 24fps, но увы 30fps(минус три) планка, и скрипт дропфиксит уже нормальные кадры hmm
А на следующем этапе (по желанию) эти 27fps уже CFR, можно спокойно поднять до ровных 30fps.

--- --- ---

Исходя из первого возникает еще одна идейка, но куда сложнее, сегментированный дроп фикс:

Плагин проводит анализ файла таймкодов, и на основе него смотрит изменения в частоте кадров, в соотвецтвии с максимальным межкадровым фпс,
и если за 1 секунду времени, на взятом промежутке частота кадров намного ниже межкадрового фпс, то межкадровый фпс для данного промежутка вычисляется дополнительно и в соответствии с ним производится дропфикс.
т.е. производится VFR to FixVFR, но необходимо чтобы этот плагин создавал новый файл таймкодов для нового потока, и уже используя его мюксовать FixVFR.

Схематичный график:
http://s019.radikal.ru/i602/1608/8e/f96facbdb445.png


p.s. Чувствую, с моими идеями, просто avsi файлом не обойтись, тут уже на целый dll тянет wink

Re: VFR в CFR используя таймкоды.

avisynth на выходе может отдать поток видео только с постоянной частотой кдров. Поэтому насчет сегментации - это либо вручную делить видео на куски и обработывать их отдельно, либо чем-то еще снаружи автоматизировать этот процесс.

У меня есть сомнения насчет необходимости такой сегментации. Причина простая. В любом случае на финальной стадии обработки (или раньше) Вам придется приводить все сегменты видео к одной частоте кадров и сохранять в единый файл (такой стандарт, чтобы видео играло на большинстве плееров). А еще стандартных частот не так уж и много: 24, 25, 30 и 60 fps. Так что в 99% случаев Вы будете преобразовывать VFR к одной из этих частот.

20 (edited by tracker35 25-08-2016 15:17:57)

Re: VFR в CFR используя таймкоды.

При сегментированном подходе необходимо создавать новый файл таймкодов и мюксировать в контейнер новый поток с использованием нового файла таймкодов.

т.е. производится VFR to FixVFR, но необходимо чтобы этот плагин создавал новый файл таймкодов для нового потока, и уже используя его мюксовать FixVFR.

Ибо, что такое VFR: VFR, это тот-же самый CFR, но у которого межкадровый фпс задан для каждого кадра.

т.е. не важно сколько будет fps у полученного из ависинта потока, всё равно таймкод-файл исправит его как надо.

Ну както так:
VFR > extract(VFR) > input(CFR) > segment dropfix (VFR>CRF , in-timecodes , out-timecodes) > avisynth(CRF) > mkvmerge(CRF,out-timecodes) > FixVFR

[ extract(VFR) > input(CFR) ] - можно заменить на DSS(convertfps=false), ибо дубли должен делать dropfix исходя из макс.фпс в сегментах.

UPD: попробывал вручную сделать такой метод сегментированного дропфикса, ничего хорошего в итогде не получил.
Куски меньше дергатся не стали, но дергатся зато стали более одинаково "гладко" т.ч. да, сегментированный подход, особо сильного профита не даст, нужно смотреть в сторону увеличения 3х кадров.

Хотя если этот сглаженный сегмент открыть с более высоким fps чтобы появились дубли, то его можно еще раз сгладить, тем самым получаем 3+3..+3 пока не достигнем верхней планки фпс'а.
К примеру для преобразования 5фпс в 30фпс, необходимы 3 прохода: 5 > 15(5*3) > 30(15*2)

21 (edited by tracker35 26-08-2016 02:16:04)

Re: VFR в CFR используя таймкоды.

Вот как пример можно сделать 63 дроп фикса используя сегодняшний dropfix

X - AAA - Y [3 drop fix]
X - bbb A bbb A bbb A bbb - Y [15 drop fix ]
X - ccc b ccc b ccc b ccc A ccc b ccc b ccc b ccc A ccc b ccc b ccc b ccc A ccc b ccc b ccc b ccc - Y [63 drop fix]

только первый заход необходим супер точным и тяжёлым, на 2ой и 3ий заходы точность можно сбавить в угоду скорости.

---

вот что у меня из этого получилось: https://cloud.mail.ru/public/Ju5u/op5nu6MPA
25fps > 3fps > 9fps(dropfix) > 18fps(dropfix) > 25fps(dropfix)

Из 3фпс в 25 фпс! 22дропа в секунду было восстановлено вполне более-менее если сцена не особо динамична.
Особенно если сравнивать 3 и 25дропфикс, прямо как небо и земля.

Если так прикинуть, то можно сотавить такую модель востановления за 2 захода используя только по три кадра:

A 
AA 
AAA
oAAo 
oAoAo 
oAooAo 
oAoAoAo 
ooAooAoo 
ooAoAoAoo 
oooAooAooo 
ooAooAooAoo 
????????????
oooAooAooAooo 
??????????????
oooAoooAoooAooo 


Где А - первый заход, b - второй.

Но вот если была возможность фикса хотябы 4х кадров, то, всё было бы чутка получше, тогда на фикс 5+ кадров уходили бы все 4ре кадра из 1го прохода, плюс всё выглядело более правильно растянутым:

A
AA
AAA
AAAA
AAbAA
oAAAAo
oAAoAAo
oAoAAoAo
oAoAoAoAo
ooAoAAoAoo
ooAoAoAoAoo
ooAoAooAoAoo
ooAooAoAooAoo
ooAooAooAooAoo
ooAooAoooAooAoo
oooAooAooAooAooo
oooAooAoooAooAooo
oooAoooAooAoooAooo
oooAoooAoooAoooAooo
oooAoooAooooAoooAooo
ooooAoooAoooAoooAoooo
ooooAoooAooooAoooAoooo
ooooAooooAoooAooooAoooo
ooooAooooAooooAooooAoooo

В этом случае уже 24 фикс кадров за 2 прохода, я думаю такого будет вполне достаточно для 99% VFR файлов.


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

Re: VFR в CFR используя таймкоды.

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

Да. Все верно.

По поводу деления всего видео на куски (сегментирование). Есть еще одна проблема - бесшовная склейка. Она не всегда получается. smile
Поэтому я за единый проход всего видео целиком.

По поводу многопроходной обработки. Для задачи "дорисовывания" кадров лучшее качество даст один проход. Причина проста: каждое дорисовывание дает потенциальные артефакты в кадре. Второй проход уже дорисовывает артефакты к артефактам, а третий проход - это уже третье поколение артефактов. Меньше проходов - меньше артефактов. В теории.

Ну и на практике тоже. Видео 25fps из архива по ссылке предыдущего сообщения яркий тому пример.

23 (edited by tracker35 26-08-2016 02:15:36)

Re: VFR в CFR используя таймкоды.

Можно как доп.опцию на свой "страх и риск", если вариантов расширить до много-много кадров не найдётся ( всё лучше чем ничего wink )

Дополнил 'пирамиду' на 4'ре дропа, она более оптимальна и при этом востановит до 24 дропов.

Сегментированный подход, да подтверждаю, идейка так себе, дальше её смысла мозолить нет.

24 (edited by tracker35 26-08-2016 02:17:55)

Re: VFR в CFR используя таймкоды.

При 2pass режиме, сильно артефачит будет только в 'о'-кадрах которые находятся между 'А'-кадрами 1го прохода. (макс. 12 кадров)
Боковые 'о'-кадры второго прохода дадут меньше артефактов в виду того, что будут опираться на оригинальный кадр.

Но повторюсь, если будет выбран 2pass режим, то 1 проход обязан быть супер-тяжёлым, чтобы максимально снизить артефакты для 2го прохода. (это прямо как и у кодеков, только там 1 проход быстрый, второй тяжелый)

Re: VFR в CFR используя таймкоды.

tracker35
Что это значит? не совсем понял эту пирамиду:

A 
AA 
AAA
oAAo 
oAoAo 
oAooAo 
oAoAoAo 
ooAooAoo 
ooAoAoAoo 
oooAooAooo 
ooAooAooAoo 
????????????
oooAooAooAooo 
??????????????
oooAoooAoooAooo