MKV Interlaced, некорректное воспр-ие после резки [не баг]

Автор Evgeniy1990, 20 февраля 2016, 13:04:56

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Evgeniy1990

Во встроенном фильтре-источнике "MPC Matroska Source" наблюдаю значение джиттера выше, чем "LAV Splitter Source"?

Пример видео файла: https://yadi.sk/d/b1VG0aLKpAjKh

При использовании встроенного фильтра-источника: "MPC Matroska Source", в свойствах и статистике видео-рендерера, значение джиттера всегда = 10 мс, при этом сам видео файл воспроизводится нормально.
При использовании внешнего фильтра-источника: "LAV Splitter Source", в свойствах и статистике видео-рендерера, значение джиттера всегда = 1 мс или 0 мс, при этом сам видео файл также воспроизводится нормально.

Проблема:

Если обрезать, или разделить этот видео файл по частям, то после его открытия будут отклонения и пропуски кадров, другими словами - некорректное воспроизведение.

Ссылка на части от данного видео файла: https://yadi.sk/i/NZ-1Le-PpAjto и https://yadi.sk/i/b8En--vFpAjxD

__________________________
отредактировано модератором
Motherboards: ASUS P5Q/GIGABYTE EP35C-DS3R, CPU: Core 2 Duo E8300/E8400, Memory: DDR2/DDR3, Video: MSI GTX 465/ASUS EAH5770/GTX 650 Ti, Audio: ASUS Xonar DG 5.1/Creative SB 5.1. VX/X-Fi Xtreme Gamer.

V0lt

Про джиттер не баг вообще.

А резка изменила файл.
Было:Режим частоты кадров                     : Переменный
Частота кадров                           : 50,000 кадров/сек
Частота кадров в оригинале               : 25,000 кадров/сек
Стало:Режим частоты кадров                     : Постоянный
Частота кадров                           : 25,000 кадров/сек
Полученные файлы и в других плеерах будут так же колбасить.

Резать интерлейсные MKV на автомате нельзя.

Evgeniy1990

Интересно, у нас вообще есть какие-нибудь программы, те же конвертеры, где можно грамотно разрезать и разделять такие интерлейсные видео файлы на части?
Motherboards: ASUS P5Q/GIGABYTE EP35C-DS3R, CPU: Core 2 Duo E8300/E8400, Memory: DDR2/DDR3, Video: MSI GTX 465/ASUS EAH5770/GTX 650 Ti, Audio: ASUS Xonar DG 5.1/Creative SB 5.1. VX/X-Fi Xtreme Gamer.

V0lt

Хмм, mkvmerge GUI v8.3.0 64bit отрезал хорошо, полученные файлы играют нормально.

Evgeniy1990

Цитата: V0ltХмм, mkvmerge GUI v8.3.0 64bit отрезал хорошо, полученные файлы играют нормально.
Спасибо за ответ, скачал и обновил MKVToolNix до последней версии 8.8.0 х64 - сделал обрезку с размером в 100 Мб.
Запустил и проверил - воспроизводится нормально.
[merge_posts_bbcode]Добавлено: 2016-02-22 19:26:01[/merge_posts_bbcode]

Дело в том, что в данном случае, значение джиттера = 10 мс все же имеет значение, т.е. оно влияет на открытие и дальнейшее воспроизведение.

Проверив эту интерлейсную матрешку на видеокарте "ATI Radeon HD 5770", она же "ASUS EAH5770", я полностью убедился в том, что дело здесь нечисто.

Итак, у меня получились следующие результаты, с учетом последних тестов:

Тест 1: Windows 7, x64 + ASUS EAH5770 + "MPC Matroska Source" + EVR Custom:

В свойствах и статистике видео-рендерера, значение джиттера оказалось равным 5 мс.
Если обратить внимание только на свойства видео-рендерера, то там значения такие: 5, -7, 3, последние два из которых могут меняться и быть совершенно разными.

Тест 2: Windows 7, x64 + ASUS EAH5770 + "LAV Splitter Source" + EVR Custom:

В свойствах и статистике видео-рендерера, значение джиттера равно 1 мс.
Если обратить внимание только на свойства видео-рендерера, то там только одно единственное значение: 1, остальные два значения всегда равны 0.

Тест 3: Windows 8.1 x64 + ASUS EAH5770 + "MPC Matroska Source" + EVR Custom:

В свойствах и статистике видео-рендерера, значение джиттера всегда равно 10 мс.
Если обратить внимание только на свойства видео-рендерера, то там только одно единственное значение: 10, остальные два значения всегда равны 0.

