반응형


2017년 9월 20일 iOS 11이 공식적으로 공개되면서 HEVC와 함께 HEIF가 공개됐다.

그런데, 상대적으로 진입장벽이 높지 않은 HEVC[각주:1]에 비해 이미지 포맷인 HEIF는 진입장벽 자체가 너무 높다.

사실, 현재까지는 윈도우 환경에서는 HEIF 포맷을 재생할 수 있는 프로그램 자체가 아예 없다[각주:2].



1. HEIF 변환 프로그램


그런데, 눈을 조금만 돌려보면 HEIF를 다른 포맷으로 변환할 수 있는 프로그램은 있다.

최초의 HEIF 변환 프로그램이라고 광고하는 iMazing이 대표적이다.


그런데, 이 프로그램은 광고에 비해선 실속이 좀 없는 편이다.

일단, 변환할 수 있는 HEIF 파일은 오로지 iOS 11에서 만들어진 파일만 가능하다.

JPEG로 변환시에 품질을 별도로 지정할 수도 없고, Exif 및 색상 프로파일 처리도 미숙[각주:3]하다.


유사한 프로그램인 iMyFone HEIC Converter는 아예 iOS에서 만들어진 파일만 변환할 수 있다고 명시[각주:4] 해뒀다.

유료 프로그램인데, 이 정도면 뭔가 좀 많이 아깝다는 생각이 든다.


유료 프로그램이 이 정도면 많이 아쉬움



2. HEIF 변환 사이트


ACONVERT.COM 등의 사이트에서는 온라인 환경에서 HEIF 파일을 다른 포맷으로 변환할 수 있다.


하지만, 변환의 한계는 변환 프로그램들과 사실상 동일한데다, 굳이 내 파일을 온라인으로 올리는 찝찝함을 덤으로 얻을 수 있다.



3. 기존 솔루션들의 한계


앞에서도 설명했지만, 가장 큰 문제는 iOS에서 만들어진 HEIF 이미지만 변환이 가능하다는 점이다.

당연한 얘기지만, HEIF 파일은 애플만의 전유물이 아니다.


노키아에서는 호환성 테스트를 위한 HEIF 이미지들을 github를 통해 배포하고 있다.

jpg2heif.com에서도 HEIF 이미지[각주:5]를 받을 수 있다.


이렇게 서로 다른 소스에서 받은 이미지들은 각각의 솔루션에서 거의 변환이 되지 않는다[각주:6].


또한, 프로그램들마다 조금씩 차이는 있지만, Exif, 색상 프로파일을 제대로 처리하는 솔루션이 별로 없다.


즉 정리하자면, 대부분의 솔루션은 오로지 iOS에서 만든 이미지만 변환할 수 있는데다가 다양한 부가 정보들을 유지하지 못한다는 것이다.



4. 원론으로 돌아가보면 역시 오픈 소스!


언제나 그러하듯이, 비디오/오디오/이미지 포맷이 공개되면 가장 발빠르게 움직이는 쪽은 오픈소스 진영이다.


규격에 명시되어있듯이 HEIF는 완전히 새로운 포맷이 아니라 기존에 존재하는 ISO base Media Format을 기반으로 한다.

그리고, 이 포맷을 가장 잘 다루는 쪽은 mp4box로 유명한 GPAC이다.


