캡스톤 프로젝트 일지#6

김호준·2021년 5월 25일
0

캡스톤 프로젝트

목록 보기
5/6

이번주 주는 내게는 미지의 영역이였던 비디오 관련 로직을 이해하고 코드를 짰다.

자잘한 코드 수정이 있었지만 이번주 한 일은 크게 3가지로 나눌 수 있을거 같다.

이번주 한 일

  1. 비디오에서 썸네일 추출하기
  2. S3 업로더 만들기
  3. 비디오 분할해서 S3에 저장하기

1. 비디오에서 썸네일 추출하기

현재 비디오 관련 로직에서 FFmpeg를 쓰고있으므로, FFmpeg를 이용해 썸네일을 추출했다.

http://blog.naver.com/ksw6169/221546693446
이 블로그를 참고하여 거의 똑같이 만들었고, UUID를 붙여서 업로드 하도록 만들었다.

2. S3 업로더 만들기

팀원분이 AWS에 EC2, RDS, S3를 구축해주셔서 드디어 로컬이 아닌 S3에 업로드가 가능해졌다.
https://devlog-wjdrbs96.tistory.com/213
이 블로그를 참고해 S3 업로더를 구현하였다.

여러 상황에 쓰일 수 있도록 메소드를 오버라이딩 했다.

    public String upload(MultipartFile file, String s3SavePath) throws IOException {
        return upload(file,file.getOriginalFilename(),s3SavePath);
    }

    public String upload(MultipartFile file, String customFileName, String s3SavePath) throws IOException {
        s3SavePath = s3SavePath + "/" + customFileName;
        s3Client.putObject(new PutObjectRequest(bucket, s3SavePath, file.getInputStream(), null)
                .withCannedAcl(CannedAccessControlList.PublicRead));
        return s3Client.getUrl(bucket, s3SavePath).toString();
    }

    public String upload(String filePath, String fileName, String s3SavePath) throws IOException {
        File file = new File(filePath);
        s3SavePath = s3SavePath + "/" + fileName;
        s3Client.putObject(new PutObjectRequest(bucket, s3SavePath, file)
                .withCannedAcl(CannedAccessControlList.PublicRead));
        return s3Client.getUrl(bucket, s3SavePath).toString();
    }

3.비디오 분할해서 S3에 저장하기

우선 비디오를 분할하는 이유는 딥러닝 서버에서 빠르게 동영상을 분석하게 하기 위함이다.
현재 분석속도가 영상길이의 15배정도로 꽤 오래걸려서 여러 서버로 분산처리하기로 결정했다.
이미 팀원분이 만들어둔 분할 로직이 있었기 때문에 약간만 수정해서 S3 업로드까지 되도록 만들었다.

MultipartFile을 FFmpeg에 바로 넣는 방법을 몰라서 로컬에 한번 저장했다가 나중에 삭제하는 식으로 구현했다.

  //비디오를 분할해서 S3 업로드 후 주소 return
   public List<String> splitUpload(MultipartFile video, Integer chunks) throws Exception {
       
       //임시폴더에 전체 영상 저장
       File fileJoinPath = new File(System.getProperty("user.dir") + "/tmp");
       if (!fileJoinPath.exists()) {
           fileJoinPath.mkdirs();
       }
       String temporalFilePath = System.getProperty("user.dir") + "/tmp/"+video.getOriginalFilename();
       video.transferTo(new File(temporalFilePath));
       
       //전체 영상을 임시폴더에 분할 저장
       List<String> splitFiles = videoFileUtils.splitFile(temporalFilePath,video.getOriginalFilename(),
               fileJoinPath.toString(),chunks);
       
       //분할영상들을 S3에 업로드
       List<String> s3FilePathList = new ArrayList<String>();
       for(String filePath : splitFiles) {
           s3FilePathList.add(
                   s3Uploader.upload(filePath,filePath.substring(filePath.lastIndexOf("/")+1),"splitVideo"));
       }
       
       //임시파일들 전부 제거
       videoFileUtils.deleteFile(temporalFilePath);
       for(String filePath : splitFiles) {
           videoFileUtils.deleteFile(filePath);
       }

       return s3FilePathList;
   }

프론트엔드에 필요한 코드는 거의다 짰고 이제 딥러닝 서버와 통신할 로직만 만들면 될 것 같다.

로컬에서 S3업로드로 변경을 하면서 중간에 내가 인터페이스를 수정하게 되었다.
그런데 인터페이스 자체가 방식을 정해둔건데 내가 수정을 해버려서 팀원분에게 약간 지적을 당했다.
내가 너무 막 코딩한다는 생각에 좀 부끄러워졌다. 그래도 다음부턴 이런일 없겠지.

profile
알고리즘을 좋아하는 컴공 학부생입니다

0개의 댓글