부드러운 움직임의 60fps 인코딩 (minterpolate 필터를 이용)

by JKyle posted Jul 16, 2018
?

Shortcut

PrevPrev Article

NextNext Article

ESCClose

Larger Font Smaller Font Up Down Go comment Print

제목 그대로 minterpolate 필터를 이용해 부드러운 움직임을 가진 60fps 영상을 인코딩하기 위한 프리셋입니다. H264 버전과 HEVC 버전을 따로 만들었습니다. 소프트웨어 필터인 minterpolate를 집중적으로 사용하므로 하드웨어 가속을 위한 HEVC_NVENC 같은 인코더는 인코딩 속도 향상 효과가 거의 없습니다.

 

H264 minterpolate 59.94 fps (Video Only).xml

HEVC minterpolate 59.94 fps (Video Only).xml

 

---------------------------------------------------------------------------------------------------------

 

<간단한 배경 설명>

 

24fps, 30fps 등 낮은 프레임레이트를 가진 동영상을 SVP의 AviSynth 플러그인인 SVPflow plugin을 이용해 60fps 인코딩을 하거나 SVP 필터를 이용해 재생해서 보면 딱딱 끊어지던 움직임이 부드럽게 보입니다. 이는 기존에 없던 프레임들을 기존의 프레임들을 이용해 움직임을 보정해(motion compensated interpolation) 생성한 후 사이사이에 끼워넣기 때문입니다.

 

( 참고 포스팅: http://spirton.com/convert-videos-to-60fps/ )

 

FFmpeg가 갖고 있는 필터들 중 frame rate 변경을 위해 많이 쓰는 framerate 필터는 이 motion compensated interpolation 알고리즘이 없이 단지 기존의 프레임들을 적당히 average out한 프레임들을 삽입하기 때문에 잔상이 필연적으로 보이게 되어 만족스러운 화질을 만들어내지 못합니다.

 

따라서 부드러운 움직임을 위해 프레임 더블링을 하고자 한다면 FFmpeg의 필터 중 움직임과 관련한 여러 알고리듬을 적용할 수 있는 minterpolate 필터를 이용해야 합니다.

 

---------------------------------------------------------------------------------------------------------

 

<프리셋 세부사항 설명>

 

필터 매개변수에 대한 설명은 아래와 같습니다.

 

=============================================================================

 

minterpolate=fps=60000/1001:mi_mode=mci:mc_mode=aobmc:me_mode=bidir:me=epzs:vsbmc=1

    // fps(frames per second)를 59.94로 설정

    // mi_mode(motion interpolation mode)를 mci(motion compensated interpolation)로 설정

    // mc_mode(motion compensation mode)를 aobmc로

    // me_mode(motion estimation mode)를 bidir(bidirectional)로

    // me(motion estimation algorithm)를 epzs로 설정 (중요한 부분임.)

      // 화질 순서: esa >> umh >= epzs >> 나머지 알고리듬들

      // 인코딩 속도: 나머지 알고리듬들 >= epzs >> umh >>>>>>>> esa

      // 화질 대비 epzs가 가장 효율적인 알고리듬임.

    // vsbmc(variable-size block motion compensation)을 on으로...

    // 자세한 설명은 http://ffmpeg.org/ffmpeg-filters.html#minterpolate 참고

 

=============================================================================

 

인코딩 설정값 중 중요한 부분은 아래와 같습니다.

 

=============================================================================

 

 -r 60000/1001

    // 반드시 필터의 fps 값과 동일한 값을 설정

 

=============================================================================

 

나머지 부분은 다른 프리셋을 참고하시면 충분히 이해하실 수 있을 겁니다.

 

---------------------------------------------------------------------------------------------------------

 

<프리셋의 한계>

 

1. 속도가 상당히 느립니다. (2~3fps 정도) 그리고 아직 최적화가 안 돼 있는지 CPU 점유율이 50% 정도밖에 되지 않습니다.

 

2. 결과물을 보면 움직임은 부드러우나 가끔 급격한 움직임을 보이는 물체의 경계 부분이 과도하게 blur돼 있는 것을 확인할 수 있습니다. 이런 현상은 AviScript의 SVPflow 플러그인을 적용한 MeGUI 인코딩에서도 마찬가지로 나타나며, SVP 필터를 이용한 실시간 프레임 더블링 재생시에도 나타납니다. 따라서 이는 하드웨어의 한계이거나, motion compensated interpolation을 적용하는 필터들이 현재 갖고 있는 한계로 판단됩니다.

 

---------------------------------------------------------------------------------------------------------

 

<주의 사항>

 

1. 원본이 interlace돼 있는 영상이라면 반드시 yadif 같은 deinterlacing filter를 먼저 적용해서 progressive 영상으로 변환시켜야 합니다. 마찬가지 맥락에서, 원본이 telecine돼 있는 영상이라면 반드시 IVTC(inverse telecine) 처리를 먼저 한 다음 적용해야 합니다.

 

2. 이 프리셋은 minterpolate 필터를 이용해 23.976fps(=24000/1001)의 원본 영상을 59.94fps(=60000/1001)의 영상으로 인코딩하기 위해 설정한 것입니다. 따라서 원본에 drop-frame이 없을 경우 (즉, 나누기 1001을 하지 않고 정수로 깔끔하게 떨어지는 프레임레이트일 경우) 나누기 1001을 제외해서 적절하게 변경하시는 것이 좋습니다.

 

3. 오디오는 없이 비디오만 인코딩하는 프리셋이니 오디오 인코딩은 적절하게 세팅해 주시기 바랍니다.

 

4. 이 프리셋은 minterpolate 필터가 지원되는 샤나인코더 4.9.0.1 버전 이상에서만 작동합니다.