#1. [H.264] 동영상 압축의 기본 개념
#2. [H.264] 동영상 압축의 기본 개념 – RGB, YCbCr, 서브샘플링
#3. [H.264] Block-based Motion Estimation(ME)
#4. [H.264] Discrete Cosine Transform(DCT) 이산 코사인 변환
#5. [H.264] Quantization(양자화)과 Zig-zag scanning

안녕하세요? 맨날맑음 입니다.

#0. 들어가며..

방학을 이용하여, H.264 코덱을 공부하는 것을 목표로 해서 동영상의 인코딩, 디코딩에 관해 배워 나가고 있습니다.

이 내용들은 제가 세미나를 통해 배운 내용을 나름대로 정리하여 잊어 버리지 않게 하는 것이 용도이고, 저도 세미나 도중 이해 가지 않는 부분이 있으므로, 제가 올린 내용이 틀릴 수 있습니다. 내용에 틀린 점이 있을 시 지적해 주시면 즉시 내용을 수정 하도록 하겠습니다.

#1. 동영상이란?

동영상 압축의 기본을 알기 위해선 우선 동영상이 무엇인지 알아야 합니다.

 
-그림1. 동영상의 구조-

위의 그림에서 알 수 있듯이 동영상은 정지된 사진(프레임)이 시간을 축으로 여러 장 모여 있는 것입니다. 즉 주어진 시간 동안 연속으로 촬영된 사진이라 볼 수 있습니다.(사실 여기서 소리도 포함 되야 하지만, 소리는 별도의 인코딩 과정을 거친 후 먹싱 되므로 소리는 빼고 생각해 보겠습니다.)

렇다면 동영상(RGB 비디오)의 데이터 크기는 어떻게 될까요? 프레임은 그림파일(Image)와 같습니다. 예를 들어 512×512의 동영상이 있다고 하면, 이 동영상의 한 프레임을 기준으로 가로 : 512, 세로 : 512개의 점(픽셀)으로 구성되어있으며, 1픽셀은 8bit(256 levels)입니다.  그 중에서 회색이 차지하는 비율만 생각해 보면, Width×Height×Bit(512×512×8)가 됩니다. 그리고 3개의 Color들로 구성 되어있으므로, RGB의 경우 Width×Height×Bit×Color(512×512×8×3)이 되어 6291456bit가 됩니다. 6291456(bit) == 6144(kbit) == 6(mbit) 입니다.

512×512라는 비교적 작은 사이즈의 동영상도 무 압축일 경우, 한 프레임에 6메가라는 큰 사이즈가 되는 것입니다. 동영상서비스를 제공 할 경우 적어도 초당 24프레임을 보장해야 한다고 하니 1초의 동영상에 144메가라는 큰 용량이 필요한 것입니다. 이것이 우리가 동영상 압축을 공부해야 하는 이유이기도 합니다.

네트워크 기술이 많이 발달하였지만, 이런한 무 압축 비디오까지 실시간으로 전송 하는 데는 역부족 입니다. 더군다나 요즘 많이 보급된 FullHD의 경우 1920×1080의 해상도를 지원해야 하기 때문에, 어마어마한 데이터 양이 될 수 밖에 없습니다. 또한 네트워크 대역폭이 이 정보를 전부 전송해 줄 수 있다고 하더라도, 동영상의 크기를 줄여, 그 남는 대역폭을 이용하여 여러 다른 서비스를 제공 해 줄 수도 있을 것입니다.

 

#2. 동영상 압축 기법(동영상 압축을 위한 기본적인 방법)

이러한 동영상을 압축 하려면 어떻게 해야 할까요?

동영상 압축에는 크게 세 가지 기법이 사용 됩니다. 첫번째는 프레임 간의 상관관계 (temproal correlation)이고, 두번째는 공간적인 상관관계(spatial correlation)입니다. 세번째는 저주파 성분에 민감한 시각의 특성을 이용합니다 (DCT 변환).

                        -그림2. 프레임 9-                                                   -그림3. 프레임 10-

먼저 프레임간의 상관관계를 알아보도록 하겠습니다. 그림 2와 3은 각각 같은 동영상(football_sif.yuv)의 9번과 10번 프레임입니다. 마치 같은 그림처럼 닮아있습니다.  근접한 프레임은 거의 비슷한 이미지로 이루어져 있다는 아이디어를 이용하여, 영상의 크기를 줄일 수 있습니다.


-그림 4. Image의 공간적인 중복-

