모두의 dream

H.264 AVC 코덱 분석 본문

분야/Digital Forensics

H.264 AVC 코덱 분석

오리꽥이로 2023. 8. 15. 10:50

I. 비디오 압축

코덱을 설명하기 전에 비디오가 어떻게 코덱을 이용하여 인코딩을 진행하는 과정까지 가는지 알아보자.

이 글을 작성하는 본인도 비디오 전문가가 아니기 때문에 대충 이런 과정을 거친다 정도로만 이해한 내용들이다.

 

비디오를 녹화하게 되면 가공되지 않는 RAW 데이터가 생성된다.

이 RAW 데이터는 YUV 포맷과 같은 후처리 과정을 통해 비디오 인코딩 이전의 RAW 상태에 준하는 데이터가 생성된다.

RAW 데이터는 크기가 너무 크고 무겁기 때문에 효율적인 저장 공간 확보와 전송을 위해서 인코딩(압축) 과정이 필요하다.

 

비디오나 음악 같은 파일의 RAW 데이터를 인코딩(압축)하거나 디코딩(압축 해제) 하는 하드웨어 또는 소프트웨어를 코덱이라고 부른다. 비디오 압축을 진행하는 방식에는 여러가지가 존재하는데 그 중 하나가 H.264 코덱이다.

이외에도 MPEG, H.265 등의 코덱이 존재한다.

 

아래는 FHD 영상의 코덱별 차이를 Chat GPT 가 알려준 내용인데 정확하진 않을 수 있지만 코덱을 이해하는데는 문제없다.

포맷 크기 설명
RAW (미압축) 약 6~10GB 저장 불가 수준
H.264 압축 약 50~100MB 실용적인 용량
H.265 (HEVC) 약 30~60MB H.264보다 더 고효율 압축

 

이렇게 코덱으로 압축된 비디오 파일은 이후 컨테이너라는 또 다른 포맷에 저장된다. (Muxing, Multiplexing)

이때 본 포스팅의 핵심인 NAL Unit 이 기존 형태와는 다르게 저장되므로 NAL Unit을 분석하기 위해선 디먹싱 (Demux, Demultiplexing) 을 진행해야 된다. (자세한 내용은 4장에서 다룬다)

 

컨테이너 개념에 대한 내용은 아래 링크 참고.

https://roklcw.tistory.com/54

 

컨테이너와 코덱 (with avi, mp4)

포스팅 내용 요약비디오 파일의 구성요소인 컨테이너와 코덱의 정의avi 컨테이너 구조I. 컨테이너 (Container, 보관함)동영상(비디오) 파일을 구성하고 있는 가장 큰 단위.컨테이너 안에 비디오 데

roklcw.tistory.com

II. H.264 코덱

현재 가장 많이 사용되는 코덱 중 하나인 동영상 표준 규격이며 호환성이 좋다.

avi, mp4 컨테이너에서 주로 사용되며 AVC(Advanced Video Coding) 로도 통용된다.

III. H.264 코덱 구조

H.264 비디오 데이터는 NAL(Network Abstraction Layer) 구조로 되어 있다.

NAL (Network Abstraction Layer)

NAL은 네트워크 환경에서 비디오를 전송하기 쉽게 만들기 위해 설계된 기술이다. (ex. 실시간 스트리밍, 영상 통화, 동영상 공유 플랫폼)

그리고 NAL은 여러개의 NAL Unit을 이용하여 비디오 데이터를 저장하거나 전송한다.

 

조금 깊게 들어가면 비디오의 원 데이터는 SODB (String Of Data Bits) 이며, 이걸 네트워크 전송에 적합하게 바꾼걸 RBSP (Raw Byte Sequence Payload) 라고 하고, 네트워크로 전송하거나 저장할때 사용되는 단위는 NAL (Network Abstarction Layer) Unit 이라고 한다. (굳이 SODB와 RBSP를 깊게 볼 필요는 없을 것 같아서 본 포스팅에서는 NAL 만 다룬다.)

NAL Unit

NAL Unit은 Start Code와 헤더, 페이로드로 구성되어 있다. 

+-------------------------+
| Start Code (00 00 01)   | 
+-------------------------+
| NAL Header (1 byte)     |
+-------------------------+
| Payload (압축된 비디오) |
+-------------------------+

 