Тест 4: Windows 8.1, x64 + ASUS EAH5770 + "LAV Splitter Source" + EVR Custom:

В свойствах и статистике видео-рендерера, значение джиттера всегда равно 1 мс.
Если обратить внимание только на свойства видео-рендерера, то там только одно единственное значение: 1, остальные два значения всегда равны 0.

Тест 5: Windows 10 TH2 x64 + ASUS EAH5770 + "MPC Matroska Source" + EVR Custom:

В свойствах и статистике видео-рендерера, значение джиттера всегда равно 10 мс.
Если обратить внимание только на свойства видео-рендерера, то там только одно единственное значение: 10, остальные два значения всегда равны 0.

Тест 6: Windows 10 TH2, x64 + ASUS EAH5770 + "LAV Splitter Source" + EVR Custom:

В свойствах и статистике видео-рендерера, значение джиттера всегда равно 1 мс.
Если обратить внимание только на свойства видео-рендерера, то там только одно единственное значение: 1, остальные два значения всегда равны 0.

Исходя из этих шести данных тестов, получается следующая картина, в виде разницы в значении джиттера:

1. При конфигурации: Windows 7, x64 + ASUS EAH5770 + "MPC Matroska Source" + EVR Custom:

В свойствах и статистике видео-рендерера, значение джиттера в данном видео файле всегда равно 5 мс.

2. При конфигурации: Windows 8.1, x64 + ASUS EAH5770 + "MPC Matroska Source" + EVR Custom:

В свойствах и статистике видео-рендерера, значение джиттера в данном видео файле всегда равно 10 мс.

3. При конфигурации: Windows 10 TH2, x64 + ASUS EAH5770 + "MPC Matroska Source" + EVR Custom:

В свойствах и статистике видео-рендерера, значение джиттера в данном видео файле всегда равно 10 мс.

Т.е. на Windows 7 + ASUS EAH5770 - джиттер строго = 5 мс + также имеются два других рандомных значения, вместо нулей.

На Windows 8.1 и Windows 10, при той же самой видеокарте ASUS EAH5770, джиттер всегда строго равен 10 мс, при этом два других значения в свойствах видео-рендерера всегда равны 0.

Очень странно, на одной системе джиттер = 5 мс, на других = 10 мс, при использовании нашего фильтра-источника: "MPC Matroska Source".

Если взять внешний фильтр-источник: "LAV Splitter Source", то на новых операционных системах (Win7 - Win10), на любой видеокарте, значение джиттера всегда строго равно 1 мс.

Причем, на Windows 7, при конфигурации "ASUS EAH5770 + "MPC Matroska Source" + EVR Custom", после открытия данной интерлейсной матрешки, наблюдается явление "Frame Repeat", т.е. некое повторение уже прошедших кадров, а также присутствуют и промелькают в самом начале мелкие артефакты, в режиме DXVA2.

Артефакты также присутствуют на Windows 8.1 и Windows 10 TH2, но только на видеокарте "ASUS EAH5770", даже при использовании самых последних версий драйверов: "AMD Catalyst 15.7.1 WHQL".

Если взять NVIDIA GeForce GTX 465, или GTX 650 Ti, то значение джиттера на новых системах (Win7 - Win10), всегда строго равно 10 мс, при этом в самом начале воспроизведения нет артефактов, пропусков кадров после открытия, в отличие от ASUS EAH5770.

Отсюда могу сделать вывод, что пропуски кадров на ASUS EAH5770 - это некорректная работа, а точнее декодирование первых начальных кадров, не случайно же есть артефакты, более низкий джиттер вместо 10 мс - 5 мс, особенно на Windows 7.

И уже, исходя из данного вывода можно сделать окончательное заключение, что у данной интерлейсной матрешки не должно быть джиттера, равного 10 мс, при использовании встроенного фильтра-источника: "MPC Matroska Source".

Ибо с внешним фильтром-источником: "LAV Splitter Source" - ситуация уже совершенно другая...

В общем, надо разобраться с нашим фильтром-источником: "MPC Matroska Source".

Вот ясно видно, даже по тестам, что где-то что-то работает не так, т.е. здесь все же есть некий баг, во только в каком он месте - непонятно, если не в MPC Matroska Source, то где тогда он может быть?

P.S. Вам, уважаемый V0lt, я скажу так, что при 5 мс, даже сам плеер ведет себя слегка тяжеловато, как будто бы идет очень сильная на него нагрузка в процессе воспроизведения интерлейсной матрешки.

