지난 25일에 ITU에서 H.265/HEVC 표준의 승인이 있었네요.

http://www.itu.int/net/pressoffice/press_releases/2013/01.aspx#.UQekEx11F8F


H.265/HEVC는 H.264/AVC를 잇는 차세대 동영상 압축 표준인데 H.264/AVC와 비교하면 약 두 배 정도의 압축률을 갖는다고 합니다.

아래는 위키에서 가져온 표인데 동일한 PSNR 수치에서의 표준별 비트레이트 감소율입니다.


H.264/AVC와 비교하면 동일한 PSNR 수치에서 약 35%의 비트레이트를 감소시킬 수 있다는 말이죠.


아무래도 H.265/HEVC는 기존의 H.264/AVC와의 비교가 많을 것 같아서 둘 사이의 차이점을 몇가지 정리해 봤습니다.

1) 압축의 기본 단위라고 할 수 있는 기존의 매크로블럭이 CTU(Coding Tree Unit)로 대체됩니다.

   CTU는 루마 CTB(Coding Tree Block)과 크로마 CTB로 구성되는데 루마 CTB의 크기는 16x16, 32x32, 64x64 중 하나를 선택할 수 있습니다.

   하나의 CTU는 다시 하위의 CU(Coding Unit)들로 나눠질 수 있고 이 CU는 다시 PU(Prediction Unit)와 TU(Transform Unit)로 나눠집니다.

   PU는 인트라, 인터 예측의 단위이고 TU는 주파수 변환, 양자화의 단위입니다. 

   PU는 4x4 ~ 64x64의 크기를, TU는 4x4, 8x8, 16x16, 32x32의 크기를 가질 수 있습니다.

2) H.264/AVC 표준에서는 CABAC과 CAVLC의 두 가지 엔트로피 코딩을 사용했지만 H.265/HEVC에서는 CABAC만을 사용합니다.

3) 인트라 예측에는 33개의 예측 모드와 DC, Planar 모드를 합해서 총 35가지의 모드가 가능합니다. H.264/AVC는 총 9개였죠.

4) 인터 예측에는 Qpel 단위에서 7탭, 8탭 필터가 사용됩니다. H.264/AVC는 Hpel 단위에서 6탭 필터, Qpel 단위에서는 median 필터를

   사용했습니다. 예측에 사용되는 블럭의 크기는 최소 4x4 부터 64x64 까지 가능합니다.

5) 움직임 벡터 예측에는 AMVP와 merge 모드를 사용할 수 있습니다. AMVP는 참조 프레임과 인접 블럭의 데이터를 이용하는 예측 방법이고

   merge 모드는 H.264/AVC의 skip, direct 모드와 비슷하다고 합니다.

6) 주파수 변환의 블럭 사이즈는 H.264/AVC의 4x4, 8x8에서 16x16, 32x32가 추가됩니다.

7) 기존의 In-loop Deblocking 필터와 더불어 픽셀 단위의 오프셋을 추가해주는 SAO 필터가 적용됩니다.


위키를 보고 몇가지만 간략하게 정리해 봤는데 확실히 H.264/AVC 보다는 훨씬 복잡한 것 같습니다.


Doom9을 찾아보니 HM 9.2 버전의 인코더와 디코더가 있길래 테스트 인코딩도 한번 해봤습니다.

똑같은 소스를 x264로도 인코딩해서 PSNR을 비교해 봤는데 아래가 그 결과입니다. (비트레이트를 동일하게 맞췄습니다.)

HM의 결과가 좋게 나오긴 했지만 최적화가 잘 이루어진 x264를 원시적인 HM 인코더와 비교하는 것은 불공평?하다고 볼 수도 있겠네요..

tappencoder.exe -i test.yuv -c encoder_randomaccess_main.cfg -wdt 1280 -hgt 720 -fr 60 -q 30 -b test.h265

x264r2245.exe --preset veryslow --tune psnr --pass 2 --bitrate 1550 --output test.h264 test.avs


Y-PSNR    U-PSNR    V-PSNR

36.9530     43.3453      45.0783   -> HM 9.2 tappencoder (HEVC)

35.5090     41.4520      43.4230   -> x264r2245 (AVC)


그리고 아래는 x264의 --tune psnr을 빼고 인코딩한 영상과의 비교 스크린샷입니다.

일부러 어느쪽이 AVC(x264)이고 어느쪽이 HEVC(tappencoder)인지는 표시를 안 해놨습니다.

스크린샷만 보고 예상한 다음 맨 밑의 결과와 비교해 보세요  ㅎㅎ;

같은 화면의 스크린샷 3장 중 첫 번째가 원본 영상(1280x720)의 스크린샷입니다.

클릭하면 모두 원본 크기로 볼 수 있습니다.

















Posted by 김코덱
TAG , , ,

