FFmpeg 사용법
* ffmpeg  다운로드(빌드된 버전 Windows 용)
    소스 : https://ffmpeg.org/download.html
- ffmpeg.exe 파일 단독으로 모든 기능
- 상용프로그램(WonderShare Video converter) 보다 더 동영상 인코딩 속도가 빠르고 화질 좋음
//-----------------------------------------------------------------------------
    - 빌드된 바이너리 실행파일 다운로드 
https://www.gyan.dev/ffmpeg/builds/ 
https://github.com/BtbN/FFmpeg-Builds/releases 
https://www.videohelp.com/software/ffmpeg
//------------------------------------- 
* essential 버전과 full 버전 차이 
    - v4.4.1 파일 크기 :  
essential = 73M (13M),  
full =104M (32M) 
    - 지원하는 코덱과 포맷 차이 
    - 지원 코덱 확인방법 
ffmpeg -codecs 
ffmpeg -formats 
//------------------------------------- 
* GPL , LGPL 라이센스 차이 
    - ffmpeg 파일 크기 차이(v4.4) 
GPL = 88.6M 
LGPL = 62.3M (기능 적음) 
GPL : 이용하면 무조건 소스 오픈 
    - 제한이 많은 대신 사용할 수 있는 기능이 많음 
LGPL : 수정없이 라이브러리로 사용시에는 소스 오픈 안해도 됨 
    - 제한이 적은 대신 기능이 줄어듬
//-----------------------------------------------------------------------------
일부 파일(세로가 긴 동영상)에서 에러 발생시 해결 방법
- 에러 메시지
Impossible to convert between the formats supported by the filter 'graph 0 input from stream 0:0' and the filter 'auto_scaler_0' 
Error reinitializing filters! 
Failed to inject frame into filter network: Function not implemented 
Error while processing the decoded data for stream #0:0
- 해결방법
정식 release 버전에서 발생(v4.4.1)
master 빌드 버전을 다운로드 받는다. (정식 릴리즈가 아닌 최신 수정된 소스를 빌드한 버전)
//-----------------------------------------------------------------------------
* FFmpeg를 활용한 비디오 유틸
//==========
    - 기본 사용 방법
ffmpge  '입력 옵션'  '입력 파일'    '출력 옵션'   '출력 파일'
- ffmpeg 옵션(option)
https://ffmpeg.org/ffmpeg.html
    - 입력 파일 지정 : -i input.mp4
    - 형식 강제 지정 : -f gif
       
    - 시작 위치 : -ss 00:00:02 (2초에서 시작)
    - 끝 위키 : -to 00:00:10 (10초에서 끝) 
    - 읽을 길이 설정(입력) : -t 3 (3초 길이 읽기)
    
       
    - 코덱 설정 (기본)
        -c:v libx264    (H.264)
        -c:v libx265    (H.265, HEVC)
    - GPU 가속
        - 입력
            -hwaccel cuvid -c:v h264_cuvid (H.264)
            -hwaccel cuvid -c:v hevc_cuvid (H.265, HEVC)
        - 출력(인코딩 코덱)
            -c:v h264_nvenc  (H.264)
            -c:v hevc_nvenc  (H.265, HEVC)
    - bitrate 설정 : -b 2048k
        -b:v 1048k (비디오)
        -b:a 128k (오디오)
    - framerate 설정(fps) : -r 24 (초당 24프레임)
    - 크기 조정 : -s 640x480
        - 입력부에서 가속을 쓰면 안될수 있음
    - 파일 형식 지정 : -f mp4  (mp4 파일)
    -y : 묻지도 않고 파일 덮어쓰기
    - 오디오 선택
        -map 0:v:0 0:a:1 (1번째 비디오, 2번째 오디오 선택)
    //그외 옵션
        - 양자화 (quantizer scale), 품질
-qp   quantization parameter , -1 ~ 51 , 기본 -1
-cq   constant quality mode in VBR rate , 0~51, 기본 0 , h264_nvenc 용
-crf  constant quality mode ,-1 ~ FLT_MAX(float최대), 기본 -1 , libx264 용
    - 인코딩 없이 트랙 복사
        -map 0:a -c:a copy (모든 오디오 스트림을 복사)
    - 인코딩 없이 일정 구간 자르기
    https://trac.ffmpeg.org/wiki/Seeking
