Сшивание видео с использованием открытого резюме

#python #opencv #video #opencv-stitching

Вопрос:

Я вижу вопросы и ответы по сшиванию изображений с помощью открытого резюме. Можно ли сшить видео с помощью открытого резюме. Специально используете Python? У меня установлен Pycharm с открытым CV, и я могу заставить его воспроизводить один записанный файл. Но было бы здорово заставить его прочитать два и сшить их вместе. Буду признателен, если кто-нибудь укажет мне на какие-либо учебные пособия, которые я еще не смог найти. Спасибо

Комментарии:

1. video обрабатывается как можно больше изображений/кадров, поэтому вы можете использовать CV с for циклом и input_stream.read() получать кадр за кадром, сшивать кадры в новый кадр и output_stream.write() записывать этот кадр в новый файл. Но иногда может быть проще использовать специализированные модули , такие как MoviePy , ffmpeg-python , Manim

Ответ №1:

Вы можете использовать OpenCV с for/while циклом для чтения кадра за кадром из двух видео, сшивания кадров в новом кадре (используя numpy — т. Е. hstack() ) и сохранения его в новом файле (также кадр за кадром)

Позже я создам пример.


Но может быть проще использовать специализированные модули, такие как MoviePy, ffmpeg-python или Manim.
Вероятно, все они используют программу ffmpeg, которая имеет множество функций и фильтров.


Пример с MoviePy — он создает массив с двумя фильмами в одной строке, но может создавать массив со многими строками и столбцами.

 from moviepy.editor import *

clip1 = VideoFileClip('input1.mp4')
clip2 = VideoFileClip('input2.mp4')
              
final_clip = clips_array([[clip1,clip2]])  # two videos in one row 

final_clip.write_videofile('output.mp4')
 

И два видео в одной колонке

 final_clip = clips_array([[clip1], [clip2]])  # two videos in one column
 

И массив видео 2х2

 final_clip = clips_array([[clip1, clip2], [clip3,clip4]])
 

Редактировать:

Код с. CV

Он длиннее и сложнее, но отображает видео.

 import cv2
import numpy as np

clip1 = cv2.VideoCapture('input1.mp4')
clip2 = cv2.VideoCapture('input2.mp4')

width  = clip1.get(cv2.CAP_PROP_FRAME_WIDTH)
height = clip1.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps    = clip1.get(cv2.CAP_PROP_FPS) 
print('fps:', fps)              

video_format = cv2.VideoWriter_fourcc(*'MP42')  # .avi 
final_clip   = cv2.VideoWriter('output.avi', video_format, fps, (int(width), int(height)))

delay = int(1000/fps)
print('delay:', delay)              

while True:

    ret1, frame1 = clip1.read()
    ret2, frame2 = clip1.read()    

    if not ret1 or not ret2:
        break
        
    final_frame = np.vstack([frame1, frame2])  # two videos in one row
    final_clip.write(final_frame)

    cv2.imshow('Video', final_frame)
    key = cv2.waitKey(delay) amp; 0xFF
    
    if key == 27:
        break
    
cv2.destroyWindow('Video')

clip1.release()
clip2.release()