조회 수 5585 추천 수 2 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

■ FFmpeg 명령어 구조와 샤나인코더에서의 적용

동영상 인코딩 작업이 어떤 흐름으로 진행되는지는 인코딩 작업의 흐름도(인포그래픽)을 통해 인포그래픽 형식으로 소개했습니다. 이렇게 나뉜 단계들이 FFmpeg에서 어떻게 하나의 명령줄로 한 묶음으로 진행되는지는 다음 도표를 보면 이해하실 수 있습니다.

 

 

<터미널 또는 도스창에서의 FFmpeg 명령줄 구성 ({와 }는 실제 사용되지 않음)>

 

FFmpeg은 하나 이상의 input을 받을 수 있으며, 입력받는 순서대로 내부적으로 0, 1, 2,... 와 같이 번호를 매깁니다.

 

일반적인 FFmpeg 명령어는 위 도표와 같이 구성돼 있는데, "-i {input 파일}"을 중심으로 그 이전 옵션들은 input에 작용하는 옵션, 그 이후의 옵션들은 output을 위한 옵션이 됩니다. 따라서 동일한 옵션이라도 -i 이전에 들어가느냐, 이후에 들어가느냐에 따라 작동하는 방식이 다르게 됩니다.

 

예) -ss (set start, 구간 자르기 시작점), -c:v (비디오 코덱), -f (format, 파일 포맷 지정) 등

 

"-i {input 파일}" 이전에 들어가는 input 옵션들은 디먹싱과 디코딩과 관련된 옵션들입니다. 실제 FFmpeg는 이 옵션을 받아 "-i {input 파일}" 이후에 디먹싱과 디코딩을 진행합니다.

 

그 이후에 들어가는 output 옵션 중 "-map" 옵션(스트림 매핑)은 input 파일이 갖고 있는 비디오/오디오/자막/기타 스트림 중 어떤 스트림을 output 파일에 담을 것인지 하는 주문 내역입니다. 이 옵션이 생략돼 있다면 FFmpeg는 output 파일의 형식이 기본적으로 담을 수 있는 가장 적절한 비디오/오디오/자막/기타 스트림들 중 하나씩을 선택해서 담게 됩니다. 대개 비디오는 해상도가 가장 높은 것으로, 오디오는 채널이 가장 많은 것으로, 자막은 "default" 표시가 있거나 첫 번째 순서에 있는 텍스트 자막으로 담깁니다.

 

필터와 인코딩 관련 부분은 디코딩이 이미 진행된 비압축 데이터(raw data)를 대상으로 작업을 하게 됩니다. 필터 설정에 따라 비압축 데이터에 필터 작업을 마친 후, 코덱의 설정에 따라 압축(인코딩)을 진행하는 것입니다.

 

인코딩이 끝난 비디오와 오디오 스트림은 그 이후의 먹싱 관련 옵션(-vn (비디오 없음), -an (오디오 없음), -sn (자막 없음), -f (특정 파일 포맷 지정) 등) 및 태그/메타데이터 관련 옵션(-map_metadata, -map_chapters, -metadata, -tag 등)을 반영하여 FFmpeg가 한꺼번에 먹싱을 하게 됩니다.

 


 

<예> ffmpeg -i INPUT -itsoffset -0.5 -i INPUT -map 0:v -map 1:a -c copy OUTPUT

 

비디오에 비해 0.5초 정도 느린 오디오를 리먹싱으로만 수정하는 위의 명령어를 FFmpeg가 해석하는 방식은 아래와 같습니다.

 

-i INPUT ⇒ '0'으로 인식

 

-itsoffset -0.5 -i INPUTINPUT 파일(첫 번째 입력과 동일한 파일) 타임스탬프를 0.5초 앞당긴 뒤 '1'로 인식

(이때 "-itsoffset -0.5"는 두 번째 input에 대한 옵션)

 

-map 0:v -map 1:a ⇒ '0'의 'v' 스트림(비디오)과 '1'의 'a' 스트림(오디오)을 출력 파일에 담을 것을 기억

 

-c copy ⇒ 디코딩까지는 하지 않고 디먹싱한 스트림들을 그대로(copy) 준비

 

OUTPUTOUTPUT 파일의 확장자를 살펴서 방식에 맞게 먹싱

 


 

FFmpeg의 명령어 구조를 샤나인코더에서 어떻게 구현하는지는 매개변수 창(단축키 F8)을 띄워보면 확인해볼 수 있습니다.

 

 

본질적으로 명령행 기반(CLI: command-line interface)의 프로그램인 FFmpeg를 GUI(graphical user interface) 환경에서 편리하게 이용하도록 한 것이 샤나인코더입니다. 그러한 이유로 샤나인코더는 사용자 편의성을 위해 FFmpeg의 기능 중 일부를 생략할 수밖에 없는데, 대표적인 몇 가지 예를 들면 다음과 같습니다.

 