ffmpeg -y -i INPUT.MP4 -ss 00:01:00  -to 00:02:00  -map 0:v -c:v copy  -map 0:a -c:a copy  OUT.MP4
        - 1분~2분 구간을 자른다, -ss 를 입력파일 뒤에 놓아야 정확하게 잘린다
- 비디오 파일 정보 보기
ffmpeg -i 파일이름
//------------------------------------- 
* 필터 (-filter) 
    - 비디오 필터 : -filter:v  =  -vf 
    - 오디오 필터 : -filter:a  =  -af 
    - 비디오 해상도 변경 
https://trac.ffmpeg.org/wiki/Scaling 
ffmpeg -i input.jpg -vf scale=320:-2 output_320.png 
    - 오디오 속도 변경 
ffmpeg -i t:\2.aac -filter:a "atempo=2" t:\2-(2).aac  // 2배 빠르게 변경됨 
//------------------------------------- 
< 오디오 옵션 >
https://ffmpeg.org/ffmpeg.html#Options 
https://trac.ffmpeg.org/wiki/audio%20types 
-acodec  : 오디오 코덱 (-codec:a 나 -c:a 의 별칭) 
    - mp3 = libmp3lame 
    - wav(pcm) = pcm_s16le 기본, (pcm 오디오 코덱 앞에 "pcm_" 을 추가, 예 "pcm_s24le" ) 
-ar : 샘플링 주파수 (예 44100) 
-aq :  VBR 오디오 품질 (-q:a의 별칭) 
https://trac.ffmpeg.org/wiki/Encode/MP3 
    - libmp3lame 코덱에서 품질(kbit/s) 
        - 0 = 240, 4 = 165, 9=65 
//------------------
// 참고
-ac : 오디오 채널수 ( 스테레오는 2 ) 
-sample_fmt : 샘플 포맷(예 s16) 
    -sample_fmts로 확인 가능 
-ab : 고정 품질 bitrate, 코덱에 따라 다름, legacy 
-f : 입출력 파일 포맷을 강제로 설정
//----------------------------------------------------------------------------- 
< 자막 추출 방법 >
    - 자막 스트림 확인 방법 
ffmpeg -i input.mkv
    - 자막 추출 명령 
ffmpeg -i input.mkv  -map 0:s:0  subtitles.srt 
        - 1번째 자막 0:s:0 
        - 2번째 자막 0:s:1 
//-----------------------------------------------------------------------------
//사용예
ffmpeg -ss 00:00:02 -t 3 -i INPUT.mp4 -r 10 -s 640x480 OUTPUT.gif
    - 입력 : 2초에서 시작해서 3초동안 읽는다
    - 출력 : fps는 10, 해상도 640x480으로 변환
//=====================
// 배치파일
@echo on
setlocal
if "%~1"=="" goto :end1
@echo %TIME%
rem 품질 설정(양자화) %4
set  qp=28
if not [%4]==[] ( set /a qp=%4  )
if  %qp% geq 50 ( set qp=50)
if  %qp% leq 10 ( set qp=10)
echo "%qp%"
rem 오디오 선택 %5 ==> vorbis로 모든 트랙 인코딩
set ch1=0
if not [%5] == [] (    set /a ch1=%5-1 )
if %ch1% geq 1 ( 
    set map1=-map 0:v:0 -map 0:a:%ch1% 
    echo map1=%map1%
)
rem 출력 파일
set out="%~1"
@echo %out%
set temp1=%out:~-4%
set temp1=%temp1:~0,1%
echo %temp1%
if not "%temp1%" == "." ( 
    set out=%out:~0,-5%-OUT%2%3q%qp%.%out:~-4%
)else ( 
    set out=%out:~0,-4%-OUT%2%3q%qp%.%out:~-3%
)
@echo %out%
rem 입력 옵션 %2
set io=-hwaccel cuvid -c:v h264_cuvid
@rem if "%2" == 4 set io=-hwaccel cuvid -c:v h264_cuvid
if "%2" == "5" set io=-hwaccel cuvid -c:v hevc_cuvid
rem 출력 옵션 %3
set oo=-c:v h264_nvenc
@rem if "%3" == "4" set oo=-c:v h264_nvenc
if "%3" == "5" set oo=-c:v hevc_nvenc 
@rem ffmpeg -hwaccel cuvid -c:v h264_cuvid -y -i INPUT.mkv -c:v h264_nvenc  -map 0:v -map 0:a -c:a libvorbis  OUT.mkv
echo ffmpeg %io% -y -i "%~1" %oo% -qp %qp% -map 0:a -c:a copy %out%
ffmpeg %io% -y -i "%~1" %oo% -qp %qp% -map 0:v -map 0:a -c:a libvorbis %out%
@echo %TIME%
exit /b
:end1
echo  fmpg.bat "파일이름" 입력코덱 출력코덱 양자화
echo ex) fmpg.bat "파일이름" 4 5 35
//=====================
//인코딩 속도 비교
    - 소프트웨어(기본)
