ffmpeg 파일로 다중 화질을 지원하는 hls를 만드는 커맨드이다.
오디오 있을때
ffmpeg -i input.mp4 \
-preset veryfast -threads 0 \
-map 0:v:0 -map '0:a:0' -map 0:v:0 -map '0:a:0' -map 0:v:0 -map '0:a:0' \
-c:v libx264 -crf 22 -c:a aac -ar 48000 \
-filter:v:0 scale=-2:360:force_original_aspect_ratio=decrease -maxrate:v:0 600k -b:a:0 64k \
-filter:v:1 scale=-2:720:force_original_aspect_ratio=decrease -maxrate:v:1 900k -b:a:1 128k \
-filter:v:2 scale=-2:1080:force_original_aspect_ratio=decrease -maxrate:v:2 900k -b:a:2 128k \
-f hls -hls_time 10 -hls_playlist_type vod -hls_list_size 0 -hls_flags independent_segments \
-var_stream_map "v:0,a:0,name:360p v:1,a:1,name:720p v:2,a:2,name:1080p" \
-master_pl_name master.m3u8 \
-hls_segment_filename "res_%v/file_%03d.ts" "res_%v/index.m3u8"
오디오 없을때
ffmpeg -i input.mp4 \
-preset veryfast -threads 0 \
-map 0:v:0 -map 0:v:0 -map 0:v:0 \
-c:v libx264 -crf 22 -c:a aac -ar 48000 \
-filter:v:0 scale=-2:360:force_original_aspect_ratio=decrease -maxrate:v:0 600k \
-filter:v:1 scale=-2:720:force_original_aspect_ratio=decrease -maxrate:v:1 900k \
-filter:v:2 scale=-2:1080:force_original_aspect_ratio=decrease -maxrate:v:2 900k \
-f hls -hls_time 10 -hls_playlist_type vod -hls_list_size 0 -hls_flags independent_segments \
-var_stream_map "v:0,name:360p v:1,name:720p v:2,name:1080p" \
-master_pl_name master.m3u8 \
-hls_segment_filename "res_%v/file_%03d.ts" "res_%v/index.m3u8"
둘의 차이는 그냥 오디오 스트림이 있고 없고 차이 밖에 없다.


