본문 바로가기

연구/인코딩

HEVC Tile-based Adaptation

mp4box로 HEVC Tile-based Adaptation을 진행해 보았다.

 

순서

 

1. mp4 파일을 yuv로 바꾼다. (kvazaar hevc encoder는 yuv 입력만 지원 한다.)

2. yuv 파일을 hvc로 인코딩 한다. - kvazaar 사용, 타일링

3. hvc 파일을 mp4로 패키징 해준다, - mp4box 사용

4. mp4 파일을 dash화 한다. - mp4box 사용

 

코드는 파이썬으로 작성하였다.

 

간단한 구조

 

- tools에는 진행에 필요한 kvazaar, ffmpeg, mp4box, mp4client가 있다

- config에는 영상 위치, 영상 fps, 사용할 소프트웨어의의 위치를 설정했다.

- script에는 인코딩 자동화를 위한 간단한 스크립트를 작성했다.

 

1. mp4 -> yuv

s = f"{ffmpeg} -i {v_in} -c:v rawvideo -pix_fmt yuv420p {v_out}"

ffmpeg을 이용하여 hevc 인코딩을 위해 yuv로 바꿔준다.

 

2. yuv -> hvc

s = f"{kvazaar} -i {v_in} -o {v_out} " \
	f"--tiles {tile} --slices tiles --mv-constraint frametilemargin --bitrate {bitrate} " \
	f"--input-fps {round(input_fps)} --period {round(input_fps)}"

kvazaar로 tiling 및 multi representation을 위한 bitrate를 설정해준다.

 

* 입력영상 이름에 [name_{width}x{height}]같은 형태로 되어있어야 --input-res 파라미터 스킵가능하다.

* --preset slow를 했을 때, --period 값 설정하는데 오류가 발생 했다. (gop와 period가 충돌하는 것 같다..) period를 1로 두어 모든 picture를 intra로 설정 했을 때 영상이 깨지는 문제가 발생했다. 

* 입력 영상의 크기에 비해 tile이 너무 많으면 오류가 mp4로 패키징 하는 단계에서 오류가 발생했다.

* --mv-constraint에 frametile, frametilemargin 2개의 옵션이 있는데 추후에 비교해봐야 겠다.

* 자세한 입력 정보 참고

https://github.com/ultravideo/kvazaar

 

3. hvc -> mp4

s = f"{mp4box} -add {v_in}:split_tiles -fps {input_fps} -new {v_out}"

hvc파일을 mp4로 패키징 한다. hvc가 잘 만들어졌으면 문제 없이 잘 작동하며, mp4client를 통해 mp4를 재생했을 때 잘 동작한다.

 

4. mp4 -> mpd

s = f"{mp4box} -dash {dash} -profile {profile} -out {v_out} {v_in}"

mp4 파일을 이용해 mpd로 바꿔준다. streaming을 위해 profile은 live로 설정한다.

gpac 8.0버전이랑 9.0버전이랑 만들어지는게 달랐다. - 8.0버전이 dash 예제랑 똑같이 만들어지고 재생이 잘 됬다.

 

* dash를 1000, 2000, 4000, 10_000로 설정해봤는데 1000일 때는 거의 동작하지 않았다. (key-int문제..?)

 

 

** 결과

10X5로 타일링한영상을 360으로 재생이 잘 된다.
다른영상도 잘 된당.

 

이제 서버에 올려서 재생해봐야겠다.

 

 

출처

- https://github.com/ultravideo/kvazaar kvazaar option

- https://github.com/gpac/gpac/wiki/HEVC-Tile-based-adaptation-guide tile streaming guide

- https://github.com/gpac/gpac/wiki/Tiled-Streaming tile streaming guide

- https://github.com/gpac/gpac/wiki/MP4Client mp4client 옵션

- https://github.com/gpac/gpac/wiki/Check-key-frame-alignment-with-MP4Box key-frame alignment

- https://blog.streamroot.io/encode-multi-bitrate-videos-mpeg-dash-mse-based-media-players/ multi-bitrate guide

 

'연구 > 인코딩' 카테고리의 다른 글

[ffmpeg] mp4파일로 mpd 만들기  (2) 2018.12.11