FFMPEG
설치[편집]
<source lang="bash"> sudo apt install ffmpeg </source>
H264 인코딩[편집]
CRF[편집]
- 인코딩되는 파일 크기가 크게 중요하지 않을 경우 품질 위주로 인코딩한다.
- 1패스로 나름 괜찮은 결과를 얻을 수 있다.
- 단점으로는 인코딩하기 전에 파일 크기나 비트레이트를 알 수 없다는 거.
- 스케일 범위는 0부터 51까지. 23이 기본값이다. 일반적으로 18부터 28까지 사용한다.
- CRF는 +6은 비트레이트가 반, -6은 비트레이트가 두배다.
- 정확하게 정해진 기준은 없으므로 본인에게 맞는 값을 선택하는게 좋다.
황금눈깔은 알아서 선택하자 - 프리셋은 cpu를 얼마나 써제낄건지 고르는거다. 일반적으로 slow 프리셋을 쓴다.
- tune은 여러가지 형태들 중에 지정해서 최상의 값을 얻어낼 수 있다. film, animation, grain, stillimage, psnr, ssim, fastdecode, zerolatency 중에 고르면 된다.
- 잘 모르겠으면 tune 옵션은 안 써도 된다.
- 다음과 같은 명령어로 프리셋과 tune을 뭘 쓸 수 있는지 볼 수 있다.
<source lang="bash"> ffmpeg -f lavfi -i nullsrc -c:v libx264 -preset help -f mp4 - // Mac / Linux ffmpeg -f lavfi -i nullsrc -c:v libx264 -preset help -f mp4 NUL // Windows </source>
- CRF는 다음 명령어처럼 사용할 수 있다. 음성은 stream copy
<source lang="bash"> ffmpeg -i input.avi -c:v libx264 -preset slow -crf 22 -c:a copy output.mkv </source>
2pass[편집]
- 파일 크기가 일정해야 할 경우 사용한다. 10분짜리에 200메가짜리 클립이 필요한 경우 등
- 200메가 * 8메가 / 600초 = 2730kb/s가 나오게 된다.
- 여기서 오디오도 계산하자면.. 2730-128kb/s = 2602kb/s
- 약 2600k로 잡아서 2pass를 써보자면..
<source lang="bash"> ffmpeg -y -i input.avi -c:v libx264 -preset medium -b:v 2600k -pass 1 -c:a aac -b:a 128k -f mp4 pass.mp4 ffmpeg -i pass.mp4 -c:v libx264 -preset medium -b:v 2600k -pass 2 -c:a aac -b:a 128k output.mp4 </source>
Lossless[편집]
- -crf 0으로 최대한 무손실로 인코딩이 가능하다고 하지만..
- 다음 명령어로 사용
<source lang="bash"> ffmpeg -i input.avi -c:v libx264 -preset ultrafast -crf 0 output.mkv ffmpeg -i input.avi -c:v libx264 -preset veryslow -crf 0 output.mkv </source>
- 출력되는 파일은 엄청나게 크다.
황금눈깔이 아니면 그다지 쓸 일 없다
프리셋 변경[편집]
- 자신이 굉장한 전문가일 경우 사용하는 옵션. MPEG 그룹에서 엄청난 테스트를 거쳐 나온 프리셋을.. 어쨌든 변경이 가능.. 하다..
- x264opt라는 옵션은 없어졌고 x264-params로 대체되었다. 다음과 같은 명령어로 사용가능.
<source lang="bash"> ffmpeg -i input.avi -c:v libx264 -preset slow -crf 22 -x264-params keyint=123:min-keyint=20 -c:a copy output.mkv -c:a copy output.mkv </source>
CBR[편집]
- 원래 CBR 모드를 지원하지 않는데, ABR을 조정해서 어느정도 확보해 줄 수 있다.
ffmpeg -i input.avi -c:v libx264 -x264-params "nal-hrd=cbr" -b:v 1M -minrate 1M -maxrate 1M -bufsize 2M output.ts
- 보통 플레이어들 버퍼가 빵빵하지만, 위 명령을 사용할 경우 허용되는 비트레이트에서 최상의 값을 뽑아내려고 노력할거다.
- 다음 명령어를 이용해서 2패스로 비트레이트에 최대한 맞출 수 있다.
<source lang="bash"> ffmpeg -i input.avi -c:v libx264 -b:v 1M -maxrate 1M -bufsize 2M -pass 1 -f mp4 pass.mp4 ffmpeg -i pass.mp4 -c:v libx264 -b:v 1M -maxrate 1M -bufsize 2M -pass 2 output.mp4 </source>
호환성[편집]
- 오래된 디바이스랑 호환성을 맞추려면 -profile:v baseline -level 3.0 옵션을 주면 된다.
- 아이폰 3G, 아이팟 터치 2세대 이상을 지원하려면 -profile:v baseline -level 3.1
- 아이패드, 애플TV 2, 아이폰4 이상을 지원하려면 -profile:v main -level 3.1
- 애플TV 3, 아이패드2, 아이폰4s 이상을 지원하려면 -profile:v high -level 4.1
- 아이패드 에어, 아이폰 5s 이상을 지원하려면 -profile:v high -level 4.2
이미지 크기변경[편집]
- 320x240으로 변경하기
<source lang="bash"> ffmpeg -i input.avi -vf scale=320:240 output.avi </source>
- 이미지도 변경 가능하다
<source lang="bash"> ffmpeg -i input.jpg -vf scale=320:240 output.png </source>
- 비율 유지를 하고싶다면
<source lang="bash"> ffmpeg -i input.jpg -vf scale=320:-1 output.png </source>
- 늘이기나 줄이기
- iw는 input의 넓이, ih는 input의 높이
<source lang="bash"> ffmpeg -i input.jpg -vf scale=iw*2:ih output.png ffmpeg -i input.jpg -vf scale=iw*.5:ih*.5 output.png </source>
- 아예 수식을 집어넣을수도 있다.
<source lang="bash"> ffmpeg -i input.jpg -vf scale="'if(gt(a,4/3),320,-1)':'if(gt(a,4/3),-1,240)'" output.png </source>