ffmpeg -y -i avatar.2mbps-o.mkv -c:v libx264 avatar.2mbps-4-sw.mkv (속도 = 1.1x)
ffmpeg -y -i avatar.2mbps-o.mkv -c:v libx265 avatar.2mbps-5-sw.mkv (속도 = 0.52x)
ffmpeg -y -i avatar.2mbps-5-q25.mkv -c:v libx264 avatar.2mbps-54-sw.mkv (속도 = 1.11x)
ffmpeg -y -i avatar.2mbps-5-q25.mkv -c:v libx265 avatar.2mbps-55-sw.mkv (속도 = 0.52x)
    -하드웨어(GPU 가속)
ffmpeg -y -i avatar.2mbps-o.mkv -c:v h264_nvenc avatar.2mbps-4-hw.mkv (속도 = 10.5x)
ffmpeg -y -i avatar.2mbps-o.mkv -c:v hevc_nvenc avatar.2mbps-5-hw.mkv (속도 = 10.1x)
ffmpeg -hwaccel cuvid -c:v h264_cuvid -y -i avatar.2mbps-o.mkv -c:v h264_nvenc avatar.2mbps-44-hw-in.mkv (속도 = 15.5x)
ffmpeg -hwaccel cuvid -c:v h264_cuvid -y -i avatar.2mbps-o.mkv -c:v hevc_nvenc avatar.2mbps-45-hw-in.mkv (속도 = 11.8x)
    기본 -qp (양자와) 값이 40 정도로 예상
ffmpeg -hwaccel cuvid -c:v h264_cuvid -y -i avatar.2mbps-o.mkv -c:v hevc_nvenc -qp 30 avatar.2mbps-5-q30.mkv (속도 = 8.46x) 
ffmpeg -hwaccel cuvid -c:v hevc_cuvid -y -i avatar.2mbps-5-q25.mkv -c:v hevc_nvenc avatar.2mbps-54-hw-in.mkv (속도 = 12.1x)
ffmpeg -hwaccel cuvid -c:v hevc_cuvid -y -i avatar.2mbps-5-q25.mkv -c:v hevc_nvenc avatar.2mbps-55-hw-in.mkv (속도 = 11.8x)
//=====================
//양자화별 용량 비교
- 주의! 버전에 따라 양자화 수치에 따른 품질이 다를 수 있다.
- 이전에는 28이 적당했는데 2021년에는 24가 적당(28은 품질 낮음)
    -원본 : avatar 508M
    - H.264(AVC)
ffmpeg -hwaccel cuvid -c:v h264_cuvid -y -i avatar.2mbps-o.mkv -c:v h264_nvenc -qp 10 avatar.2mbps-4-q10.mkv
    기본 : 66
    10 : 1860
    20 : 637
    30 : 221 <== 적당(28)
    40 : 81
    50 : 36
    - H.265(HEVC)
ffmpeg -hwaccel cuvid -c:v h264_cuvid -y -i avatar.2mbps-o.mkv   -c:v hevc_nvenc  -qp 30 avatar.2mbps-5-q30.mkv
    기본 : 66
    10 : 1530
    20 : 501
    30 : 168 <== 적당
    40 : 59
    50 : 23