여러 차례(#901, #905, #942) 제기된 기능추가 및 수정보완이 반영된 결과, mp4box로 HEIF 내의 HEVC를 깔끔하게 추출하는 것이 가능해졌다.


d:\down>mp4box -info IMG_4178.HEIC
prof colour profile not supported
prof colour profile not supported
Root Meta type: "pict" - 52 resource item(s)
Primary Item - ID 49
Item #1 - ID 1 - type hvc1  - Name:
Item #2 - ID 2 - type hvc1  - Name:
Item #3 - ID 3 - type hvc1  - Name:
Item #4 - ID 4 - type hvc1  - Name:
Item #5 - ID 5 - type hvc1  - Name:

(...)

Item #46 - ID 46 - type hvc1  - Name:
Item #47 - ID 47 - type hvc1  - Name:
Item #48 - ID 48 - type hvc1  - Name:
Item #49 - ID 49 - type grid  - Name:
Item #50 - ID 50 - type hvc1  - Name:
Item #51 - ID 51 - type Exif  - Name:
File has no movie (moov) - static data container

d:\down>mp4box -dump-item 1:path=1.hevc IMG_4178.HEIC prof colour profile not supported prof colour profile not supported d:\down>


참고로, 위의 화면에서 알 수 있는 것은 다음과 같다.


1. IMG_4178.HEIC 파일은 총 51개의 아이템으로 구분됨

2. ID 1~48까지 48개의 HEVC 이미지가 들어있고, grid 방식으로 처리해야 함

3. 썸네일이 ID 50에 저장됨

4. Exif 정보는 ID 51에 저장됨

5. ID 1을 추출했음



d:\down>ffmpeg -i 1.hevc -frames:v 1 -vsync vfr -an 1.png
ffmpeg version N-89409-g4678339e74 Copyright (c) 2000-2017 the FFmpeg developers
  built with gcc 7.2.0 (GCC)
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-bzlib --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-cuda --enable-cuvid --enable-d3d11va --enable-nvenc --enable-dxva2 --enable-avisynth --enable-libmfx
  libavutil      56.  5.100 / 56.  5.100
  libavcodec     58.  6.103 / 58.  6.103
  libavformat    58.  2.103 / 58.  2.103
  libavdevice    58.  0.100 / 58.  0.100
  libavfilter     7.  7.100 /  7.  7.100
  libswscale      5.  0.101 /  5.  0.101
  libswresample   3.  0.101 /  3.  0.101
  libpostproc    55.  0.100 / 55.  0.100
[hevc @ 0000026a7c73c9a0] missing picture in access unit
Input #0, hevc, from '1.hevc':
  Duration: N/A, bitrate: N/A
    Stream #0:0: Video: hevc (Main Still Picture), yuvj420p(pc), 512x512, 25 tbr, 1200k tbn, 25 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (hevc (native) -> png (native))
Press [q] to stop, [?] for help
[swscaler @ 0000026a7c928e80] deprecated pixel format used, make sure you did set range correctly
Output #0, image2, to '1.png':
  Metadata:
    encoder         : Lavf58.2.103
    Stream #0:0: Video: png, rgb24, 512x512, q=2-31, 200 kb/s, 25 fps, 25 tbn, 25 tbc
    Metadata:
      encoder         : Lavc58.6.103 png
frame=    1 fps=0.0 q=-0.0 Lsize=N/A time=00:00:00.04 bitrate=N/A speed=0.548x
video:145kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown

d:\down>


그리고, 위에서 추출한 1.hevc를 PNG로 변환하면 아래와 같다.




5. 파일 구조 분석


앞에서 대략 확인된 것은 HEIF 내에서 이미지가 여러조각으로 나뉘어 저장된다는 것과, 이걸 잘 이어붙이면 이미지를 구성할 수 있다는 것까지다.

그런데, 모든 HEIF가 그런 식으로 저장하는지[각주:7], 다른 방식도 있을텐데 그러한 방식들은 어떻게 식별할 수 있는지 등등에 대해 제대로 된 분석이 필요하다.


일단, ISOBMFF 포맷은 널리 알려진 바와 같고, HEIF에 대해선 애플에서 공개해놓은 자료를 보면 상당부분 이해할 수 있다.

또한, 노키아에서 공개한 자료에서도 많은 부분을 참고할 수 있다.


이 내용들을 종합해보면 대략 다음과 같은 정리가 가능하며, 이러한 정보들은 해당 영역을 파일에서 직접 읽어 파악할 수 있다.


1. iOS는 HEIF 저장시 512×512의 타일로 쪼개서 저장함


2. 반드시 타일로 쪼갤 필요는 없으며, 노키아 테스트 이미지들은 모두 한 장이 통째로 저장돼있음


3. JPEG에서 Exif에 저장하는 정보 중 일부[각주:8]는 HEIF의 meta 영역에 저장돼있음


4. JPEG에 없던 정보들 중 HEIF에 추가된 정보[각주:9]들도 있음


5. Animated-GIF와 유사하게 여러장의 이미지 저장 가능


6. HEIF는 컨테이너일 뿐이고, 내부 포맷은 HEVC, H.264[각주:10]JPEG[각주:11] 까지 가능



6. 결론


mp4box와 ffmpeg이 대부분의 작업을 처리하도록 시키고 다시 조합한 뒤 다른 포맷으로 변환하는 프로그램을 만들 수 있다.



덧1. mp4box만 얘기했지만, 사실 ffmpeg도 이 과정에서 수정 요청이 있었고, 반영되어 변환이 가능해졌다.

다름 아니라 PNG로 저장할 때 오류를 뿜어내어 정상적인 처리가 불가능했음.


덧2. 앞에서 보여준 타일은 지인이 HEIF 포맷 분석하라고 보내준 파일의 좌측 상단이며, 전체를 붙여보면 아래와 같다.

보내주실 때 본인은 이런 사진인지 모르셨다고[…]


좌측 상단 구석탱이를 보라…



  1. 이미 대부분의 동영상 재생 프로그램들이 HEVC 포맷을 지원함 [본문으로]
  2. 참고로, 빠른 동작으로 유명한 꿀뷰의 경우 제작사에 문의했으나, 특허 문제로 지원 계획이 없다는 답변을 들었음. [본문으로]
  3. 처음 나왔을 때는 Exif 정보 및 색상 프로파일 등을 모두 삭제했었지만, 지금 홈페이지에 명시된 설명을 보면 이 부분은 보강한 것 같음 [본문으로]
  4. iMazing도 같은 한계가 있는데, 별도로 명시해놓지 않았음 [본문으로]
  5. 본 포스팅 맨 위의 이미지인 "낙타"임 [본문으로]
  6. 비교하자면, 포토샵에서 만든 jpeg 파일을 Paint.NET에서 읽지 못하는 상황임 [본문으로]
  7. 당연한 얘기지만, 비디오 포맷인 HEVC는 결코 그럴 리가 없음 [본문으로]
  8. rotate(orientation) 등등. 특히 orientation은 rotate와 mirror로 분리되었음 [본문으로]
  9. crop 영역 지정(심지어 유리수 형태로 지정) 등 [본문으로]
  10. 노키아 샘플 중에는 H.264 포맷의 HEIF가 있음 [본문으로]
  11. 샘플 중에선 이런 엽기적인 놈은 없었지만, iOS에서 생성한 HEIF의 경우 썸네일이 jpeg인 경우가 있음 [본문으로]
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band