Post

HLS(HTTP Live Streaming)와 FFmpeg를 이용한 영상 생성

HLS 개념과 FFmpeg로 HLS 영상 생성

HLS는 인터넷을 이용하여 비디오 컨텐츠를 제공하는데 사용되는 스트리밍 프로토콜이다
비디오 파일 전체를 한번에 다운로드 하지 않고, 비디오 파일을 일정 기준으로 분할 하여 HTTP 프로토콜로 전송한다
HSL는 최대한 범용적으로 사용하기 위해서 비디오의 포맷은 H.264 또는 H.265를 사용한다
비디오는 특정 시간 길이의 세그먼트로 나눈다
비디오를 480p, 720p, 1080p 등의 다양한 품질로 여러 재생목록의 세그먼트를 복제한다

FFmpeg로 HLS 영상 변환

ffmpeg로 일반 비디오 파일을 HLS로 서비스 할 수 있도록 비디오 파일을 세그먼트로 분리 할 수 있다

기본적인 ffmpeg 사용법은 아래 링크에서 참고한다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
./ffmpeg \
  -i sample.mp4 \
  -f hls \
  -hls_time 5 \
  -hls_list_size 0 \
  -hls_segment_filename ./output/%v/video_%04d.ts \
  -master_pl_name master.m3u8 \
  -c:v libx264 \
  -c:a aac \
  -ar 48000 \
  -map 0:v:0 -map 0:a:0 -map 0:v:0 -map 0:a:0 -map 0:v:0 -map 0:a:0 \
  -var_stream_map "v:0,a:0,name:1080p v:1,a:1,name:720p v:2,a:2,name:480p" \
  -b:v:0 5000k -maxrate:v:0 5000k -bufsize:v:0 10000k -s:v:0 1920x1080 -crf:v:0 15 -b:a:0 128k \
  -b:v:1 2500k -maxrate:v:1 2500k -bufsize:v:1 5000k -s:v:1 404x720 -crf:v:1 22 -b:a:1 96k \
  -b:v:2 1000k -maxrate:v:2 1000k -bufsize:v:2 2000k -s:v:2 270x480 -crf:v:2 28 -b:a:2 64k \
  ./output/%v/playlist.m3u8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
./output
├── 1080p
│   ├── playlist.m3u8
│   ├── video_0000.ts
│   ├── video_0001.ts
│   ├── video_0002.ts
│   └── video_0003.ts
├── 480p
│   ├── playlist.m3u8
│   ├── video_0000.ts
│   ├── video_0001.ts
│   └── video_0002.ts
├── 720p
│   ├── playlist.m3u8
│   ├── video_0000.ts
│   ├── video_0001.ts
│   └── video_0002.ts
└── master.m3u8
-f
옵션에 hls로 설정하여 hls을 사용할 수 있는 세그먼트로 분리하도록 설정
-hls_time
옵션은 세그먼트의 기준
설정 값 만큼이 지난 다음에 가장 가까운 비디오 키프레임에서 영상을 분할
비디오의 키프레임은 비디오가 모든 프레임에 대하여 프레임에 전체 정보를 저장하지 않고 특정 프레임에 프레임 전체 정보를 저장하고 그 뒤로 일정 프레임 까지 프레임에 대한 변화만 기록하여 비디오의 절대적인 데이터양을 줄인다
-hls_list_size
재생 스트림의 길이를 설정
0으로 설정하면 제한 없음
-hls_segment_filename
세그먼트 파일의 이름
%v는 재생목록의 이름, %d는 하나의 재생목록에서 분할된 세그먼트의 순서
-master_pl_name
전체 재생 스트림의 정보를 가지고 있는 마스터 재생 스트림의 이름
-map
원본 비디오 파일에는 영상 및 음성이 1개 이상의 스트림을 가질 수 있으며 출력 파일에 어떠한 스트림을 사용 할 지를 설정
n번째 원본 파일:비디오 또는 오디오:n번째 스트림을 의미, n은 zero-index로 0부터 시작
0:v:0의 의미는 첫번째 입력 파일에서 비디오는 첫번째 스트림을 사용
0:a:0의 의미는 첫번째 입력 파일에서 오디오는 첫번째 스트림을 사용
trac wiki - FFmpeg Map
map 옵션이 대한 자세한 설명은 위 링크를 참조한다
-var_stream_map
재생 스트림의 목록을 지정
재생 스트림은 공백으로 구분
v:n번째 재생 목록,a:n번째 재생 목록,name:재생 목록 이름으로 구성 되며 v는 비디오, a는 오디오를 의미, n은 zero-index로 0부터 시작
-b:v:{n}
n번째 재생 스트림의 비디오 평균 비트레이트
-maxrate:v:{n}
n번째 재생 스트림의 비디오 최대 공차를 지정
-bufsize:v:{n} 옵션과 같이 사용
-bufsize:v:{n}
n번째 재생 스티림의 비디오 출력 비트레이트의 가변성을 설정하는 버퍼의 크기를 지정
-s:v:{n}
n번째 재생 스트림의 비디오 해상도 설정
-crf:v:{n}
n번째 재생 스트림의 비디오 품질
0~51의 값을 가지며 0에 가까울수록 품질이 좋고 51에 가까울수록 품질이 낮음
권장 사용 범위는 17에서 28 사이의 값
-b:a:{n}
n번째 재생 스트림의 오디오 샘플레이트
사용 가능한 값은 44100, 48000, 32000, 22050, 24000, 16000, 11025, 12000, 8000
기본값은 44100

명령줄을 실행하게 되면 1080p, 720p, 480p 디렉토리가 생성되고 옵션에 따라서 각각 디렉토리에 파일이 생성 된다

This post is licensed under CC BY 4.0 by the author.