fluent-ffmpeg로 hls 변환을 시도했다!

🤩 우리가 원하는 것

Untitled

  1. ffmpeg을 사용해 mp4 파일을 .m3u8, .ts로 변환
  2. .m3u8, .ts를 NCP Object Storage에 업로드
  3. .m3u8을 읽을 때 Object Storage의 ts를 불러 읽어옴

😣 Local 저장?

Untitled

ffmpeg는 기본적으로 .output , .save 등으로 결과물을 local에 저장할 수 있다.

ffmpeg("input.mp4")
    .addOptions([
      "-profile:v baseline",
      "-level 3.0",
      "-s 640x360",
      "-hls_time 1",
      "-start_number 0",
      "-hls_list_size 0",
      "-f hls",
    ]).save('./output.m3u8');

이렇게 하면 master.m3u8 , master01.ts , master02.ts , … 가 지정된 경로에 저장된다.

local의 파일을 다시 읽어서 Object Storage에 업로드하는 것은 어렵지 않다.

// 이런 느낌
uploadObject({bucketName: process.env.outputbucket, objectName: '612391284719.m3u8', file: 'master.m3u8'})

function uploadObject(params) {
  const S3 = new AWS.S3({
    endpoint,
    region,
    credentials: {
      accessKeyId: process.env.accessKey,
      secretAccessKey: process.env.secretKey,
    },
  });

  return new Promise((resolve, reject) => {
    S3.putObject({
      Bucket: params.bucketName,
      Key: params.objectName,
      Body: fs.createReadStream(params.file),
    })
      .promise()
      .then(() => {
        resolve({ done: true });
      })
      .catch((error) => {
        reject({
          done: false,
          errorMessage: error,
        });
      });
  });
}

그런데 우리는 파일을 쓰고, 다시 읽어야하는 과정이 조금은 비효율적이라고 느껴서 다른 방법을 찾아봤다.