Что это значит? Вот я открыл эту интерлейсную матрешку, после открытия сдвинул курсор мышки в сторону, при этом он еле-еле сдвинулся в сторону, как будто бы нагрузка на CPU, при DXVA2, составляла 100%. Отсюда и пропуски кадров с артефактами. С LAV Source опять таки все иначе, т.е. например, нет нагрузки, пропусков кадров, даже если они и есть, то их гораздо меньше, т.е. при внешнем фильтре, плеер ведет себя более свободно, чем при встроенном.

Я конечно пробовал увеличить значение размера буфера для встроенных сплиттеров (фильтров-источников) и значение буфера EVR Custom, даже до максимальных, но увы, это, к сожалению, не помогло.
Motherboards: ASUS P5Q/GIGABYTE EP35C-DS3R, CPU: Core 2 Duo E8300/E8400, Memory: DDR2/DDR3, Video: MSI GTX 465/ASUS EAH5770/GTX 650 Ti, Audio: ASUS Xonar DG 5.1/Creative SB 5.1. VX/X-Fi Xtreme Gamer.

Aleksoid1978

Достаточно интересная проблема - дело в том что видео 25i, но при укладке в MKV почему-то длительность кадра выставляется как для 50fps. Наш сплиттер использует именно это значение для расчета - а вот LAV Source возможно берет значение из H.264 SPS данных - а там как положено указано 25fps.

Отсюда и не совсем корректное проигрывание - особенно если включить VSync.
[merge_posts_bbcode]Добавлено: 2016-02-23 12:01:23[/merge_posts_bbcode]

Вот проверяем как стало - https://yadi.sk/d/YzazqPWRpL8aY
AMD Ryzen 5 3600 /GIGABYTE B450 Gaming X /AMD Radeon R9 16Gb@3200 /Kingston 500Gb M.2 /GTX 1650 /Samsung U28R550UQI /OLED Philips 55OLED707 /Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

V0lt

Цитата: Aleksoid1978Достаточно интересная проблема - дело в том что видео 25i, но при укладке в MKV почему-то длительность кадра выставляется как для 50fps. Наш сплиттер использует именно это значение для расчета - а вот LAV Source возможно берет значение из H.264 SPS данных - а там как положено указано 25fps.
Не берет он оттуда данные, нельзя так делать.

Evgeniy1990

Цитата: Aleksoid1978Вот проверяем как стало - https://yadi.sk/d/YzazqPWRpL8aY
Проверил тестовый билд на Windows 7 - 10 + ASUS EAH5770, в том числе и на NVIDIA GeForce-ах.

Вот теперь стало гораздо лучше, а если еще точнее, то вообще превосходно!

Преимущества тестового билда:

1. Избавились от артефактов в самом начале воспроизведения.
2. Избавились от значительного пропуска кадров в самом начале воспроизведения.
3. Избавились от сильной нагрузки, после открытия и начала воспроизведения.
4. Избавились от высокого значения джиттера. Теперь он всегда строго равен 1 мс на всех новых операционных системах (Win7 - Win10) как на ATI/AMD Radeon HD, так и на NVIDIA GeForce.
5. Избавились от странного эффекта (явления) "повторения пройденных кадров" в самом начале воспроизведения.

В общем, теперь данный видео файл, полностью на все 100%, воспроизводится нормально. Грац! :)
[merge_posts_bbcode]Добавлено: 2016-02-23 08:26:16[/merge_posts_bbcode]

Также проверил тестовый билд на данном видео файле, при наличии активной VSync - теперь он стал нормально воспроизводится, при наличии задействованной вертикальной синхронизации (VSync).
Motherboards: ASUS P5Q/GIGABYTE EP35C-DS3R, CPU: Core 2 Duo E8300/E8400, Memory: DDR2/DDR3, Video: MSI GTX 465/ASUS EAH5770/GTX 650 Ti, Audio: ASUS Xonar DG 5.1/Creative SB 5.1. VX/X-Fi Xtreme Gamer.

Aleksoid1978

Цитата: V0lt
Цитата: Aleksoid1978Достаточно интересная проблема - дело в том что видео 25i, но при укладке в MKV почему-то длительность кадра выставляется как для 50fps. Наш сплиттер использует именно это значение для расчета - а вот LAV Source возможно берет значение из H.264 SPS данных - а там как положено указано 25fps.
Не берет он оттуда данные, нельзя так делать.
Если не берет - то откуда тогда fps выставляется 25(хотя в заголовке он равен 50) и время пакета тоже 25 fps.
AMD Ryzen 5 3600 /GIGABYTE B450 Gaming X /AMD Radeon R9 16Gb@3200 /Kingston 500Gb M.2 /GTX 1650 /Samsung U28R550UQI /OLED Philips 55OLED707 /Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

