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

2104
bertieb

Я хочу присоединиться к набору видеоклипов (со звуком), используя несколько коротких переходов (в идеале кроссфейд), простым, автоматизированным и эффективным способом.

IE:

ClipA ---> ClipB --> ClipC --> ClipD [aaaaaaaa][bbbbbbbb][cccccccc][dddddddd] (--> indicate crossfades, not to scale!) 

Чтобы уточнить:

  • по прямой, в идеале было бы включать использование «стандартных» инструментов (то есть те, которые я уже знаком с такими ffmpeg, но менее известные инструменты, как, meltбезусловно, право, и я готов исследовать новые горизонты, как MoviePy)
  • под автоматизированным я подразумеваю что-то, что может быть параметризовано и помещено в скрипт python/ shell/ etc
  • под эффективным я имею в виду быстрое кодирование или минимизацию перекодирования

В настоящее время я использую pythonи ffmpegдля того, чтобы нарезать видеофайл уже в Matroska / h264 / aac, используя параметр потокового копирования ( очень быстро ) на основе временных кодов в текстовом файле. Затем meltпоследовательно зацепляют эти клипы один за другим, используя короткие переходы яркости (кроссфейд) ( очень медленные из-за перекодирования всей последовательности ).

Мне кажется, что из этих длинных видеоклипов нужно обработать и перекодировать всего несколько секунд - сами переходы. Остальное можно скопировать. Есть ли уже существующий / интуитивный способ сделать это? Мой наивный подход состоял бы в том, чтобы дополнительно нарезать клипы на подклипы, используя meltдля создания переходов, и используя concatфильтр, чтобы склеить беспорядок.

Например:

ClipA1 ClipA2 ClipB1 ClipB2 ClipB3 ClipC1 ClipC2 ClipC3 ClipD1 Clip D2 [aaaaaaa] + [a][b] + [bbbbbb] + [b][c] + [cccccc] + [c][d] + [ddddddd] (+ indicates concat-ing of subclips; [x][y] indicates a short xfade from x to y) 

Тем не менее, я не тороплюсь списывать со счетов то, что может быть дураком, поскольку я ожидаю melt/ ffmpegсвязал с этим ошибки, связанные с синхронизацией сокращений и синхронизацией звука; и я не хочу пропустить разделы видео или аудио из-за размещения I-кадра или что там у вас. Плюс ко всему, у меня такое чувство, что я не первый, кто сталкивается с этим, поэтому мне любопытно, как эти умнее, чем я, решили это - мои решения имеют тенденцию к наивности, как я говорю!

Надеюсь, это было ясно. Ура за чтение и заранее спасибо!


Для контекста, я намерен превратить неотредактированное видео в прямом эфире из видеоигры в интересное / «полезное» видео; это исключает скучную загрузку, сортировку проблем с подключением и т. д. Но также можно выделить основные моменты - монтаж для демонстрации прогресса. Поскольку это то, что теоретически будет появляться каждый раз, когда появляются новые кадры, я очень заинтересован в том, чтобы сделать это наиболее эффективным (упреждающе ленивым) способом.

1
Я думаю, что [это] (http://stackoverflow.com/questions/30395469/ffmpeg-audio-crossfade) - это то, что вы ищете. Но все же он обрабатывает все видео. Chamath 8 лет назад 0
@Chamath спасибо за это - да, это влечет за собой перекодирование, но на самом деле это может стать частью решения; см. связанный вопрос, который я задал: http://superuser.com/questions/931969/creating-videos-for-ffmpegs-concat-demuxer-to-avoid-a-large-re-encode bertieb 8 лет назад 0

1 ответ на вопрос

2
Zulko

У меня не было времени на его тестирование, но это должно сработать, если вы хотите использовать MoviePy:

from moviepy.editor import *  clips = [ VideoFileClip("vid1.mp4"), VideoFileClip("vid2.mp4"), VideoFileClip("vid3.mp4"), ... ]   fade_duration = 1 # 1-second fade-in for each clip clips = [clip.crossfadein(fade_duration) for clip in clips]  final_clip = concatenate_videoclips(clips, padding = -fade_duration)  # You can write any format, in any quality. final_clip.write_videofile("final.mp4", bitrate="5000k") 
Поскольку я незнаком с MoviePy, это очень полезно, спасибо! Однако, к сожалению, он подвергается транскодированию по всей продолжительности видео; Попытка с 2 клипами дает прогнозируемую длительность кодирования ~ 2 часа. Это неизбежно или я неправильно использовал ваш пример кода? bertieb 8 лет назад 0

Похожие вопросы