이런식으로 파일들이 생성된다.
오디오 있을때
ffmpeg -i input.mp4 \
-preset veryfast -threads 0 \
-map 0:v:0 -map '0:a:0' -map 0:v:0 -map '0:a:0' -map 0:v:0 -map '0:a:0' \
-c:v libx264 -crf 22 -c:a aac -ar 48000 \
-filter:v:0 scale=-2:360:force_original_aspect_ratio=decrease -maxrate:v:0 600k -b:a:0 64k \
-filter:v:1 scale=-2:720:force_original_aspect_ratio=decrease -maxrate:v:1 900k -b:a:1 128k \
-filter:v:2 scale=-2:1080:force_original_aspect_ratio=decrease -maxrate:v:2 900k -b:a:2 128k \
-f hls -hls_time 10 -hls_playlist_type vod -hls_list_size 0 -hls_flags independent_segments \
-var_stream_map "v:0,a:0,name:360p v:1,a:1,name:720p v:2,a:2,name:1080p" \
-master_pl_name master.m3u8 \
-hls_segment_filename "res_%v/file_%03d.ts" "res_%v/index.m3u8"
ffmpeg -i input.mp4 \
인풋 파일 지정
-preset veryfast -threads 0 \
가이드 문서에 따르면 preset의 기본값은 medium 이며, ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow 가 있습니다.
빠를 수록 용량 압축률이 떨어집니다.
-c:v libx264 -crf 22 -c:a aac -ar 48000 \
적절하게 코덱 맞추기
-filter:v:0 scale=-2:360:force_original_aspect_ratio=decrease -maxrate:v:0 600k -b:a:0 64k \
scale을 세로 길이만 지정하고 비율에 맞춰서 줄여주기
비디오랑 오디오 비트레이트 지정
-f hls -hls_time 10 -hls_playlist_type vod -hls_list_size 0 -hls_flags independent_segments \
-var_stream_map "v:0,a:0,name:360p v:1,a:1,name:720p v:2,a:2,name:1080p" \
-master_pl_name master.m3u8 \
-hls_segment_filename "res_%v/file_%03d.ts" "res_%v/index.m3u8"
hls 설정들, 10초 기준으로 자르기, vod 타입으로, 리스트 제한 없음
var stream map 을 통해 다중 비디오 스트림으로 하고
master_ps_name 을 통해 master 플레이 리스트를 지정한다. 이 명령어가 먼저 나와야 정상 동작함
맨 마지막으로 %v를 통해 파일 별 구분을 해줄 수 있는데, 기본적으로는 화질별로 0, 1 , 2 이런식으로 붙는데, 위에서 내가 name을 설정해 줬기 때문에 그 이름이 여기 들어가는 형식
아래와 같은 옵션을 사용하면 파싱하기 좋게 로그를 뽑아볼 수 있다.
-progress - -nostats -v quiet
아래는 예시 커맨드
ffmpeg -i input.mp4 \
-preset veryfast -threads 0 \
-map 0:v:0 -map '0:a:0' -map 0:v:0 -map '0:a:0' -map 0:v:0 -map '0:a:0' \
-c:v libx264 -crf 22 -c:a aac -ar 48000 \
-filter:v:0 scale=-2:360:force_original_aspect_ratio=decrease -maxrate:v:0 600k -b:a:0 64k \
-filter:v:1 scale=-2:720:force_original_aspect_ratio=decrease -maxrate:v:1 900k -b:a:1 128k \
-filter:v:2 scale=-2:1080:force_original_aspect_ratio=decrease -maxrate:v:2 900k -b:a:2 128k \
-f hls -hls_time 10 -hls_playlist_type vod -hls_list_size 0 -hls_flags independent_segments \
-var_stream_map "v:0,a:0,name:360p v:1,a:1,name:720p v:2,a:2,name:1080p" \
-master_pl_name master.m3u8 \
-hls_segment_filename "res_%v/file_%03d.ts" "res_%v/index.m3u8" \
-progress - -nostats -v quiet
아래는 이렇게 실행했을때 출력
frame=21
fps=0.00
stream_0_0_q=0.0
stream_0_2_q=0.0
stream_0_4_q=0.0
bitrate=N/A
total_size=N/A
out_time_us=0
out_time_ms=0
out_time=00:00:00.000000
dup_frames=0
drop_frames=0
speed= 0x
progress=continue
frame=160
fps=0.00
stream_0_0_q=28.0
stream_0_2_q=28.0
stream_0_4_q=28.0
bitrate=N/A
total_size=N/A
out_time_us=5973333
out_time_ms=5973333
out_time=00:00:05.973333
dup_frames=0
drop_frames=0
speed=10.2x
progress=continue
frame=300
fps=276.09
stream_0_0_q=28.0
stream_0_2_q=28.0
stream_0_4_q=28.0
bitrate=N/A
total_size=N/A
out_time_us=10624000
out_time_ms=10624000
out_time=00:00:10.624000
dup_frames=0
drop_frames=0
speed=9.78x
progress=continue
frame=447
fps=281.32
stream_0_0_q=28.0
stream_0_2_q=28.0
stream_0_4_q=28.0
bitrate=N/A
total_size=N/A
out_time_us=14997333
out_time_ms=14997333
out_time=00:00:14.997333
dup_frames=0
drop_frames=0
speed=9.44x
progress=continue
frame=594
fps=284.24
stream_0_0_q=28.0
stream_0_2_q=28.0
stream_0_4_q=28.0
bitrate=N/A
total_size=N/A
out_time_us=20010667
out_time_ms=20010667
out_time=00:00:20.010667
dup_frames=0
drop_frames=0
speed=9.58x
progress=continue
frame=734
fps=283.41
stream_0_0_q=28.0
stream_0_2_q=28.0
stream_0_4_q=28.0
bitrate=N/A
total_size=N/A
out_time_us=24896000
out_time_ms=24896000
out_time=00:00:24.896000
dup_frames=0
drop_frames=0
speed=9.61x
progress=continue
frame=866
fps=280.04
stream_0_0_q=28.0
stream_0_2_q=28.0
stream_0_4_q=28.0
bitrate=N/A
total_size=N/A
out_time_us=29034667
out_time_ms=29034667
out_time=00:00:29.034667
dup_frames=0
drop_frames=0
speed=9.39x
progress=continue
frame=901
fps=275.68
stream_0_0_q=-1.0
stream_0_2_q=-1.0
stream_0_4_q=-1.0
bitrate=N/A
total_size=N/A
out_time_us=30528000
out_time_ms=30528000
out_time=00:00:30.528000
dup_frames=0
drop_frames=0
speed=9.34x
progress=end
다른 잡 정보는 뜨지 않고 딱 이렇게만 출력되니, 파싱하기 매우 유용하다.