그림 4에서 보는 것과 같이 한 장의 이미지에도 인접한 픽셀간의 정보는 거의 중복 된다는 것을 알 수 있습니다. 이방법으로도 영상의 크기를 줄 일 수 있을 것입니다.

Temporal correlation(프레임간의 상관관계)은  그림 5,6처럼 현재 프레임(t)의 하나의 픽셀(x,y)은 이전 프레임(t-1)의 비슷한 위치(x,y)에 있을 가능성이 높고, 또한 두 필셀 사이에는 유사성이 높다는 것입니다.

                       -그림 5. Frame(t)-                                                -그림 6. Frame(t-1)-

이렇게 프레임(t)에서 프레임(t-1)과의 차를 계산해 보면 중복 데이터가 사라지고, 차이인 그림 7이 나오게 됩니다.


      -그림 7. Frame(t) 와 Frame(t-1)의 Difference - 


이번에 간단한 동영상의 정의와, 동영상을 압축하는 기본적인 방법을 알아 보았습니다. 다음에는 RGB와 YUV를 알아보고, 위에서 간단히 소개한 압축의 기법들을 자세히 소개하는(주파수 도메인(DCT)을 이용한 방법, Motion Estimation 등) 순으로 진행 할 예정이며, 기본적인 지식을 갖춘 후, H.264에 대해서도 알아 보도록 하겠습니다.

Posted by 맨날맑음
,
명령줄 작업

일부 Microsoft Expression Encoder 기능은 명령줄 인터페이스를 사용하여 시작할 수 있습니다. 응용 프로그램의 기본 기능에 익숙하다면 전체 비디오 인코딩 프로세스를 포함하는 명령을 실행할 수도 있습니다.

  1. 명령 프롬프트 창을 엽니다.

  2. Microsoft Expression Encoder 설치 디렉터리로 이동합니다.

  3. 명령 프롬프트에 encoder/?를 입력합니다. 그러면 창에 다음 명령 구문과 함께 사용자가 입력할 수 있는 변수가 나타납니다.

    Encoder.exe /Source <FileName> /Target <FileName> [/OptionName <Value>] [/Preset <PresetFile>] [/LogOn|Off][/Time][/DefaultMarkerThumbnailsOn]

  4. 명령을 입력한 후 다음 단원의 지침에 따라 옵션을 입력합니다.

