HLS 변환
이번 프로젝트에서 동영상 스트리밍을 hls 프로토콜로 정했다. js의 경우 라이브러리들이 존재하는데, 스프링 부트로 하려니까 시작부터 막막했다. 여러 자료를 찾아보고 라이브러리가 있긴 했는데 적용 과정에서 문제가 있는지 제대로 만들어지지 않았다. 그래서 직접 Proccess 클래스를 사용하기로 했다.
hls 변환 과정은 다음과 같다.
- 클라이언트가 MultipartFile형식으로 서버에 보낸다.
- 서버에서는 로컬에 저장한다.
- hls 결과물을 생성할 폴더를 만든다.
- mp4 -> m3u8로 변환시킨다.
- hls 결과물 폴더에 저장한다.
String fffmpegCommand = "ffmpeg ...명령어들...";
Process proccess = Runtime.getRuntime().exec(ffmpegCommand);
int exitCode = proccess.waitFor();
이런 식으로 작성해주었다.
여기서 문제가 있었는데 변환을 하고 다음 waitFor()에서 계속 멈춰있는 것이었다. 찾아봤는데 스트림을 비우지 않아서 그런거였다.
별도의 쓰레드를 사용하여 이부분을 처리해주었다. 이 부분은 chatgpt의 힘을 빌렸다.
// 스트림을 비우는 별도의 클래스
private static class StreamGobbler extends Thread {
private final InputStream inputStream;
private final String streamType;
public StreamGobbler(InputStream inputStream, String streamType) {
this.inputStream = inputStream;
this.streamType = streamType;
}
@Override
public void run() {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
String line;
while ((line = reader.readLine()) != null) {
// System.out.println(streamType + ">" + line); // 출력 로그를 필요에 따라 처리
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
String fffmpegCommand = "ffmpeg ...명령어들...";
Process proccess = Runtime.getRuntime().exec(ffmpegCommand);
StreamGobbler outputGobbler = new StreamGobbler(proccess.getInputStream(), "OUTPUT");
StreamGobbler errorGobbler = new StreamGobbler(process.getErrorStream(), "ERROR");
outputGobbler.start();
errorGobbler.start();
int exitCode = proccess.waitFor();
이렇게 처리하니 동작이 잘 끝났다.
나중에 커맨드를 활용해서 해상도를 1080p, 720p, 480p 총 세 가지로 저장해서 나중에 화질 설정도 가능하게 해줘야겠다.
'사이드 프로젝트 > 쿠키톡' 카테고리의 다른 글
쿠키 CRUD 구현 (5) | 2024.10.08 |
---|---|
jwt 인증/인가 (0) | 2024.09.29 |
기존의 업로드 방식 리팩토링 (0) | 2024.09.29 |
사이드 프로젝트 시작 (0) | 2024.09.15 |