OpenCV를 사용하여 긴 동영상을 일부만 저장하는 방법

계기



구후 / 증식계 YouTuber「NHK」로 늘어나 「부수다」로 배가 되는 타치바나 타카시 에 sync했습니다
딱 좋은 동영상 소재로, 영역 분할·얼굴 인식·테롭을 지우려면···등등 뭔가에서 opencv로 할 수 있을 것 같습니다.
이 동영상은 18분 있습니다만 후보자가 등장하는 서두의 1분만을 사용하고 싶습니다.
그래서 일부만 시간별로 추출하는 방법을 python과 OpenCV에서만 해보겠습니다.

원소재


  • NHK를 파괴한다! 【마사미 방송】 NHK로부터 국민을 지키는 당 【타치바나 타카시 외 3명】 전국 비례구

  • NHKをぶっ壊す!【政見放送】 NHKから国民を守る党【立花 孝志他3名】全国比例区

    방법


  • 원본 동영상에서 fps (초당 프레임 수) 추출
  • 開始時間 * fps or 終了時間 * fps 에서 프레임 수 계산
  • time.time() 로 계측하려고 했습니다만 프레임수 베이스로 제어하는 ​​것이 성공했습니다.

    또한 候補者が登場する冒頭の1分 그래서
  • 시작 시간 = 30초
  • 종료 시간 = 90초

  • 했다.

    개발


    import cv2
    
    if __name__ == '__main__':
    
        cap = cv2.VideoCapture('drop_out_nhk.mp4')
    
        cap_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
        cap_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
        fps = cap.get(cv2.CAP_PROP_FPS)
    
        fourcc = cv2.VideoWriter_fourcc('m','p','4','v')
        writer = cv2.VideoWriter('one_minutes.mp4',fourcc, fps, (cap_width, cap_height))
    
        # 抽出したい開始or終了時間
        begin = 30
        end = 90
    
        for i in range(end * fps):
            ret, frame = cap.read()
            if ret:
                if begin * fps < i:
                    writer.write(frame)
    
        writer.release()
        cap.release()
    

    결과



    아마 이것으로 정확히 1분이 되었다고 생각합니다.



    결론


    asyncio 라든지 사용하려고 생각했습니다만, 꽤 실용적으로 구현할 수 있었습니다. 이미지 크기를 변경하면 왠지 코덱으로 실수합니다.

    참고로 한 링크


  • OpenCV-Python 파일에서 동영상 로드
  • OpenCV - VideoCapture / VideoWriter로 동영상을 읽고 씁니다.
  • 좋은 웹페이지 즐겨찾기