if video_data.name.lower().endswith('.mov'):
# ファイル名と拡張子を分離
file_name_img, ext = os.path.splitext(video_file)
# 拡張子を '.jpg' に置換して新しいパスを作成
image_file = f"uploads/{user_id}/{file_name_img}.jpg"
if video_data is None:
return Response({"error": "ファイルが指定されていません。"}, status=status.HTTP_400_BAD_REQUEST)
# 一時ファイルにアップロードされた動画を保存
temp_video = tempfile.NamedTemporaryFile(delete=False, suffix=".mov")
for chunk in video_data.chunks():
temp_video.write(chunk)
temp_video.close()
try:
# VideoFileClip で最初の1コマを取得
video_clip = VideoFileClip(temp_video.name)
first_frame = video_clip.get_frame(0)
# 画像を一時ファイルに保存
temp_image = tempfile.NamedTemporaryFile(delete=False, suffix='.jpg')
temp_image_path = temp_image.name
temp_image.close()
print(temp_image_path)
# cv2.imwrite(temp_image_path, cv2.cvtColor(first_frame, cv2.COLOR_RGB2BGR))
# 画質を70に設定してJPEGとして保存(画質とファイルサイズのバランスを調整)
cv2.imwrite(temp_image_path, cv2.cvtColor(first_frame, cv2.COLOR_RGB2BGR), [cv2.IMWRITE_JPEG_QUALITY, 70])
# Cloud Storage に画像をアップロード
storage_client = storage.Client()
bucket = storage_client.bucket(settings.GS_BUCKET_NAME)
blob = bucket.blob(image_file)
blob.upload_from_filename(temp_image_path)
except Exception as e:
# エラーハンドリング
print(f"Error processing video: {e}")
return Response({"error": "動画処理中にエラーが発生しました。"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
finally:
# 一時ファイルをクリーンアップ
video_clip.close()
os.remove(temp_video.name)
os.remove(temp_image_path) # 画像ファイルも削除
if video_data.name.lower().endswith('.mp4'):
# ファイル名と拡張子を分離
file_name_img, ext = os.path.splitext(video_file)
# 拡張子を '.jpg' に置換して新しいパスを作成
image_file = f"uploads/{user_id}/{file_name_img}.jpg"
if video_data is None:
return Response({"error": "ファイルが指定されていません。"}, status=status.HTTP_400_BAD_REQUEST)
# 一時ファイルにアップロードされた動画を保存
temp_video = tempfile.NamedTemporaryFile(delete=False, suffix=".mp4")
for chunk in video_data.chunks():
temp_video.write(chunk)
temp_video.close()
try:
# VideoFileClip で最初の1コマを取得
video_clip = VideoFileClip(temp_video.name)
first_frame = video_clip.get_frame(0)
# 画像を一時ファイルに保存
temp_image = tempfile.NamedTemporaryFile(delete=False, suffix='.jpg')
temp_image_path = temp_image.name
temp_image.close()
print(temp_image_path)
# cv2.imwrite(temp_image_path, cv2.cvtColor(first_frame, cv2.COLOR_RGB2BGR))
# 画質を70に設定してJPEGとして保存(画質とファイルサイズのバランスを調整)
cv2.imwrite(temp_image_path, cv2.cvtColor(first_frame, cv2.COLOR_RGB2BGR), [cv2.IMWRITE_JPEG_QUALITY, 70])
# Cloud Storage に画像をアップロード
storage_client = storage.Client()
bucket = storage_client.bucket(settings.GS_BUCKET_NAME)
blob = bucket.blob(image_file)
blob.upload_from_filename(temp_image_path)
except Exception as e:
# エラーハンドリング
print(f"Error processing video: {e}")
return Response({"error": "動画処理中にエラーが発生しました。"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
finally:
# 一時ファイルをクリーンアップ
video_clip.close()
os.remove(temp_video.name)
os.remove(temp_image_path) # 画像ファイルも削除