다중 입력 지원 미비: 두 번째 input 이후부터는 샤나인코더가 설치된 폴더에 해당 파일을 옮기고 매개변수 창의 인코딩 설정 부분에 추가 input 명령을 삽입해야 하는 불편함이 있음

스트림 매핑은 파일 목록에서 오른쪽 클릭 후 '비디오/오디오 스트림 선택' 명령을 통해서 작업: 매개변수 창의 인코딩 설정 부분에 -map 옵션 설정을 추가할 수 있지만 예측한 대로 정확하게 동작하지 않을 때가 있어 주의가 필요함. 그리고 필터그래프에 의한 동적인 스트림 매핑은 구현 불가능 (샤나인코더의 기본 스트림 매핑 기능과 충돌)

③ 인코딩 엔진인 FFmpeg가 개발자인 Rina님이 컴파일해서 제공하는 라이브러리에만 전적으로 의존하므로 사용자가 선택적으로 빌드한 FFmpeg 엔진을 사용할 수 없음

 

그리고 샤나인코더는 FFmpeg 기반이니만큼 FFmpeg가 갖고 있는 한계 역시 갖게 된다는 것은 어쩔 수 없습니다.

(예: 엔비디아 그래픽 카드 동시 인코딩 수 제한, 코덱에 따라 최대 사용 가능한 스레드 수 제한, 자막 입히기 시 줄 간격 조정이 불가능한 문제 등)

 

■ FFmpeg 명령어 우선 순위

위에서 소개해드린 대로 FFmpeg가 작업을 진행하는 방식을 이해하게 되면 다음의 FFmpeg 명령어 우선 순위를 이해할 수 있습니다.

 

기본적으로 FFmpeg는 하나의 줄에 모든 명령어들이 입력되므로 먼저 오는 쪽이 우선 순위가 있습니다. 단, 뒤에 오더라도 작업 흐름에서 작용하는 단계가 순서상 앞이라면 우선 순위를 가집니다. (예를 들어 먹싱이나 메타데이터 옵션이 인코딩 옵션보다 앞에 와도 무방)

 

○ 필터 간 우선 순위

이것이 가장 정확하게 적용되는 것이 필터들인데, -vf 이후 여러 개의 필터가 쉼표(,)로 구분되어 앞쪽에 먼저 오는 필터가 먼저 처리되며 뒤쪽에 오는 필터는 바로 앞 필터의 출력값을 입력값으로 받게 됩니다.

 

예를 들어 crop(화면 자르기) 이후 scale(해상도 리사이즈) 필터가 나온다면 화면을 먼저 자르고(crop) 해상도 리사이즈(scale)를 하게 되지만, 순서가 바뀐다면 일단 해상도 변경을 하고 화면 자르기가 나중에 적용됩니다.

 

(참고로, 샤나인코더에서는 [구간 설정/자르기] 옵션으로 화면 자르기 필터를 적용하면 [빠른 설정(F6)]의 [영상 사이즈 변경(해상도 변경)]보다 항상 우선적으로 적용됩니다.)

 

따라서 필터에 따라 우선 순위 설정은 중요한데, 대개 디인터레이싱이 앞쪽에, 자막 입히는 작업이 뒤쪽에 오는 것이 일반적입니다. 필터에 따라서는 입력과 출력되는 비압축 데이터(raw data)의 형식이 제한적인 경우도 있어 반드시 특정 필터의 앞이나 뒤에 와야 하는 경우도 있기 때문에 이런 것도 고려해야 합니다.

 

여러 개의 필터를 사용할 때 또 하나 고려해야 할 사항은 CPU의 부하입니다. 소프트웨어 필터가 많으면 많을수록 CPU에 많은 부담을 주어 인코딩 작업 속도가 느려지니 주의해야 합니다. 하드웨어 필터의 경우에는 그래픽 카드에 부담이 갈 정도로 정교한 필터는 우리가 쉽게 구할 수 있는 수준에서는 아직 없습니다.

 

○ 코덱 설정 간 우선 순위

코덱 설정에도 두 가지 옵션이 있는데, 특정 코덱 고유의 옵션(private options)과 FFmpeg가 모든 코덱에서 사용할 수 있게 한 일반 옵션(global options)이 있습니다. 예를 들어 x264의 경우 x264 고유의 옵션은 -x264-params (=-x264opts) 뒤에 놓고 콜론(:)으로 각 고유 옵션들을 구분하고, x265의 경우엔 -x265-params 뒤에 고유 옵션을 둡니다.

 