페이로드는 실제 압축된 비디오 데이터, NAL Header에는 해당 Unit이 어떤 데이터인지 나타내는 값이 있다.

 

Start Code는 NAL Unit의 시작을 구분하기 위한 데이터로 3 btyes 방식과 4 bytes 방식으로 나뉜다.

3 bytes: 00 00 01

4 bytes: 00 00 00 01

 

Start Header에는 해당 Unit이 어떤 데이터인지 나타내는 값이 있다.

비트 위치 의미
bit 7 forbidden_zero_bit (항상 0이어야 함)
bit 6~5 nal_ref_idc
bit 4~0 nal_unit_type (이게 무슨 데이터인지) 👈 핵심

 

nal_unit_type이 해당 Nal Unit이 어떤 데이터인지에 대한 값을 가지고 있으며 주로 아래 값들이 사용된다.

Type 의미 설명
1 non-IDR picture (P-frame) 이전 프레임을 기반으로 예측된 압축 프레임
2 IDR picture (I-frame) 독립적으로 디코딩 가능한 프레임 (Key Frame)
7 SPS (Sequence Parameter Set) 전체 영상에 대한 전역 설정 정보 (해상도, 프레임 속도 등)
8 PPS (Picture Parameter Set) 개별 프레임 처리에 필요한 설정 (entropy coding, slice 설정 등)

 

예시) NAL Unit: 00 00 00 01 67

Start Code: 00 00 00 01

NAL Header: 0x67 → 0110 0111

NAL Unit의 nal_ref_idc 값에 따라 변경되는 NAL Unit 값

예시 1) nal_ref_idc 값이 10진수 3 (2진수: 11) 이라면 NAL Type에 따른 NAL Unit은 아래의 값들을 가지게 된다.

용도 Type 의미 binary (2진수) Hex 값 NAL Unit (Start code 4 bytes)
P-frame 1 non-IDR picture (P-frame) 01100001 0x61 00 00 00 01 61
I-frame 2 IDR picture (I-frame) 01100101 0x65 00 00 00 01 65
SPS 7 SPS (Sequence Parameter Set) 01100111 0x67 00 00 00 01 67
PPS 8 PPS (Picture Parameter Set) 01101000 0x68 00 00 00 01 68

 

예시 2) nal_ref_idc 값이 10진수 2 (2진수: 10) 이라면 NAL Type에 따른 NAL Unit은 아래의 값들을 가지게 된다.

용도 Type 의미 binary (2진수) Hex 값 NAL Unit (Start code 4 bytes)
P-frame 1 non-IDR picture (P-frame) 01000001 0x41 00 00 00 01 41
I-frame 2 IDR picture (I-frame) 01000101 0x45 00 00 00 01 45
SPS 7 SPS (Sequence Parameter Set) 01000111 0x47 00 00 00 01 47
PPS 8 PPS (Picture Parameter Set) 01001000 0x48 00 00 00 01 48

 

예시 3) nal_ref_idc 값이 10진수 1 (2진수: 01) 이라면 NAL Type에 따른 NAL Unit은 아래의 값들을 가지게 된다.

용도 Type 의미 binary (2진수) Hex 값 NAL Unit (Start code 4 bytes)
P-frame 1 non-IDR picture (P-frame) 00100001 0x21 00 00 00 01 21
I-frame 2 IDR picture (I-frame) 00100101 0x25 00 00 00 01 25
SPS 7 SPS (Sequence Parameter Set) 00100111 0x27 00 00 00 01 27
PPS 8 PPS (Picture Parameter Set) 00101000 0x28 00 00 00 01 28

 

예시 4) nal_ref_idc 값이 10진수 0 (2진수: 00) 이라면 NAL Type에 따른 NAL Unit은 아래의 값들을 가지게 된다.

용도 Type 의미 binary (2진수) Hex 값 NAL Unit (Start code 4 bytes)
P-frame 1 non-IDR picture (P-frame) 00000001 0x01 00 00 00 01 01
I-frame 2 IDR picture (I-frame) 00000101 0x5 00 00 00 01 05
SPS 7 SPS (Sequence Parameter Set) 00000111 0x7 00 00 00 01 07
PPS 8 PPS (Picture Parameter Set) 00001000 0x8 00 00 00 01 08

NAL type

위에서 설명한 nal_unit_type 중 SPS, PPS, I-frame, P-frame을 자세히 확인해보자.

