Как эффективно и автоматически объединять видеоклипы, используя короткие переходы?
2133
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-кадра или что там у вас. Плюс ко всему, у меня такое чувство, что я не первый, кто сталкивается с этим, поэтому мне любопытно, как эти умнее, чем я, решили это - мои решения имеют тенденцию к наивности, как я говорю!
Надеюсь, это было ясно. Ура за чтение и заранее спасибо!
Для контекста, я намерен превратить неотредактированное видео в прямом эфире из видеоигры в интересное / «полезное» видео; это исключает скучную загрузку, сортировку проблем с подключением и т. д. Но также можно выделить основные моменты - монтаж для демонстрации прогресса. Поскольку это то, что теоретически будет появляться каждый раз, когда появляются новые кадры, я очень заинтересован в том, чтобы сделать это наиболее эффективным (упреждающе ленивым) способом.
Я думаю, что [это] (http://stackoverflow.com/questions/30395469/ffmpeg-audio-crossfade) - это то, что вы ищете. Но все же он обрабатывает все видео.
Chamath 9 лет назад
0
@Chamath спасибо за это - да, это влечет за собой перекодирование, но на самом деле это может стать частью решения; см. связанный вопрос, который я задал: http://superuser.com/questions/931969/creating-videos-for-ffmpegs-concat-demuxer-to-avoid-a-large-re-encode
bertieb 9 лет назад
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 9 лет назад
0