일반 옵션은 -profile, -level, -preset, -tune, 비트레이트를 나타내는 -b:v-b:a, -crf, -r (프레임 레이트), -ar (오디오 샘플레이트), -ac (오디오 채널) 등 코덱이라면 가지고 있을 일반적인 특성들에 대한 옵션입니다.

 

둘의 설정이 충돌할 경우 일반 옵션보다 고유 옵션이 우선 순위를 가집니다. 예를 들어 일반 옵션에서는 high 프로파일을 설정했더라도 고유 옵션에서 main 프로파일을 설정한다면 프로파일은 main이 되는 식입니다.

 

프리셋, 튠, 사용자 설정 옵션은 뒤로 갈수록 우선 순위를 가집니다. 즉, x264에서 프리셋을 'medium'으로 설정했다 하더라도 사용자가 "-x264-params me=umh"와 같이 ME(motion estimation) 옵션을 'umh'로 따로 설정했다면 medium 프리셋이 설정한 기본값인 'hex'는 사용자가 설정한 옵션값에 의해 무시됩니다.

 

이와 비슷하게, 사용자가 지정한 고유 옵션 설정은 사용자가 지정한 일반 옵션 설정보다 우선 순위를 가집니다. 예를 들어 x264에서 재생기기의 한계를 고려해 일반 옵션 "-level 4.1"을 설정한다면 FHD 영상에서 Ref Frames 값은 프리셋과 여러 가지 상황을 고려, 내부적으로 계산해 3 ~ 4 정도로 설정됩니다. 하지만 사용자가 "-x264-params ref=2"와 같이 x264 고유 옵션을 따로 설정하게 된다면 실제로 적용되는 Ref Frames 값은 2가 됩니다. 이렇게 인코딩된 동영상은 미디어인포로 살펴보면 Ref Frames 값이 레벨에서 설정한 값으로 표기되어 실제 옵션 설정값과는 차이가 생길 수 있으니 주의가 필요합니다.

 

 

이 글을 추천한 사람
Prosecol
Facebook Twitter Pinterest Kakao

List of Articles
번호 제목 글쓴이 날짜 조회 수 추천 수
53 HEVC 코덱 설정->튜닝 옵션별 각 화질 비교 4 file 바봉이 2020.02.05 18672 0
52 H264(AMF), HEVC(AMF) 옵션 도움말 1 JKyle 2020.02.03 9327 0
51 H264(NVENC), HEVC(NVENC) 옵션 도움말 1 JKyle 2020.02.03 11584 0
50 필터 적용 사례: 로고/워터마크 제거 1 JKyle 2020.01.31 8973 2
49 HDR 영상과 10비트 영상 3 JKyle 2020.01.29 14755 3
48 색공간과 Bit Depth 4 JKyle 2020.01.28 7961 2
47 샤나인코더 영상 사이즈 변경 옵션을 통한 FFmpeg 필터의 기초 이해 4 JKyle 2020.01.27 11722 3
46 샤나인코더의 H264 설정과 FFmpeg의 x264 설정 이해 8 JKyle 2020.01.27 27977 2
» FFmpeg 명령어 구조와 샤나인코더 작동 방식 이해 JKyle 2020.01.26 5585 2
44 [인포그래픽] 인코딩 작업 흐름과 자막 작업 1 JKyle 2020.01.25 3458 0
43 [인포그래픽] 인코딩 작업의 흐름도 1 JKyle 2020.01.25 6442 2
42 [필독] 비디오 코덱과 기본 용어 (H.264, HEVC) 2 JKyle 2020.01.25 28517 7
41 샤나인코더로 움짤 만들기 4 file JKyle 2019.09.08 7649 0
40 기록 보기에서 Consider increasing the value for the 'analyzeduration' and 'probesize' options 내용이 있을 때 해결법 4 Rina 2019.09.04 4262 1
39 SRT SMI 자막 인코딩 이용시 한글 깨짐 자막변환 방법 file 나그네3 2019.03.14 30847 1
38 webm VP9 멀티스레드 활성화하는 방법, 속도 향상시키는 방법 마소리스 2018.09.25 6517 0
37 "비트레이트를 원본보다 높게 주면 원본보다 퀄리티가 나아질 수 있다"는 주장에 대해 6 JKyle 2018.09.19 19019 0
36 SSIM, PSNR로 측정한 NVENC 인코딩 4 file JKyle 2018.09.09 4265 0
35 인코딩된 파일의 PSNR, SSIM 값 계산하기 file JKyle 2018.09.05 3656 1
34 8비트 원본을 10비트로 인코딩하면 8비트로 인코딩할 때보다 화질이 더 낫다? 5 JKyle 2018.09.04 8869 0
Board Pagination Prev 1 2 3 4 Next
/ 4