s3란?
aws s3는 스토리지 서비스(Storage Service)이다.
쉽게 말하자면 특정한 사진,동영상 등의 파일을 저장하기 위해 사용할 수 있는 서비스이다.
s3에서 객체(Object)란 저장되는 파일을 의미하고, 버킷(Bucket)은 파일이 저장될 프로젝트를 의미한다
s3는 키(고유 식별자)와 값(데이터 자체)로 구성된 데이터 조각인 개체의 개념을 기반으로 한다.
개체는 텍스트 파일에서 이미지 및 비디오 같은 멀티미디어 콘텐츠에 이르기까지 무엇이든 될 수 있다.
크기는 최대 5TB가 될 수 있다.
동영상 업로드 시간을 줄여보고자, 동영상 파일을 ffmpeg로 압축하여, s3 bucket에 업로드 했다.
220MB => 13.5MB로 확실히 압축되긴 했지만 압축하는데 시간이 너무 오래 걸린다.
// (2)uris처리
// 파일이 업로드된 각각의 파일에 대해 반복하여 처리
if (isset($_FILES['uris'])) {
// $urisContent = print_r($_FILES['uris'], true);
// error_log("Received ['uris']: " . $urisContent);
$fileCount = count($_FILES['uris']['name']); // 여러 파일 처리
for ($i = 0; $i < $fileCount; $i++) {
$tmpFilePath = $_FILES['uris']['tmp_name'][$i];
$originalFileName = $_FILES['uris']['name'][$i];
$contentType = $_FILES['uris']['type'][$i];
if(strpos($contentType, "video/")=== 0){
// 동영상 파일인 경우 압축
$compressedFilePath = '/tmp/' . $originalFileName;
// ffmpeg를 사용하여 동영상 압축 (예: 540p 해상도로 설정)
// 입력된 동영상 파일을 960x540 해상도로 압축하면서 비디오와 오디오의 비트레이트를 명시적으로 설정
$ffmpegCommand = "ffmpeg -i '{$tmpFilePath}' -vf 'scale=960:540' -c:v libx264 -preset fast -b:v 1500k -bufsize 3000k -c:a aac -b:a 128k '{$compressedFilePath}' 2>&1";
exec($ffmpegCommand, $output, $returnVar);
if ($returnVar === 0) {
// 압축 성공, 압축된 파일 경로로 변경
$tmpFilePath = $compressedFilePath;
} else {
// 압축 실패, 로그 기록
error_log("Compression failed for {$originalFileName}: " . implode("\n", $output));
continue; // 이 파일의 처리를 건너뛰고 다음 파일로 넘어감
}
}
// S3에 업로드할 객체 키 생성
$key = 'uploads/' . date('Y/m/d/') . $originalFileName;
// 파일 업로드 시도
$result = $s3Uploader->upload($key, $tmpFilePath, $contentType);
// 업로드 결과에 따라 처리
if ($result['success']) {
// 성공적으로 업로드된 경우 처리
$uris[] = $result['url'];
// 임시 압축 파일 삭제
if (file_exists($compressedFilePath)) {
unlink($compressedFilePath);
}
} else {
// 업로드 실패 시 처리
error_log("Upload failed: uri" . $result['message'] . "\n");
}
}
}
동영상 업로드 시간 테스트
1분 9초짜리 원본 220MB 영상 업로드시(ffmpeg 사용),
그냥 업로드(220MB) : 1분 20초
동영상을 압축(1280x720) + 업로드(13.5MB) : 5분 47초
동영상을 압축(960x540) + 업로드(13.5MB) : 4분 20초
압축 프리셋을 변경해도 큰 차이가 없었고,
오히려 원본 파일을 올리는 것이 시간이 덜 걸렸다.
이렇게 대기 시간이 길면, 사용자 경험이 나빠진다.
(사용자 경험: 사용자가 어떤 시스템, 제품, 서비스를 직, 간접적으로 이용하면서 느끼고 생각하게 되는 총체적 경험을 말한다. )
왜 시간이 오래 걸릴까?
동영상을 압축하는 데 시간이 오래 걸리기 때문이다.
동영상 인코딩을 위해서 가장 결정적인 것은 바로 gpu, cpu등 하드웨어의 성능이다.
하지만, 나는 aws 프리티어 t2micro를 사용하고 있던지라 좋은 하드웨어의 성능을 갖출 수 없었다.
<GPT>
AWS에서 GPU 인스턴스를 사용하는 것은 동영상 인코딩 작업을 가속화하는 훌륭한 방법입니다. AWS에는 여러 종류의 GPU 인스턴스가 제공되며, 이들은 고성능 컴퓨팅, 머신 러닝, 그리고 미디어 처리 작업을 위해 특별히 설계되었습니다.
AWS 프리티어 인스턴스를 사용하면 가상 서버를 생성하고 여러 종류의 소프트웨어를 설치할 수 있습니다. 그러나 하드웨어는 사용자가 직접 제어할 수 있는 것이 아니라 AWS가 관리합니다. 따라서 AWS에서는 사용자가 직접 하드웨어를 선택하거나 설치하는 것은 불가능합니다.
최선의 방법은?
<gpt>
AWS EC2의 t2.micro 인스턴스는 일반적으로 압축 또는 인코딩과 같은 CPU 집약적인 작업을 처리하기에는 적합하지 않습니다.
멀티파트 업로드를 사용하면 큰 파일을 여러 조각으로 나누어 동시에 전송할 수 있으므로 전송 시간이 단축됩니다. 또한, S3의 가속 엔드포인트를 활성화하면 AWS의 글로벌 네트워크를 통해 데이터를 더 빠르게 전송할 수 있습니다.
내가 적용한 방법들
(1) 동영상 업로드에 용량 제한
동영상 용량을 제한해서 30MB 의 파일만 업로드 하도록 함(20초 내 업로드), 초과시 알림창을 생성
(2) 여러 파일을 멀티파트로 업로드
멀티파트 업로드: 대용량의 파일을 업로드할때, 파일을 작은 부분으로 나누어 서버에 전송하고, 서버는 이러한 작은 부분을 받아서 하나의 파일로 조립하는 것, 여러부분을 병렬로 업로드 하여, 전체 업로드 시간을 단축함
(3) S3의 가속 엔드포인트를 활성화
가속 엔드포인트(Transfer Acceleration)는 Amazon S3에 대한 데이터 전송을 가속화하는 기능
'php' 카테고리의 다른 글
<php> Composer 설치시 오류 뜨는 문제 해결 (4) | 2024.04.23 |
---|---|
[php] 페이징 처리 - 댓글 더보기 (0) | 2023.12.16 |