Можете ли вы написать видеофайл с неупорядоченными (входными) кадрами?

Я знаю, что видеофайлы могут содержать (и содержат) кадры, закодированные не по порядку, поэтому существуют dts и pts, но можете ли вы отправлять кадры в произвольном порядке с правильными точками и ожидать, что видеофайл будет воспроизводиться?

В частности, меня интересует объединение видеофайлов, могу ли я декодировать оба входа параллельно и отправлять кадры с правильными объединенными точками по мере их декодирования? И если да, то каковы будут последствия для производительности воспроизведения?

Я не уверен, что именно вы пытаетесь сделать? Объединить как?

Andrey Turkin 11.06.2024 17:46

Поскольку, как написано, речь не идет о программировании, вы с большей вероятностью получите ответ (как предложено в справке по тегу ffmpeg ) в Видеопроизводстве или Суперпользователе. Однако перед публикацией обязательно найдите существующие похожие вопросы и проверьте их справку. Спасибо!

NotTheDr01ds 15.07.2024 23:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
71
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Поскольку мы предполагаем, что PTS и DTS могут быть разными, я предполагаю, что вы хотите иметь дело с форматом, который содержит B-кадры как часть межкадрового формата, такого как H.264 (AVC) или аналогичный. Межкадровый формат сжимает различия между кадрами, а не весь кадр. Таким образом, обычно кадр P зависит от предыдущих кадров, а кадры B зависят от предыдущих и будущих кадров. Таким образом, вы не можете изменить порядок кодирования или передачи. Таким образом, невозможно кодировать несколько кадров параллельно, поскольку вам нужны ранее закодированные кадры для кодирования текущего кадра.

Если у вас есть сценарий VOD (не в прямом эфире), вы можете разделить входные данные на группы кадров (GOP) и кодировать несколько GOP параллельно.

Предположим, длина вашей GOP (настройка кодировщика) равна 10, и вы хотите запустить 3 параллельных кодирования. Затем вы можете параллельно закодировать кадры 0–9, 10–19 и 20–29, а затем повторно объединить фрагменты.

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

Blindy 12.06.2024 00:31
Ответ принят как подходящий

Если вас волнует, правильно ли воспроизводится/декодируется полученное видео, то нет, вы не можете писать не по порядку, как говорит Маркус.

Но точное кодирование/декодирование — не единственная проблема. Даже если вы использовали формат кадров внутрикадрового сжатия, такой как MJPEG, проигрыватели обрабатывают и выводят декодированный контент в том порядке, в котором он предоставляется декодером. Порядок декодирования каждого пакета и порядок представления не всегда совпадают, это правда, но, например, в ffmpeg/libav, когда вы вызываете avcodec_decode_video2, контекст сохраняет свое состояние по мере декодирования большего количества пакетов; как только данных будет достаточно для полных кадров, он предоставит их вам в том порядке, в котором вы должны их воспроизвести. Он не имеет ни малейшего представления или беспокойства о том, что в будущем могут появиться кадры, которые должны были отображаться раньше, чем тот, который он вам дает.

После декодирования кадры попадут в очередь воспроизведения. На этом этапе игрока обычно не волнует абсолютный PTS; для видео он будет использовать разницу PTS между текущим кадром и следующим кадром исключительно для определения того, как долго удерживать текущий кадр. Он не способен заглянуть вперед не больше, чем декодер (а если и умеет, то, конечно, не так далеко), чтобы увидеть, есть ли кадры, поступающие с более ранним PTS. А что касается аудио, он может полностью игнорировать PTS после начала воспроизведения и синхронизации видео и звука — или, если он действительно просматривает PTS, это будет исключительно для обработки пробела в дорожке. В любом случае, если игрок позже получит PTS, более ранний, чем текущий кадр, я ожидаю, что он либо отбросит его, либо выдаст ошибку из-за целочисленного переполнения.

Помните, что большинство этих форматов предназначены для ситуаций, когда произвольный доступ является дорогостоящим или невозможным (например, оптический или потоковый). Вот почему правильное чередование видео и аудио так важно, и большинство игроков задохнутся, если видеопоток хоть немного опережает звук, или наоборот. Уже одно это должно сказать вам, что ни один проигрыватель не сможет обрабатывать видеокадры, разбросанные по всему файлу не по порядку.

К вашему сведению, источник медиаплеера VLC демонстрирует почти все, что нужно знать о воспроизведении видео и ffmpeg/libav, и является моделью для изучения, если вы хотите знать, как работают плееры.

Если вам вообще нужен совет по производительности, вы можете и должны кодировать каждую дорожку в отдельном потоке с собственной очередью вывода, регулируя одну или другую, если она слишком сильно опережает другую, а третий поток записи выполняет всю работу. чередовать при записи на диск. Вы также можете сделать обратное на стороне чтения, всего 6 потоков. Но вам все равно придется делать это линейно по отношению к каждой дорожке; обойти это невозможно, если вы хотите, чтобы игра корректно воспроизводилась в любом стандартном проигрывателе.

У меня только один трек, поэтому совет по производительности в конце не применим. «У него нет ни малейшего представления или беспокойства о том, что в будущем могут появиться кадры, которые должны были отображаться раньше, чем тот, который он вам дает», хотя это имеет большой смысл, спасибо!

Blindy 15.06.2024 00:26

Между прочим, Firefox наконец-то исправил воспроизведение Youtube VP9, и причина заключалась в том, что Youtube записывает файлы VP9 со случайными неправильными выборками (как я и предлагал). Думаю, это показывает, как распространенные реализации справляются с этим — очень плохо.

Blindy 19.06.2024 17:04

Мультимедиа @Blindy вообще - это полное $@%шоу. Кстати, я подумал, что если видеофайлы, которые вы объединяете, имеют одинаковые параметры кодирования, вам вообще не нужно декодировать и перекодировать. Для видео после первого просто добавьте соответствующее смещение к каждому AVPacket dts/pts/pos и запишите его обратно. Кроме того, если вы сделали это очень осторожно, вы, вероятно, могли бы использовать нужную вам модель многопоточности - пакеты из более поздних видео просто нужно будет записать на диск с правильными смещениями. Сложно, но выполнимо.

Emperor Eto 19.06.2024 17:22

Нет, в моем случае каждый кадр требует дополнительной обработки (покадровое кадрирование и масштабирование). Это настолько сложно, что мне пришлось изменить мою локальную сборку ffmpeg, чтобы разрешить то, что я пытаюсь сделать.

Blindy 19.06.2024 17:53

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