댓글을 달아 주세요

  1. showgi 2013.01.30 13:17  댓글주소  수정/삭제  댓글쓰기

    차이점이 눈에 보이네요. 일단 합격을 주고 싶은데.. 압축시간이 오래 걸리는데 엄청난 단점이네요..

    • 김코덱 2013.01.30 17:19 신고  댓글주소  수정/삭제

      아무래도 레퍼런스 인코더라서 인코딩 속도가 느리긴 합니다..
      뭐 HEVC는 이제 시작이니까 나중에 x264처럼 오픈 소스로 개발이 진행되면 충분히 사용할 만한 속도가 나오겠죠..
      물론 그때는 컴퓨터 성능도 지금보다 좋아질 테고요

  2. sung129k 2013.03.02 21:42 신고  댓글주소  수정/삭제  댓글쓰기

    이제 kbs2 tv에서 1989년도에 미니시리즈로 방영했던 무풍지대란 드라마를 비디오 코덱을 wmv8->h.264, 오디오 코덱을 wma9->aac로 압축을 시켜놓은 파일이 있는데요. 어도비 미디어 인코더에서 hevc로 인코딩을 하게끔 지원을 해주는데로 한번 hevc로 재코딩 해봐야 겠습니다.
    그런데 동영상의 원래 소스데이터가 일반 VHS 규격 테이프(그것도 테잎에 녹화시켜두신 분은 헤드세척 안하시고 하셔서 영상자체가 말하기가 영~ 좀 그렇네요. ㅜ.ㅜ)에서 컴퓨터에 저장하기위해 변환할때 wmv8 코덱으로 인코딩-> 여기에서 제가다시 h.264로 재코딩 과정에 비트레이트가 많이 깨져서 hevc로 또다시 재코딩 한다면 어떤 결과물이 나올지 진짜 궁금해집니다.

  3. 캐뇽이 2013.04.03 16:14  댓글주소  수정/삭제  댓글쓰기

    똑같은 비트레이트이고 화질도 도 우수하다면 가장 중요한(?) 용량크기는 얼마나 차이 나나요?

  4. 궁금이 2013.06.11 19:56  댓글주소  수정/삭제  댓글쓰기

    안녕하세요!
    친절하게 답변해 주셔서 정말 고맙습니다.
    현재 레퍼런스 인코더로 한번 돌려 보았는데요.. 속도가 너무 느려서 그러는데 방법이 없을까요?
    친절하게 말씀해주셔서 정말 고맙습니다. ^^

  5. 궁금이 2013.06.11 23:08  댓글주소  수정/삭제  댓글쓰기

    옙! 감사합니다. ^^
    저... 근데 HEVC는 Mux 방법은 따로 없을까요?
    웹을 통해 계속 서치를 해보고 있지만.... GPAC에서 MP4box 에서 된다는 말은 있지만,
    찾지를 못하겠습니다. Elecard에서는 Mpeg2 TS 파일을 샘플로 제공하던데 어떻게 만들었는지가 궁금합니다. ㅠㅠ

    • 김코덱 2013.06.12 00:35 신고  댓글주소  수정/삭제

      elecard는 유로라서 해당 프로그램을 구입하는 수 밖에 없는 것 같고요
      mp4box는 방금 테스트를 해보니 먹싱이 되긴 하는데 스트림 정보를 잘못 읽는 것 같네요..
      그런데 ts든 mp4든 먹싱을 한다고 해도 쓸만한 디코더가 없으니 별 소용은 없을 것 같습니다

  6. 궁금이 2013.06.13 00:21  댓글주소  수정/삭제  댓글쓰기

    답변해주셔서 감사합니다. ^^
    전 MP4box로 아무리 먹싱을 해보지만.. 되지를 않는데 ㅠㅠ
    방법 좀 알려주실 수 있으신지요 ㅠㅠ...
    - mp4box -add file.265 -new file.mp4
    - mp4vox -add file.265 ffile.mp4
    위에 두가지로 해보았는데.. 아무리해봐도 안되어서요.. ㅠ

    • 김코덱 2013.06.13 00:57 신고  댓글주소  수정/삭제

      http://gpac.wp.mines-telecom.fr/downloads/gpac-nightly-builds/

      위 링크에서 최신 mp4box을 받아서 해보세요
      그리고 위에서 말씀드린대로 먹싱이 되긴 하는데 스트림 정보를 제대로 못 읽습니다
      프레임 사이즈와 프레임 수를 잘못 인식해서 제대로 된 정보가 안 나옵니다(mediainfo)

  7. 김코덱 2013.06.16 03:51 신고  댓글주소  수정/삭제  댓글쓰기

    HM 11 버전으로 테스트 인코딩을 해보니 최신 mp4box에서 먹싱이 잘 되네요
    프레임 사이즈나 프레임 수도 정상적으로 나옵니다

    mp4box 버전은 4623이고 아래는 먹싱된 mp4파일의 mediainfo 정보입니다.
    ------------------------------------------------------------------------------------
    HEVC import - frame size 1280 x 720 at 60.000 FPS
    HEVC Import results: 46 samples - Slices: 2 I 0 P 44 B - 0 SEI - 1 IDR
    Stream uses forward prediction - stream CTS offset: 3 frames
    Saving to d:\hevc.mp4: 0.500 secs Interleaving
    ------------------------------------------------------------------------------------
    일반
    전체 이름 : hevc.mp4
    포맷 : MPEG-4
    포맷 프로파일 : Base Media
    코덱 ID : iso4
    파일 크기 : 162 KiB
    길이 : 767미리초
    총 비트레이트 : 1 725 Kbps
    인코딩 날짜 : UTC 2013-06-15 18:45:58
    태깅한 날짜 : UTC 2013-06-15 18:45:58

    비디오
    ID : 1
    포맷 : HEVC
    포맷/정보 : High Efficiency Video Coding
    포맷 프로파일 : Main@L18.6
    코덱 ID : hvc1
    코덱 ID/정보 : High Efficiency Video Coding
    길이 : 767미리초
    비트레이트 : 1 711 Kbps
    폭 : 1 280 픽셀
    높이 : 720 픽셀
    화면 종횡비 : 16:9
    프레임레이트 모드 : 고정
    프레임레이트 : 60.000 fps
    ColorSpace : YUV
    ChromaSubsampling : 4:2:0
    BitDepth/String : 8 비트
    비트/(픽셀*프레임) : 0.031
    스트림 크기 : 160 KiB (99%)
    제목 : h265:fmt=HEVC:fps=60@GPAC0.5.1-DEV-rev4623
    인코딩 날짜 : UTC 2013-06-15 18:45:58
    태깅한 날짜 : UTC 2013-06-15 18:45:58

  8. 김코덱 2013.06.16 14:37 신고  댓글주소  수정/삭제  댓글쓰기

    mkv도 정식 지원은 아니지만..DviX에서 패치한 mkvmerge를 사용하면 hevc 먹싱이 가능하네요
    http://labs.divx.com/node/127905

    아래는 패치된 mkvmerge로 먹싱한 mkv 파일의 mediainfo 정보입니다.
    ------------------------------------------------------------------------------------

    일반
    UniqueID/String : 248073178886900647181836839609204056316 (0xBAA12807530B4A18888B29BB4CA9A0FC)
    전체 이름 : hevc.mkv
    포맷 : Matroska
    포맷 버전 : Version 4 / Version 2
    파일 크기 : 166 KiB
    길이 : 416미리초
    총 비트레이트 : 3 267 Kbps
    인코딩 날짜 : UTC 2013-06-16 05:33:04
    인코딩 프로그램 : mkvmerge v6.2.0 ('Promised Land Rovi v1.0.0') built on Jun 3 2013 18:08:56
    인코딩 라이브러리 : libebml v1.3.0 + libmatroska v1.4.0

    비디오
    ID : 1
    포맷 : V_MPEGH/ISO/HEVC
    코덱 ID : V_MPEGH/ISO/HEVC
    폭 : 1 280 픽셀
    높이 : 720 픽셀
    화면 종횡비 : 16:9
    프레임레이트 모드 : 변동
    Default : 예
    Forced : 아니오

  9. SamKo 2013.09.03 16:55  댓글주소  수정/삭제  댓글쓰기

    안녕하세요, 친절하게 설명해주셨는데 염치불구하고 궁금한게 있어서 질문드립니다.

    저는 명령어대로 입력하니
    "Error: Total Number Of Frames encoded must be more than 0"
    라고 나오는데 -f 옵션으로 소스의 총 Frame을 계산해서 넣어야 하나요?

    • 김코덱 2013.09.04 01:14 신고  댓글주소  수정/삭제

      hm 12.0으로 방금 테스트 인코딩을 해보니 저도 똑같은 메시지가 뜨네요
      옵션을 살펴보니 기본값은 모든 프레임을 인코딩하는 거니까 따로 -f 옵션을 안 써도 될 것 같은데 이상하네요
      아무튼 말씀하신대로 -f 옵션으로 프레임 수를 입력하니까 잘 되네요
      이 글은 9.2 버전으로 테스트한 거니까 버전이 올라가면서 뭔가 달라졌나봅니다

      그리고 본문의 명령줄에 오타가 하나 있었는데 출력파일을 -o가 아니라 -b로 입력해야합니다 (지금은 수정했습니다)
      x264옵션과 헷갈려서 -o로 쓴 것 같은데 그러면 비트스트림이 아니라 yuv파일로 출력이 되거든요
      아마 저 위에 먹싱이 안 된다고 하신 분도 오타대로 -o를 쓰셔서 그런게 아닌가 싶네요;