V0lt

Aleksoid1978
Я взял данный файл убрал аудиодороги и запаковал обратно как 60i. MPC-BE и MPC-HC показывают статистику правильно, а твой тестовый билд нет.

Сможешь написать код который будет доставать флаг интерлейса из видеопотока?

Aleksoid1978

Цитата: V0ltAleksoid1978
Я взял данный файл убрал аудиодороги и запаковал обратно как 60i. MPC-BE и MPC-HC показывают статистику правильно, а твой тестовый билд нет.

Сможешь написать код который будет доставать флаг интерлейса из видеопотока?
Я не спорю что мой билд корректный. Я просто показал как оно может быть.

По поводу флага интерлейса - а что он даст ?? Опять же костыль - модифицировать зашитые значения в шапке ??
А если он нужен - он уже есть, там где парсятся H264 данные, один из параметров как раз указывает на интерлейс.
[merge_posts_bbcode]Добавлено: 2016-02-23 16:57:44[/merge_posts_bbcode]

Хм - я нашел что делает LAVSource, почему он выставляет 25fps.
 if (container == "matroska" && r_avg && tb_avg && (avstream->codec->codec_id == AV_CODEC_ID_H264 || avstream->codec->codec_id == AV_CODEC_ID_MPEG2VIDEO)) {
    float factor = (float)r_avg / (float)tb_avg;
    if ((factor > 0.4 && factor < 0.6) || (factor > 1.9 && factor < 2.1)) {
      pvi->AvgTimePerFrame = tb_avg;
    }
  }
r_avg - это значение из контейнера = 200000
tb_avg - это значение из видео-данных = 400000

как мы видим - в результате расчета присваивается значение из видео-потока.
AMD Ryzen 5 3600 /GIGABYTE B450 Gaming X /AMD Radeon R9 16Gb@3200 /Kingston 500Gb M.2 /GTX 1650 /Samsung U28R550UQI /OLED Philips 55OLED707 /Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

V0lt

Aleksoid1978
Одно дело точно знать, что поток интерлейсный и на основании этого делать какие-то выводы. Другое дело гадать на как ты предлагаешь.

Я уже раз 20 говорил, что значение fps в потоке может быть от балды. Главное значение в контейнере, либо непосредственно записанное, либо записанное через временные метки. Для интерлейса как бы получается дополнительный нюанс, тут надо подумать.

Повторюсь. Исходный файл у меня играет нормально, ничего не дергает, ничего не напрягается.

Aleksoid1978

AMD Ryzen 5 3600 /GIGABYTE B450 Gaming X /AMD Radeon R9 16Gb@3200 /Kingston 500Gb M.2 /GTX 1650 /Samsung U28R550UQI /OLED Philips 55OLED707 /Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

Aleksoid1978

Цитата: V0ltAleksoid1978
Одно дело точно знать, что поток интерлейсный и на основании этого делать какие-то выводы. Другое дело гадать на как ты предлагаешь.

Я уже раз 20 говорил, что значение fps в потоке может быть от балды. Главное значение в контейнере, либо непосредственно записанное, либо записанное через временные метки. Для интерлейса как бы получается дополнительный нюанс, тут надо подумать.

Повторюсь. Исходный файл у меня играет нормально, ничего не дергает, ничего не напрягается.
1 - Включи VSync и посмотри на значение fps :)
2 - В потоке (H.264/MPEG2/HEVC) в принципе не может быть значения от балды. Его может не быть - это да, но если оно там есть - то верное.
AMD Ryzen 5 3600 /GIGABYTE B450 Gaming X /AMD Radeon R9 16Gb@3200 /Kingston 500Gb M.2 /GTX 1650 /Samsung U28R550UQI /OLED Philips 55OLED707 /Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

V0lt

В 21-й раз объясняю. Взяли поток с камеры 60p. Замедлить до 24p и прикрутили спокойную музыку. Замедлили через параметры контейнера, без перекодировки. В итоге в контейнере правильные 24p, а в потоке левые 60p.

Еще бывает когда кодировали RAW данные стандартным скриптом (по умолчанию там обычно 25fps), а после упаковывали в контейнер с конкретным значением fps.
[merge_posts_bbcode]Добавлено: 2016-02-23 11:03:36[/merge_posts_bbcode]

Это сообщение ты похоже вообще читал.