SPS, PPS

i-frame과 함께 붙어 있으며 영상에 대한 디코딩 정보, 메타데이터 등으로 구성되어 있다.

GOP(Group Of Picture)

iframe(IDR Frame), pframe(non-IDR Frame), bframe을 포함하고 있다.

본 포스팅에선 iframe, pframe만 다룬다.

i frame과 pframe

iframe은 단일 프레임 한 장을 의미하며, pframe은 기존 단일 프레임에서 변경되는 부분(움직이는 부분)을 의미한다.

따라서 iframe 한 개에 여러개의 pframe이 붙게 된다.

IV. H.264 코덱 프레임 추출

h.264 코덱이 사용되는 mp4 파일에서 동영상에 사용된 프레임을 추출하는 실습을 진행해보자.

실습 파일은 어떤 영상이든 비디오 코덱이 H.264 (AVC) 면 상관없다.

 

먼저 실습 대상 파일의 비디오 코덱을 mediaInfo 프로그램을 통해 확인한다.

mediaInfo 프로그램을 통해 확인한 비디오 파일 정보

 

h.264 코덱의 프레임을 추출하기 위해서는 NAL Unit 중 SPS, PPS, iframe을 추출해야 한다.

가장 처음 설명했던 것 처럼 mp4 컨테이너는 먹싱이 진행된 구조이므로 NAL_Unit의 hex 값으로 데이터를 파싱할 수 없다.

 

mp4의 경우 mdat에 데이터들이 존재하지만 영상 데이터 뿐만 아니라 오디오 데이터도 함께 있다.

 

온전한 NAL_Unit을 확보하기 위해 FFMEG를 이용하여 H.264 코덱으로 디먹싱을 진행해준다.

ffmpeg -i "mp4 파일" -c:v copy -bsf:v h264_mp4toannexb -an output.h264

-i / 입력 MP4 파일
-c:v copy / 비디오 스트림만 복사 (재인코딩 X)
-bsf:v h264_mp4toannexb	/ Start Code 붙이기 (NAL 변환)
-an / 오디오 제거
output.h264 / 디먹싱 결과 파일명

 

디먹싱한 결과를 보면 우리가 아는 SPS, PPS, I-frame, P-frame을 확인할 수 있다.

winhex를 이용해 확인한 NAL_Unit

SPS, PPS, I-frame을 추출해주면 온전한 프레임 1장을 추출할 수 있다. (I-frame은 P-frame이 나오기 전까지 선택한 후 추출해줬다.)

추출한 데이터는 ffmpeg를 이용하여 jpg 파일 형태로 변환해준다.

ffmpeg.exe -i "mp4 파일명" -q:v output.jpg

-i / 입력 MP4 파일
-q:v 1 / 이미지 품질 (숫자가 낮을 수록 품질이 좋음)

 

가끔 SPS, PPS 없이 I-frame만 있는 경우가 있는데 이럴땐 그 위에서 사용된 SPS, PPS 값을 추출한 I-frame 위에 추가해주면 된다. 

 

그리고 FFMPEG를 이용하여 RAW 상태에 준하는 데이터인 yuv 파일로 디코딩도 할 수 있다.

ffmpeg.exe -i "mp4 파일명" -pix_fmt yuv420p -vsync 0 output.yuv

-pix_fmt yuv420p / 출력 픽셀 포맷 (YUV 4:2:0)
-vsync 0 / 프레임 유지
output.yuv / 비압축 디코딩 프레임 저장

 

디코딩된 파일 크기를 확인해보면 왜 인코딩을 해야하는지 알 수 있다.

인코딩 된 파일 / 디코딩 된 파일

IV. Reference

https://blog.naver.com/hosang46/221142608089

https://www.1floorup.com/blog/trends/2018-motion-design-trends-datamoshing/

https://doc-kurento.readthedocs.io/en/latest/knowledge/h264.html#sps-pps

 

'분야 > Digital Forensics' 카테고리의 다른 글

윈도우 아티팩트 정리  (1) 2023.09.07
NTFS 삭제된 파일 복원  (1) 2023.08.29
파일시스템 분석 실습 준비 (vmdk & 이미징)  (0) 2023.08.28
NTFS File System  (1) 2023.08.28
컨테이너와 코덱 (with avi, mp4)  (1) 2023.01.02