[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任せで実現。
この方法は、正常に動画が作成される
まず準備
- ffmpegをダウンロードします
- 解凍したあと適当な位置に保存します
- 環境変数を追加します
ダウンロード
https://ffmpeg.org/



環境変数の設定(この画面に来るまでの操作は省略しました^^)

コード
#
# 参考サイト
# 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)
@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]