Нет, мне нужно обмануть телек! Он не берёт 1920х1080 50Гц, поскольку он читает из меты: Частота кадров - Constant, но читает, если Variable и проигрывает. 720HD 50Гц берёт и проигрывает. Поэтому цель - подменить в мете Constant на Variable.
=0 сбрасывает флаг, так что эта операция делает как раз то, что требуется. Но она обрабатывает видеопоток. Возможно, у тебя телек больше верит метаданным контейнера.
В таком случае попробуй перегнать из mp4 в mkv. В метаданных mkv нет понятия fps вообще, так что mp4→mkv→mp4 по идее должен сбросить флаг в контейнере, если он там установлен.
Не, я уже давно перепробовал все комбинации, бестолку! Но недавно попался один поток, я его стал писать. Если кладу в ts, телек не берёт, кладу в mkv или mp4 берёт. В чём же разница? Стал исследовать. МедиаИнфа даёт следущее: В неработающем ts просто, частота кадров = 30.000 FPS.
Не, я уже давно перепробовал все комбинации, бестолку!
У меня был под рукой MP4 файл, в котором mediainfo показывало constant frame rate. Перегнал его в mkv и обратно, и стало variable frame rate. Так что если этот способ не работает, возможно дело не в CFR/VFR.
Если кладу в ts, телек не берёт, кладу в mkv или mp4 берёт.
Если уже есть рабочее решение, зачем мучаться? Если нет, имеет смысл расковыривать прошивку телевизора. Скорее всего, ответы там.
Выяснилось, что mediainfo эвристиками определяет, постоянная частота кадров в видео или нет, перебирая метаданные, которые ищет вдоль всего файла. Наверное, эту эвристику как-то можно обмануть, прикрепив в начало видео пару stts с дико отличающимися длительностями кадров, но я плохо представляю, как это сделать.
Трюк с преобразованием в mkv и обратно в mp4 не даёт никакого результата. В файле два stts. Видимо, один для видео и один для аудио. По этому набору любой парсер довольно свободно определит, что частота постоянная.
Не выходит, говоришь, цветок? Ещё не вечер! Благодарю за попытку. Давненько было... Решил проделать трюк - изменять экранный размер видео без его ре-кодирования, используя финт масштабирования. Телек умеет масштабировать, но не так как надо, да и не будешь под разные видео масштабировать сам телек. С десяток спецов мне твердили в разной форме, что без ре-кодирования нельзя изменить. Это были только похожие на спецов. Оказалось, что можно разные по размеру видео подогнать к нужному. Нашёл, что есть такая программа для ПК, которого у меня не было. Действительно, если умеет МедиаИнфа читать мету, почему не сделать, чтобы она и писала мету? И делать её не надо. Кто пишет мету при кодировании? FFmpeg! Если он её пишет, значит и переписать может? Взял как-то раз HEX редактор и залез им в видео-файл с целью удалить библиотеку кодироаания. Может не удалить, а хотябы она была не видна МедиаИнфе. Получилось легко. Конечно, разобраться где там данные о рамере - чёрт ногу сломит! Но найти где и изменить Constant на Variable реально! Конечно опытному прогеру. Эти, как и данные размера и аспекта - всего лишь руководство для видео-проигрывателя...
Кто пишет мету при кодировании? FFmpeg! Если он её пишет, значит и переписать может?
Я выше объяснял, там всё сложнее. Некоторые свойства видеофайлов не записаны явно, они вычисляются. Как например, всегда можно посчитать контрольную сумму по алгоритму sha256, но довольно сложно изменить файл так, чтобы его контрольная сумма стала равной некому другому заданному значению. С VFR/CFR в контейнере MP4 всё не так нереально, как в случае с sha256. И я уже описал, как этот трюк можно провернуть.
Но найти где и изменить Constant на Variable реально!
Эм… нет. Это свойство вычисляется на основе информации о длительностях видеокадров по всему файлу.
К сожалению, не при каком расскладе телек не берёт, пишет «50Гц не поддерживается», почему-то не добавляя, что при 1920х1080. 1280х720 50Гц он прекрасно проигрывает. Телек читает оригинальную частоту кадров: Frame rate mode : Variable Original frame rate : 50.000 FPS Если бы было не Original frame rate, а просто Frame rate, тогда, думаю, телек взял бы. Припоминаю эксперименты по изменению аспекта. Новый внесённый аспект значился в Медиаинфе, но была ниже строка аналогичная -Original aspect, и телек читал этот, а не внесённый. Я бесспорно не спец, но определённо считаю, что мету пишет ffmpeg, он же её может и изменить. Я часто пользуюсь живой ретрансляцией телеканалов с ре-кодированием, т.е. вживую меняю размер, частоту кадров с 50 на 25Гц, быает с деинтерлейсом. Значит, в начале ретрансляции ffmpeg сразу вбивает в мету изменения, и телек эти изменения размера и прочего читает и берет в исполнение.
Значение «Original frame rate» достаётся из упакованного блока с данными. Наверняка есть какой-то простой способ достать эти данные, изменить значение и упаковать данные обратно, но я про него не знаю. Заниматься декодированием руками это уж слишком муторно. Есть шанс, что размер блока изменится, и нужно будет пересчитывать все остальные блоки.
мету пишет ffmpeg, он же её может и изменить
Первая часть верна (с оговорками), вторая может быть не верна. Я бы ожидал от FFmpeg создания на выходе согласованных файлов. Поэтому создавать согласованные файлы будет, скорее всего, просто, а вот делать какие-то странные правки, скорее всего, сложно. FFmpeg битком набит всякими фильтрами и встроенными утилитами, какие-то из которых могут подойти; но вот найти там нужные рычажки — тот ещё квест.
А в довершение ко всему, ещё неизвестно, что твоему телеку не нравится. И вполне возможно, что в пересчёте на потраченное на разбирательства время будет дешевле купить либо новый телек без заморочек, либо медиа-приставку к телеку.
У меня в рассмотренном вопросе острой проблемы нет. Задал его в надежде, что слишком трудного решения нет. Поток(датский телеканал), фрагмент которого мы курочили, смотрю ре-кодируя вживую в 25Гц - и вся проблема. Понятно, что 50Гц и 25Гц существенная разница для динамичного, мелко-элементного изображения. У меня телек - беспроводной монитор, благодаря ffmpeg'у, много кодирую, ретранслирую с правками и проч. Приходится делать много корректирующих дублей. Сделал корректирующую правку в ffmpeg'е - через 2-3 секунды очередная правка на большом экране. До 20-30 дублей порой приходится делать, особенно, когда меняешь звуковую дорожку. Ввести в музыкальный синхрон новую, не так уж и просто. Беру с дюжину геоблокированных телеканалов - пользую VPN.(подопытный файл также с геоблокирофванного). Пользую потоки Mpeg-Dash. Вещатели телеканалов постепенно стали его использовать, пока наряду с HLS. Так что, ffmpeg для меня незаменим! Ни о какой(пока, не исключаю) приставке и речи не может быть! Менять телек рано. Оледы, пока горят!(остаточное изображение). Кстати, тебе приходилось или уже пользуешь Mpeg-Dash потоки? Мне удалось организовать, чтобы мой ffmpeg был собран и заработал с таким форматом. Но есть и проблемы, пока нерешаемые ввиду отсутствия опыта и невостребованности у спецов. Библиотека в ffmpeg'е, отвечающая за работу с Mpeg-Dash, кривая! Констатирую это точно. Есть пару проигрывателей, тестовых, которые с этими потоками работают исключительно хорошо. Их работа не основана на ffmpeg'е! Но мне нужен только ffmpeg!