FFmpeg 사용법

Tips 2017. 2. 15. 18:47

* 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

//-------------------------------------
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를 활용한 비디오 유틸

http://codens.info/1434

 

 

//==========

    - 기본 사용 방법
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으로 변환

 

 

//=====================

// 배치파일

 

 

fmpg.bat
다운로드

 

더보기

@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

 

 

반응형
Posted by codens