Я пишу программу, которая должна иметь возможность поместить очень короткий медиафайл в середину более длинного медиафайла. Я хочу использовать для этого ffmpeg. Я знаю, что можно разделить длинный файл пополам, а затем объединить 3 файла вместе (первая половина длинного видео > короткое видео > вторая половина длинного видео). Я пробовал сделать это с помощью фильтра concat, но это занимает очень много времени, так как наш управляемый поставщик Kubernetes не имеет возможности использовать ресурсы GPU.
Я понял, что поскольку первый и последний клипы всегда будут в одном и том же формате (так как они были разделены из одного и того же исходного файла), я мог бы просто преобразовать только средний очень короткий клип, чтобы он соответствовал двум половинам. Тогда все 3 клипа будут в этом формате, и я мог бы просто использовать concat remuxer.
Короткий клип также был сгенерирован ffmpeg путем повторного зацикливания одного и того же кадра поверх аудиоклипа. Поэтому, если моя идея осуществима, ffmpeg придется перекодировать только аудио и один зацикленный кадр. Намного лучше, чем перекодировать весь длинный клип и короткий клип с нуля.
Как заставить ffmpeg перекодировать видео для соответствия другомуточночтобы я мог объединить их вместе?
решение1
Как указал @Rotem в комментариях, вы можете проанализировать свойства исходного видео с помощью ffprobe
надлежащего сценария, но этого (вероятно) недостаточно.
Правильное нарезание видеопотока по произвольным временным меткам без транскодирования всего потока невозможно (по крайней мере с ffmpeg), вы можете сделать это только на границах ключевых кадров. Поэтому вам придется также проанализировать положение ключевых кадров и выбрать временные метки для нарезки в соответствии с этим (см. эту тему для этого:Как получить временную метку ближайшего ключевого кадра перед заданной временной меткой с помощью FFmpeg?)