[/OptionName <Value>] 명령에 다음 옵션 중 하나를 입력합니다.

  • Source <FileName>   원본 비디오 파일의 파일 경로를 지정합니다.

  • Target <FileName>   인코딩된 최종 비디오의 파일 경로를 지정합니다.

  • [/Preset<PresetFile>]   특정 작업(job) 파일의 항목에 적용할 기본 설정을 지정합니다. 기본 설정을 추가할 작업 파일의 파일 이름을 입력합니다.

  • [/Log On|Off]   작업 기본 설정에 대해 로그 파일을 출력합니다.

  • [/Time]   파일 StdOut에 대한 프로세스를 실행하는 데 걸린 시간을 출력합니다.

  • [/DefaultMarkerThumbnailsOn]   입력 파일의 각 마커에 대해 미리 보기를 생성합니다.

  • OverlayFileName:<some string>   비디오의 오버레이로 사용할 이미지 파일의 경로를 지정합니다. Expression Encoder에서는 .jpg, .bmp, .png 및 .jpg 이미지 파일을 지원합니다.

  • OverlayRect:<X,Y,W,H>   오버레이 파일에 대해 지정할 위치 좌표(X [왼쪽],Y [위쪽]) 및 크기(W,H)를 지정합니다. 이 좌표는 출력 비디오 크기를 기준으로 합니다.

  • OverlayOpacity:<X>   오버레이 파일의 투명성 수준을 지정합니다. 이 값은 백분율을 나타내는 소수여야 합니다. 예를 들어 45%의 불투명도로 파일을 표시하려면 .45 값을 입력해야 합니다.

  • OverlayTransparentBackground:<true|false>   Expression Encoder에서 단색 배경을 투명으로 처리할지 여부를 지정합니다.

  • OverlayLoop:<true|false> 오버레이를 반복할지 여부를 지정합니다.

  • OverlayLoopingGap:<HH:MM:SS> 오버레이가 반복되기 전 지속 시간을 지정합니다.

  • OverlayFadeInDuration:< HH:MM:SS> 오버레이의 페이드 인이 지속되는 시간을 지정합니다.

  • OverlayFadeOutDuration:< HH:MM:SS> 오버레이의 페이드 아웃이 지속되는 시간을 지정합니다.

  • OverlayLayoutMode:< MainVideo|WholeSequence|Custom> 비디오에서 오버레이가 나타날 부분을 지정합니다.

  • OverlayStartTime:< HH:MM:SS> 오버레이를 시작할 시간을 지정합니다.

  • OverlayEndTime:<HH:MM:SS> 오버레이를 종료할 시간을 지정합니다.

  • VideoProfile:<Name of Profile>   이전에 프로필을 저장한 경우 저장된 프로필의 이름을 지정합니다.

  • AudioProfile:<Name of Profile>   저장된 프로필의 이름을 지정합니다. 이전에 저장해 둔 프로필이 있어야 합니다.

  • TwoPassEncoding:<true|false>   인코딩 프로세스에 2 패스를 적용할 것인지 여부를 지정합니다.

  • VideoComplexity: <Fastest|Fast|Good|Normal|Better|Best>   비디오 스트림의 인코딩 복잡도를 지정합니다.

  • DeinterlaceMode:<Off|AutoBob|ForceBob|AutoPixelAdaptive|ForcePixelAdaptiveTopFieldFirst> 디인터레이스 모드를 지정합니다.

  • ResizeQuality:<NearestNeighbor|Bilinear|Bicubic|Super|Lanczos> 비디오 크기를 조정하는 데 사용할 알고리즘을 지정합니다.

  • NormalizeAudio:<true|false> 인코딩하는 동안 오디오를 정규화할지 여부를 지정합니다.

  • AudioGainLevel:<X> 오디오 게인 수준을 지정합니다.

  • MaxPacketSize:<X> 패킷의 최대 크기(바이트)를 지정합니다.

  • MinPacketSize:<X> 패킷의 최소 크기(바이트)를 지정합니다.

  • CropRect<X,Y,W,H>   자르기 사각형에 대해 지정할 위치 좌표(X [왼쪽],Y [위쪽]) 및 크기(W,H)를 지정합니다. 이 좌표는 원본 비디오 크기를 기준으로 합니다.

  • VideoSize:<X,Y>   비디오의 최종 크기를 지정합니다.

  • VideoResizeMode:<Stretch|Letterbox>   대상 비디오의 가로 세로 비율이 다를 때 Expression Encoder에서 원본 비디오를 늘일지 아니면 레터박스 형식으로 표시할지 지정하며, 이는 VideoSizeMode를 대신합니다.

  • FileType:<None|Audio|Video> 항목의 파일 형식을 지정합니다. 오디오 또는 비디오 스트림만 출력하도록 설정할 수 있습니다.

  • AspectRatioMode:<SquarePixels|FourThree|SixteenNine|Source|Custom> 가로 세로 비율을 지정합니다.

  • CustomAspectRatio:<X,Y> 사용자 지정 가로 세로 비율을 지정합니다.

  • VideoSizeMode:<ProfileAdaptive|Profile|Source|Custom> 비디오 크기 모드를 지정하며, 이는 VideoPixelSizeMode를 대신합니다.

  • ScriptCommandOutput:<Header|Stream> 스크립트 명령을 헤더에 기록할지, 아니면 스트림에 기록할지를 나타내는 값을 지정합니다.

  • ThumbnailMode:<None|BestFrame|FirstFrame|Custom>   다음 설명에 따라 미리 보기 옵션을 지정합니다.

    • 미리 보기를 비디오와 연결하지 않으려면 없음을 선택합니다.

    • 검정색이나 단색이 아닌, 영상이 시작되는 첫 번째 컬러 프레임을 미리 보기로 사용하려면 최상의 프레임을 선택합니다.

    • 비디오의 첫 번째 프레임을 미리 보기로 사용하려면 첫 번째 프레임을 선택합니다.

    • 비디오에서 나만의 미리 보기를 선택하려면 사용자 지정을 선택합니다.

  • ThumbnailTime :<HH:MM:SS>   미리 보기로 사용할 프레임의 위치를 지정합니다. 이 옵션에 대해 변수를 입력하면 미리 보기 모드가 사용자 지정으로 지정됩니다.

  • ThumbnailCodec:<Jpeg|Bmp|Png|Gif>   미리 보기를 압축하는 방법을 지정합니다.

  • ThumbnailJpegCompression:<X>   파일 이름 옆에 표시될 미리 보기의 JPG 압축 품질을 지정합니다. 1에서 100 사이의 값을 입력할 수 있습니다. 값을 입력하지 않으면 Expression Encoder에서는 기본값인 75를 사용합니다. 압축률이 높으면 품질이 좋아지지만 파일 크기는 커집니다.

  • ThumbnailSize:<X,Y>   미리 보기의 크기를 지정합니다.

  • MarkerThumbnailCodec:<Jpeg|Bmp|Png|Gif>   마커 미리 보기를 압축하는 방법을 지정합니다.

  • MarkerThumbnailJpegCompression:<X>   마커에서 생성되는 미리 보기의 JPG 압축 품질을 지정합니다. 1에서 100 사이의 값을 입력할 수 있습니다. 값을 입력하지 않으면 Expression Encoder에서는 기본값인 75를 사용합니다. 압축률이 높으면 품질이 좋아지지만 파일 크기는 커집니다.

  • MarkerThumbnailSize:<X,Y>   마커 미리 보기의 크기를 지정합니다.

  • LeaderFileName:<some string>   선행부 비디오로 사용할 비디오의 파일 경로를 지정하며, 이는 LeadingClip을 대신합니다.

  • LeaderVideoResizeMode:<Stretch|Letterbox>   주 비디오 크기로 조정할 때 Expression Encoder에서 선행부 클립을 늘릴지 아니면 레터박스로 표시할지를 지정하며, 이는 VideoSizeModeLeadingClip을 대신합니다.

  • TrailerFileName:<some string>   후행부 비디오로 사용할 비디오의 파일 경로를 지정하며, 이는 TrailingClip을 대신합니다.

  • LeaderDuration:<HH:MM:SS> 선행부의 지속 시간을 지정하며, 선행부가 이미지 또는 XAML 파일이면 지속 시간을 변경하는 데 사용할 수 있습니다. 이는 LeadingImageDuration을 대신합니다.

  • TrailerVideoResizeMode:<Stretch|Letterbox>   주 비디오 크기로 조정할 때 Expression Encoder에서 후행부 비디오를 늘릴지 아니면 레터박스로 표시할지를 지정하며, 이는 VideoSizeModeTrailingClip을 대신합니다.

  • TrailerDuration:<HH:MM:SS> 후행부의 지속 시간을 지정하며, 후행부가 이미지 또는 XAML 파일이면 지속 시간을 변경하는 데 사용할 수 있습니다. 이는 TrailingImageDuration을 대신합니다.

  • StartTime:<HH:MM:SS>   비디오 시작 지점을 지정하며, 비디오를 트리밍하는 데 사용합니다.

  • EndTime:<HH:MM:SS>   비디오 끝 지점을 지정하며, 비디오를 트리밍하는 데 사용합니다.

  • OverlayAudioGainLevel:<X> 시각적 오버레이의 오디오 게인 수준을 지정합니다.

  • AudioOverlayFileName:<a string> 비디오에서 오디오 오버레이로 사용할 오디오의 파일 경로를 지정합니다.

  • AudioOverlayLoop:<true|false> 오디오 오버레이를 반복할지 여부를 지정합니다.

  • AudioOverlayLoopingGap:<HH:MM:SS> 오디오 오버레이가 반복되기 전 지속 시간을 지정합니다.

  • AudioOverlayLayoutMode:< MainVideo|WholeSequence|Custom> 비디오에서 오디오 오버레이가 나타날 부분을 지정합니다.

  • AudioOverlayStartTime:<HH:MM:SS> 오디오 오버레이를 시작할 시간을 지정합니다.

  • AudioOverlayEndTime:<HH:MM:SS> 오디오 오버레이를 종료할 시간을 지정합니다.

  • AudioOverlayGainLevel:<X> 오디오 오버레이의 오디오 게인 수준을 지정합니다.

encoder /<command>를 입력하면 다음 기능에 액세스할 수 있습니다.

  • Help   명령 프롬프트에 대한 도움말 파일 내용을 표시합니다.

  • ListProfiles   사용 가능한 모든 사용자 지정 프로필 및 기본 프로필을 표시합니다.

  • JobFile <XEJ file|XML file>   사용자가 지정하는 작업 파일을 엽니다. 이는 JobFile:<XML file>을 대신합니다.

  • ListTemplates    설치한 기본 템플릿 및 사용자 지정 템플릿을 표시합니다.

  • ValidateTemplate <Template Name>   사용자가 지정하는 사용자 지정 템플릿 파일을 컴파일하고 관련 오류를 보고합니다.

    출처 : MSDN Library

Posted by 맨날맑음
,