適当なファイル名をつけて動画を貯めていたら、中身が何か分からなくなり、全て確認するのも面倒で削除もできない状況に陥ってしまいました。ここでは、特定のディレクトリに置かれた動画ファイルを読み込んで、5分毎にサムネールを切り出し、一覧にしたHTMLファイルを生成するプログラムを紹介します。
プログラム
pythonで以下のコードを作成しました。
import cv2
import os
from moviepy.editor import VideoFileClip
def generate_html(images_list, output_html_path):
with open(output_html_path, 'w') as f:
f.write('<html><body><table>\n')
for vid_name, image_paths in images_list:
f.write(f'<tr><td>{vid_name}</td>')
for img_path in image_paths:
f.write(f'<td><img src="{img_path}" width="256"></td>')
f.write('</tr>\n')
f.write('</table></body></html>')
def capture_frames(video_path, output_dir, interval=300):
cap = cv2.VideoCapture(video_path)
fps = cap.get(cv2.CAP_PROP_FPS)
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
filename = os.path.basename(video_path)
basename, _ = os.path.splitext(filename)
os.makedirs(output_dir, exist_ok=True)
img_paths = []
for i in range(0, total_frames, int(fps * interval)):
cap.set(cv2.CAP_PROP_POS_FRAMES, i)
ret, frame = cap.read()
if ret:
img_path = os.path.join(output_dir, f'{basename}_frame_{i}.jpg')
cv2.imwrite(img_path, frame)
img_paths.append(img_path)
cap.release()
return img_paths
def main(video_folder, output_folder):
video_extensions = ('.mp4', 'MP4', '.mov')
videos = [os.path.join(video_folder, f) for f in sorted(os.listdir(video_folder)) if f.endswith(video_extensions)]
images_list = []
for video in videos:
video_name = os.path.basename(video)
output_dir = os.path.join(output_folder, os.path.splitext(video_name)[0])
image_paths = capture_frames(video, output_dir)
images_list.append((video_name, image_paths))
generate_html(images_list, os.path.join(output_folder, 'index.html'))
if __name__ == "__main__":
main('Path_to_MovieDir', 'Path_to_HTMLDir')
使い方
あらかじめPythonが使える環境を準備します。Anacondaがどの環境でもインストールしやすくて便利です。
実行に必要なライブラリをインストールします。
conda install -c conda-forge opencv moviepy
一番最後の行にある’Path_to_MovieDir’の部分を動画ファイルが置いてあるディレクトリのパスに、’Path_to_HTMLDir’の部分をHTMLファイルを生成するディレクトリのパスに変更します。