HighLab

djnago アップロードされた動画からjpgを作成

  • 公開日:
  • 更新日:
  • 文字数:4494文字
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)  # 画像ファイルも削除