본문 바로가기
TIL

TIL 240813 - node media server에서 hls 변환 시 화질 fission 방법

by lemonpie611 2024. 8. 14.
const liveConfig = {
      rtmp: {
        port: 1935,
        chunk_size: 60000,
        gop_cache: true,
        ping: 30,
        ping_timeout: 60,
      },
      http: {
        port: 8000,
        mediaroot: '../media', // path.join(__dirname, '../../media'),
        webroot: './www',
        allow_origin: '*',
      },
      // https: {
      //   port: 8443,
      //   // key: './key.pem',
      //   // cert: './cert.pem',
      // },
      trans: {
        ffmpeg: '/usr/bin/ffmpeg',
          // '/Users/82104/Downloads/ffmpeg-7.0.1-essentials_build/ffmpeg-7.0.1-essentials_build/bin/ffmpeg.exe',
        tasks: [
          {
            app: 'live',
            vc: 'libx264', // x264 비디오 코덱 사용 (H.264는 인코딩 시 그래픽카드의 GPU 사용 > 사양 좋아야함.. x264는 CPU 사용)
            vcParam: [
              '-crf',
              '18', // CRF 값 (인코딩시 사용되는 품질 기준값, 18은 거의 무손실, 23은 기본값)
              '-preset',
              'slow', // 인코딩 프리셋 (한 프레임을 만드는 데에 얼마나 CPU 자원을 사용할지, 느려질수록 같은 비트레이트에서 더 나은  품질)
              '-b:v',
              '4M', // 비디오스트림 비트레이트 (초당 비트 전송률, 즉 1초당 용량, 4M는 4 Mbps)
              '-maxrate',
              '4M', // 최대 비트레이트
              '-bufsize',
              '8M', // 버퍼(임시 저장공간?) 사이즈 (8MB)
            ],
            ac: 'copy',
            // acParam: ['-ab', '64k', '-ac', '1', '-ar', '44100'],
            hls: true,
            hlsFlags: '[hls_time=2:hls_list_size=3:hls_flags=delete_segments]',
            // hlsKeep: true, // to prevent hls file delete after end the stream
            // ffmpegParams: '-loglevel debug -report', // FFmpeg 로그 기록
            // dash: true,
            // dashFlags: '[f=dash:window_size=3:extra_window_size=5]',
            // dashKeep: true, // to prevent dash file delete after end the stream
            mp4: true,
            mp4Flags: '[movflags=frag_keyframe+empty_moov]',
          },
        ],
      },
      fission: { // 화질별 분할
        ffmpeg:
          '/Users/82104/Downloads/ffmpeg-7.0.1-essentials_build/ffmpeg-7.0.1-essentials_build/bin/ffmpeg.exe',
        tasks: [
          {
            rule: 'live/*',
            model: [
              { 
                ab: '128k',                // 오디오 비트레이트
                vb: '2000k',               // 비디오 비트레이트 (2 Mbps)
                vs: '1920x1080',           // 비디오 해상도
                vf: '30',                  // 프레임 레이트 (초당 프레임수, 30 fps)
              },
              {
                ab: '128k',
                vb: '1500k',
                vs: '1280x720',
                vf: '30',
              },
              {
                ab: '96k',
                vb: '1000k',
                vs: '854x480',
                vf: '24',
              },
              {
                ab: '96k',
                vb: '600k',
                vs: '640x360',
                vf: '20',
              },
            ],
          },
        ],
      },
    };

 

trans 블럭 안에 fission 설정을 추가하여 model에 화질별 설정 집어넣기