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





Поскольку мы предполагаем, что PTS и DTS могут быть разными, я предполагаю, что вы хотите иметь дело с форматом, который содержит B-кадры как часть межкадрового формата, такого как H.264 (AVC) или аналогичный. Межкадровый формат сжимает различия между кадрами, а не весь кадр. Таким образом, обычно кадр P зависит от предыдущих кадров, а кадры B зависят от предыдущих и будущих кадров. Таким образом, вы не можете изменить порядок кодирования или передачи. Таким образом, невозможно кодировать несколько кадров параллельно, поскольку вам нужны ранее закодированные кадры для кодирования текущего кадра.
Если у вас есть сценарий VOD (не в прямом эфире), вы можете разделить входные данные на группы кадров (GOP) и кодировать несколько GOP параллельно.
Предположим, длина вашей GOP (настройка кодировщика) равна 10, и вы хотите запустить 3 параллельных кодирования. Затем вы можете параллельно закодировать кадры 0–9, 10–19 и 20–29, а затем повторно объединить фрагменты.
Речь идет не о декодировании, я спрашиваю, могу ли я предоставить кодировщику непоследовательные кадры, если я удостоверюсь, что их точки расположены в правильном порядке, я хочу, чтобы они были видны в
Если вас волнует, правильно ли воспроизводится/декодируется полученное видео, то нет, вы не можете писать не по порядку, как говорит Маркус.
Но точное кодирование/декодирование — не единственная проблема. Даже если вы использовали формат кадров внутрикадрового сжатия, такой как MJPEG, проигрыватели обрабатывают и выводят декодированный контент в том порядке, в котором он предоставляется декодером. Порядок декодирования каждого пакета и порядок представления не всегда совпадают, это правда, но, например, в ffmpeg/libav, когда вы вызываете avcodec_decode_video2, контекст сохраняет свое состояние по мере декодирования большего количества пакетов; как только данных будет достаточно для полных кадров, он предоставит их вам в том порядке, в котором вы должны их воспроизвести. Он не имеет ни малейшего представления или беспокойства о том, что в будущем могут появиться кадры, которые должны были отображаться раньше, чем тот, который он вам дает.
После декодирования кадры попадут в очередь воспроизведения. На этом этапе игрока обычно не волнует абсолютный PTS; для видео он будет использовать разницу PTS между текущим кадром и следующим кадром исключительно для определения того, как долго удерживать текущий кадр. Он не способен заглянуть вперед не больше, чем декодер (а если и умеет, то, конечно, не так далеко), чтобы увидеть, есть ли кадры, поступающие с более ранним PTS. А что касается аудио, он может полностью игнорировать PTS после начала воспроизведения и синхронизации видео и звука — или, если он действительно просматривает PTS, это будет исключительно для обработки пробела в дорожке. В любом случае, если игрок позже получит PTS, более ранний, чем текущий кадр, я ожидаю, что он либо отбросит его, либо выдаст ошибку из-за целочисленного переполнения.
Помните, что большинство этих форматов предназначены для ситуаций, когда произвольный доступ является дорогостоящим или невозможным (например, оптический или потоковый). Вот почему правильное чередование видео и аудио так важно, и большинство игроков задохнутся, если видеопоток хоть немного опережает звук, или наоборот. Уже одно это должно сказать вам, что ни один проигрыватель не сможет обрабатывать видеокадры, разбросанные по всему файлу не по порядку.
К вашему сведению, источник медиаплеера VLC демонстрирует почти все, что нужно знать о воспроизведении видео и ffmpeg/libav, и является моделью для изучения, если вы хотите знать, как работают плееры.
Если вам вообще нужен совет по производительности, вы можете и должны кодировать каждую дорожку в отдельном потоке с собственной очередью вывода, регулируя одну или другую, если она слишком сильно опережает другую, а третий поток записи выполняет всю работу. чередовать при записи на диск. Вы также можете сделать обратное на стороне чтения, всего 6 потоков. Но вам все равно придется делать это линейно по отношению к каждой дорожке; обойти это невозможно, если вы хотите, чтобы игра корректно воспроизводилась в любом стандартном проигрывателе.
У меня только один трек, поэтому совет по производительности в конце не применим. «У него нет ни малейшего представления или беспокойства о том, что в будущем могут появиться кадры, которые должны были отображаться раньше, чем тот, который он вам дает», хотя это имеет большой смысл, спасибо!
Между прочим, Firefox наконец-то исправил воспроизведение Youtube VP9, и причина заключалась в том, что Youtube записывает файлы VP9 со случайными неправильными выборками (как я и предлагал). Думаю, это показывает, как распространенные реализации справляются с этим — очень плохо.
Мультимедиа @Blindy вообще - это полное $@%шоу. Кстати, я подумал, что если видеофайлы, которые вы объединяете, имеют одинаковые параметры кодирования, вам вообще не нужно декодировать и перекодировать. Для видео после первого просто добавьте соответствующее смещение к каждому AVPacket dts/pts/pos и запишите его обратно. Кроме того, если вы сделали это очень осторожно, вы, вероятно, могли бы использовать нужную вам модель многопоточности - пакеты из более поздних видео просто нужно будет записать на диск с правильными смещениями. Сложно, но выполнимо.
Нет, в моем случае каждый кадр требует дополнительной обработки (покадровое кадрирование и масштабирование). Это настолько сложно, что мне пришлось изменить мою локальную сборку ffmpeg, чтобы разрешить то, что я пытаюсь сделать.
Я не уверен, что именно вы пытаетесь сделать? Объединить как?