[Python] 動画ファイルを分割してみる

こんにちは、@yasuです。

動画ファイルを分割してみたいと思います。

方法1

opencvにより実現
以下のコードは、動画が作成されるが、音声がなくなる。原因はわからず。

準備

  • cv2インストール
    pip install opencv-python

コード

#
# 参考サイト
# https://qiita.com/satsukiya/items/9647e20c4e27b3d0362a
# https://dev.to/seijind/how-to-download-youtube-videos-in-python-44od

import cv2

if __name__ == '__main__':

    cap = cv2.VideoCapture('./download/video.mp4')

    cap_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    cap_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    fps = int(cap.get(cv2.CAP_PROP_FPS))

    fourcc = cv2.VideoWriter_fourcc('m','p','4','v')

    writer = cv2.VideoWriter('./download/output.mp4',fourcc, fps, (cap_width, cap_height))

    # 抽出したい開始or終了時間
    begin = 0
    end = 10

    for i in range(end * fps):
        ret, frame = cap.read()
        if ret:
            if begin * fps < i:
                writer.write(frame)

    writer.release()
    cap.release()

方法2

Pythonというよりは、ほとんどffmpeg任せで実現。
この方法は、正常に動画が作成される

まず準備

  1. ffmpegをダウンロードします
  2. 解凍したあと適当な位置に保存します
  3. 環境変数を追加します

ダウンロード
https://ffmpeg.org/
image.png
image.png
image.png
環境変数の設定(この画面に来るまでの操作は省略しました^^)
image.png

コード

#
# 参考サイト
# https://gist.github.com/georgechalhoub/e9c1c50507f651c8af90c5f40e8376c7

import os

def runBash(command):
    os.system(command)

def crop(start,end,input,output):
    str = "ffmpeg -i " + input + " -ss  " + start + " -to " + end + " -c copy " + output
    print (str)
    runBash(str)

crop("00:00:09","00:00:12","./download/video.mp4","./download/cut.mp4")

方法3

moviepyにより実現
この方法は、正常に動画が作成される

準備

  • moviepyインストール
    pip install moviepy

コード

# 
# 参考サイト
# https://chacha95.github.io/2019-10-24-Movipy/
# 
from moviepy.editor import VideoFileClip, concatenate_videoclips

clip1 = VideoFileClip("./download/video.mp4").subclip(150,238)
#clip2 = VideoFileClip("./download/video.mp4").subclip(480+41,480+44)

# # subclip을 이용해 정해진 시간 초 내의 frame만 불러옵니다.
# clip2 = VideoFileClip("myvideo2.mp4").subclip(50,60)
# clip3 = VideoFileClip("myvideo3.mp4")
# concat함수를 이용해 비디오를 합쳐줍니다.

#final_clip = concatenate_videoclips([clip1,clip2])
final_clip = concatenate_videoclips([clip1])


#動画をファイルに書き込む場合
final_clip.write_videofile("./download/cut.mp4")

#GIF動画をファイルに書き込む場合
#final_clip.write_gif("./download/cut.gif",fps=final_clip.fps/20)

#写真を複数ファイルに書き込む場合
#final_clip.write_images_sequence("./download/sequence/frame%04d.jpeg", fps=final_clip.fps/10)

Sort:  

@yasu transfered 0.5 KRWP to @krwp.burn. voting percent : 6.57%, voting power : 61.63%, steem power : 1929041.33, STU KRW : 1200.
@yasu staking status : 250 KRWP
@yasu limit for KRWP voting service : 0.5 KRWP (rate : 0.002)
What you sent : 0.5 KRWP [47372770 - 663e6ccc998e16f8aeba4b6269d57aa98a6dff29]

Coin Marketplace

STEEM 0.04
TRX 0.33
JST 0.083
BTC 64024.67
ETH 1722.07
USDT 1.00
SBD 0.42