Объединение сэмплов из нескольких источников с использованием ffmpeg
1 Mrunal Gawade [2016-01-06 19:15:00]
Если у меня есть два видеоролика, снимающих один и тот же объект, но с разных ракурсов, а затем я хочу создать одно видео, но комбинация - это не просто конкатенация, а линейчатый образец, линейно от каждого из видео, чтобы создать одно и то же видео выходное видео линии, Является ли это возможным?
Например, если оба видео были сняты в течение 1 минуты каждый. затем, когда я совмещаю, я хочу объединить 0-15 секунд с 1-го, затем 15-30 секунд со второго, затем 30-45 с 1-го, затем 45-60 со второго видео. для создания 1-минутного видео.
Также в качестве общего случая, если это возможно, образец времени не должен быть равномерно распределенным, но случайным от каждого видео, если общие клипы добавляют до первоначального времени съемки.
В качестве более общего случая, если это возможно, расширяя его до более чем двух источников видео, можно сказать, что три видеоролика объединены вышеприведенным образом в случайных клипах времени для создания одного видео.
большое спасибо Муннал
ffmpeg video
2 ответа
1 Решение incBrain [2016-01-07 02:32:00]
Вы можете сделать это, разделив вашу проблему на три подзадачи:
- Создайте 15-секундные фрагменты каждого видео.
вы можете сделать это следующим образом:
ffmpeg -y -i vid1.mp4 -vcodec copy -ss 00:00:00 -t 00:00:15 vid1_chunk_0.mp4
ffmpeg -y -i vid1.mp4 -vcodec copy -ss 00:00:15 -t 00:00:15 vid1_chunk_1.mp4
...
- Создайте простой текстовый файл со всеми кусками в желаемом порядке, как описано здесь.
Этот файл (назовем его list.txt) должен выглядеть так:
file '/path/to/vid1_chunk_0.mp4'
file '/path/to/vid2_chunk_1.mp4'
file '/path/to/vid1_chunk_2.mp4'
...
- Объединить с помощью:
ffmpeg -y -f concat -i list.txt -c copy final.mp4
Вот пример скрипта python:
import os
def sec2hms(seconds):
m, s = divmod(seconds, 60)
h, m = divmod(m, 60)
return "%02d:%02d:%02d" % (h, m, s)
def createchunks(video, vid_dur, chunk_dur):
chunks = list()
for n in range(0, vid_dur / chunk_dur):
cmd = 'ffmpeg -y -v quiet'
cmd += ' -i ' + video
cmd += ' -vcodec copy'
cmd += ' -ss ' + sec2hms(n*chunk_dur)
cmd += ' -t ' + sec2hms(chunk_dur)
cmd += ' ' + video[:-4] + '_chunk_' + str(n) + '.mp4'
print cmd
os.system(cmd)
chunks.append(video[:-4] + '_chunk_' + str(n) + '.mp4')
return chunks
# step 1. create 15 sec. chunks of first 60 sec. of content
vid1_chunks = createchunks('vid1.mp4', 60, 15)
vid2_chunks = createchunks('vid2.mp4', 60, 15)
# step 2. create a list.txt file (alternating order)
filenames = [None] * len(vid1_chunks)
filenames[::2] = vid1_chunks[::2]
filenames[1::2] = vid2_chunks[1::2]
with open('list.txt', 'w') as listfile:
for fname in filenames:
listfile.write('file \'' + fname + '\'\n')
# step 3. concatenate
cmd = 'ffmpeg -y -v quiet -f concat -i list.txt -c copy final.mp4'
os.system(cmd)
1 Gyan [2016-01-07 22:06:00]
Если точность кадра не важна, вы можете сделать это в два этапа, пропуская создание куска.
Создать конкат-лист
file 'video1.mp4'
inpoint 0
outpoint 15
file 'video2.mp4'
inpoint 15
outpoint 30
file 'video1.mp4'
inpoint 30
outpoint 45
file 'video2.mp4'
inpoint 45
outpoint 60
(fill out the text file in this manner...)
Запустить concat
ffmpeg -y -f concat -i list.txt -c copy final.mp4