ffmpeg를 사용하여 비디오 크기를 줄이려면 어떻게해야합니까?


201

ffmpeg품질을 낮추어 비디오 크기를 줄이는 데 어떻게 사용할 수 있습니까? (최소한 자연 스럽지만 사용 가능한 공간이없는 모바일 장치에서 실행해야합니까?)

나는 아직 한 가지를 쓰는 것을 잊었다. 비디오가 자막 (* .srt 또는 * .sub)을 사용할 수있을 때 변환 된 비디오 파일의 매개 변수에 맞게 자막을 변환하고 싶습니다.


4
나는 그것을 사용하지 않았지만 ffmpeg매뉴얼 페이지에는 -fs출력 크기를 제한 하는 옵션이 표시됩니다 ffmpeg -i in.avi -fs 100M out.avi.
Kevin

1
나는 맨 페이지로 당신을 리디렉션하지 않습니다 :man ffmpeg | wc -l --> 5254

3
.avi.. 주요 문제가되지 않습니다 avi단지 컨테이너입니다. 가장 큰 문제는 어떤 코덱을 사용 하느냐입니다. 많은 (대부분의) .avivids는 오래된 스타일의 코덱 (예 : XviD)을 사용하지만, 고급 코덱과 비교할 때 같은 품질에서는 더 큽니다. H.264비디오 압축 표준 (예 : 코덱 x264) 및 aac오디오 압축을 사용하여 엄격한 인코딩. 사용하는 컨테이너 및 코덱은 사용자와 휴대 전화의 .mp4책임입니다 . 컨테이너는 잘 받아들입니다. 이 링크
Peter.O

@Kevin 변환에 더 많은 매개 변수가 필요합니다.
xralf

@hesse 무슨 뜻인가요?
xralf

답변:


277

답변을 참조하십시오 . 편의를 위해 아래에 인용했습니다.

1GB를 비디오 길이 (초)로 나누어 필요한 비트 전송률을 계산하십시오. 따라서 길이가 16:40 (1000 초) 인 비디오의 경우 1000000 바이트 / 초의 비트 전송률을 사용하십시오.

ffmpeg -i input.mp4 -b 1000000 output.mp4

고려해야 할 추가 옵션은 평균 비트 전송률을 낮추지 만 더 나은 품질을 유지하는 Constant Rate Factor를 설정하는 것입니다. CRF를 18과 24 사이에서 변화 시키십시오. 비트 전송률이 낮을수록 높습니다.

ffmpeg -i input.mp4 -vcodec libx265 -crf 20 output.mp4

필요에 따라 코덱을 변경하십시오. libx265가 아닌 경우 결과 파일 크기가 약간 커지므로 libx264를 사용할 수 있습니다.


338MB 크기의 비디오는 130MB 크기로 줄었습니다. 품질이 급격히 저하되었습니다. 이 과정에 대한 설명이 있습니까? 원저자는 자신의 지침을 설명하지 않습니다.
xralf

13
두 번째 명령을 사용 -crf 24하면 품질이 눈에 띄게 떨어지지 않고 255.3MB의 비디오를 72.7MB로 줄였습니다. 공감하다!
패트릭 로버츠

2
~ 2G 비디오를 14MB로 크게 줄 였지만 여전히 좋아 보입니다. 이것이 첫 번째 검색 결과였으며, 제가 찾던 것이 바로 감사합니다!
sinisterstuf

5
이제 libx265더 큰 크기 축소에 사용할 수 있습니다 .
ZN13

6
사용 ffmpeg -i input.avi -vcodec libx264 -crf 24 output.avi합니다. 100mb 비디오를 9mb로 줄였습니다. 비디오 품질에는 거의 변화가 없습니다. 감사합니다!
alpha_989

32

특정 비트 전송률을 찾고 있지 않으면 -crf옵션을 권장합니다 . 이것은 x264인코딩에 가장 일반적으로 사용됩니다 : http://slhck.info/articles/crf

한마디로 : CRF가 23이면 "DVD"품질의 영화 (약 700MB-1GB)가되고 CRF 값이 낮을수록 품질이 높아집니다 (큰 파일).


3
외부 웹 사이트로 연결하는 대신 전체 명령의 예를 알려주세요 (언젠가 깨질 수 있습니다)
Jake Berger

1
@Vicky Chijwani는 위 예제의 코드를 제공합니다. 이것은 의견에 더 적합하지만이 사이트에서 처음으로 활동했습니다. 이 링크에는 crf 옵션에 대한 자세한 설명이 있지만 코드를 작동시킬 필요는 없습니다.
Tom Kelly

27

모바일 장치에 더 많은 비디오를 넣을 수 있도록 파일 크기를 줄이겠다 고 언급했습니다. 여기에있는 모든 대답은 압축 품질을 낮추는 것이지만 비디오 프레임 크기를 줄이는 것에 대해서는 아무도 언급하지 않았습니다. 내 경험에서 재 압축하는 것보다 약 3 ~ 5 배 더 빠릅니다. 자세한 내용은 스케일링에 대한 ffmpeg 문서를 참조하십시오 .

ffmpeg -i input.mkv -vf "scale=iw/2:ih/2" half_the_frame_size.mkv
ffmpeg -i input.mkv -vf "scale=iw/3:ih/3" a_third_the_frame_size.mkv
ffmpeg -i input.mkv -vf "scale=iw/4:ih/4" a_fourth_the_frame_size.mkv

20

이 질문에 대한 다른 제안 된 답변을 대부분 테스트했습니다. 테스트 데이터 결론은 다음과 같습니다. 다음은 내가 제안한 답변입니다.

(BR) 다음을 사용하여 비트 전송률을 수정하십시오.

ffmpeg -i $infile -b $bitrate $newoutfile 

(CR) 다음을 사용하여 일정 비율 계수를 바꿉니다.

ffmpeg -i $infile -vcodec libx264 -crf 23 $outfile

(SZ) 다음을 사용하여 비디오 화면 크기를 변경하십시오 (예 : 픽셀 크기의 절반).

ffmpeg -i $infile -vf "scale=iw/2:ih/2" $outfile

(BL) 다음을 사용하여 H.264 프로필을 "기준선"으로 변경하십시오.

ffmpeg -i $infile -profile:v baseline $outfile

(DF) 다음을 사용하여 기본 ffmpeg 처리를 사용하십시오.

ffmpeg -i $infile $outfile

데이터

  • "size"-원본과 관련하여 변환 된 비디오의 픽셀 크기 (%)입니다.
  • "비트 전송률"-원본 및 변환 된 비디오의 전송률입니다.
  • "정의"-비디오의 픽셀 크기.
  • "convert"-비디오를 초 단위로 변환하는 시간입니다.

제안 된 방법을 사용하여 (BL)의 대상 비트 전송률을 계산했습니다.

=== 파일 A-노드가 Angular-Fnbixa7Ts6M.mkv를 추진하는 데 어떻게 도움이 되는가 ===

            original    BR         CR         SZ         BL         DF
            --------    ---        --         --         --         --
size        64152 kb    214%       76%        40%        83%        76%
bitrate     411 kb/s    883        313        165        342        313
definition  1920x1080   1920x1080  1920x1080  960x540    1920x1080  1920x1080
convert     --          648        509        225        427        510

=== 파일 B-각도와 함께 GraphQL 사용 _ By-Lee Costello-OGyFxqt5INw.mkv ===

            original    BR         CR         SZ         BL         DF
            --------    ---        --         --         --         --
size        410301 kb   33%        109%       28%        143%       109%
bitrate     2687 kb/s   880        2920       764        3843       2920
definition  3840x2160   3840x2160  3840x2160  1920x1080  3840x2160  3840x2160   
convert     --           2307       3188       1116       2646       3278

결론

  • (SZ) 방법은 확실히 가장 빠른 방법입니다. 2 배에서 4 배 빨라졌습니다. 다른 모든 방법은 비디오의 실제 길이보다 변환하는 데 시간이 더 오래 걸리기 때문에 고해상도 비디오에서는 문제가 될 수 있습니다. 예를 들어 (CR) 방법은 21 분 비디오를 변환하는 데 53 분이 걸렸습니다.

  • 비디오의 정의가 비디오를 표시 할 화면의 정의보다 큰 경우 (SZ) 방법이 가장 좋습니다. 예를 들어 휴대 전화에 1080p 사진 만 표시 할 수 있으면 3840x2160 비디오를 보내는 것은 낭비입니다. 크기를 절반으로 1080p로 설정하는 것이 가장 좋습니다.

  • 제안 된 답변 중 일부는 실제로 일부 동영상의 크기가 증가했습니다. 예를 들어, (BR) 방법은 1080p 샘플의 크기를 두 배 이상 늘 렸습니다. 그러나 2160p 크기는 3 분의 1이되었습니다. 고해상도 샘플의 경우 (CR), (BL) 및 (DF) 방법이 모두 비디오 크기를 증가 시켰습니다.

정답 (또는 최선)

항상 대상 디스플레이에서 지원하는 최대 해상도로 해상도를 낮추는 것이 가장 좋습니다.

파일 크기를 더 줄이려면 개인 선택에 따라 다릅니다. 정보 내용을 줄이거 나 압축을 높일 수 있습니다.

  • 문제가되지 않으면 해상도를 더 낮출 수 있습니다.

  • 비디오에 빠른 동작 장면이 포함되어 있지 않으면 프레임 속도를 낮추고 싶을 수 있습니다.

  • 강력한 프로세서가 있고 공간 만있는 경우 압축률을 높일 수 있습니다.

  • 비트 전송률은 여러 요소의 조합입니다. 따라서 비트 전송률을 낮추도록 ffmpeg에 지시하면 원하는 결과를 얻지 못할 수 있습니다.

  • 정보 내용을 낮추는 또 다른 방법은 색 농도를 낮추는 것입니다. 이 작업을 수행하는 방법은 아직 논의되지 않았습니다.


13

옵션없이 실행될 때 ffmpeg 이미 일부 최적화를 수행 하는 것 같습니다 . 따라서 설정을 사용하기 전에 명시 적으로 정보를 잃어 버렸거나 이해하지 못하는 경우 기본 변환을 시도하십시오.

ffmpeg -i input.mp4 output.mp4

필자의 경우 비디오 및 오디오의 비트 전송률을 줄였으며 (입력 및 출력 파일을 실행 ffprobe하여 확인 및 비교할 수 있음) 700MB 비디오를 비슷한 품질의 60MB 비디오로 변환했습니다.


1
이것으로 4Gb에서 2Gb로갔습니다. 감사합니다!
Sam Hosseini

1
(10Mo에서 1.2Mb로, ffmpeg는 VP8 에있는 비디오 를 VP9 로 자동 변환했습니다 )
sodimel

이로 인해 비디오 크기가 10.8MB에서 14MB로 증가했습니다.
pjtnt11

3

예전 카메라에서 생성 한 모션 JPEG 비디오 (각 프레임이 전체 JPEG 이미지이므로 매우 큰 비디오 임)를 h264로 변환하기 위해 원래 위조 한 레시피가 있습니다. 다음은 다른 종류의 비디오 (코스 등)에 대한 적응입니다.

FFmpeg을 사용하지 않는 , 그러나 에 mplayer와 mencoder를 . 먼저 mplayer를 사용하여 오디오를 디 먹싱해야합니다.

mplayer -vo null -ao pcm:fast:file=<audio_pcm.wav> <video>
  • -vo null-ao null매개 변수 비디오를 추출하지 mplayer를 알려줍니다.

다음 단계에서는 mencoder를 사용하여 3 패스 압축을 수행합니다. 첫 번째 단계에서는 적절한 Constant Quality Mode 압축 ( crf 매개 변수)을 시작점으로 선택합니다.

mencoder <video> -ovc x264 \ 
         -x264encopts ratetol=100:preset=veryslow:crf=<value>:pass=1 \
         -nosound -o video1.h264
  • 당신은 추가 할 수 있습니다 slow_firstpass을 받는 매개 변수를 -x264encopts 당신이 비디오의 최종 품질과 편집증 경우. Mencoder 매뉴얼에 따르면이 옵션은“최종 패스 품질에 거의 영향을 미치지 않으면 서 인코딩 속도를 크게 향상시키는”일부 매개 변수를 비활성화합니다. 따라서 마지막 단계에서만 사용하십시오.

  • crf에 대해 몇 가지 값을 시도해야합니다. 25부터 시작하여 결과 비디오에서 아티팩트가 나타날 때까지 값을 계속 증가시킵니다 (높을수록 값이 더 많이 압축 됨). 후속 인코딩 패스는 crf에 대해 선택한 품질을 향상시킵니다 .

  • 에 대한 대안 veryslow의 사전 설정은 느리게 , 천천히 , 매체 의 전체 목록은 mencoder 설명서를 참조 등.

  • ratetol 은 비트 전송률 변화를 제어합니다. 여기서 올바른 작업을 수행하고 있는지 확실하지 않지만 각 장면에 적합한 비트 전송률을 mencoder가 자유롭게 선택할 수 있도록 최대 값으로 설정했습니다.

첫 번째 패스 후 마지막 라인은 다음 단계에서 사용할 평균 비트 전송률을 나타냅니다.

(...)
x264 [info]: kb/s:526.43

첫 번째 패스에서 권장 되는 crf 매개 변수를 후속 패스에서 필요한 bitrate로 변경하십시오 .

mencoder <video> -ovc x264 \
       -x264encopts slow_firstpass:ratetol=100:preset=veryslow:bitrate=526:pass=3 \
       -nosound -o video2.h264

이 두 번째 패스 인코딩은 압축을 최적화하기 위해 첫 번째 패스 ( divx2pass.logdivx2pass.log.mbtree)에서 생성 된 통계를 읽습니다 .

  • 첫 번째 패스에서 생성 된 것이 아니라 동일한 비디오 입력을 사용합니다. 첫 번째 패스의 출력 비디오는 초기 품질을 확인하는 데만 유용합니다.

  • 또한 pass=3( not pass=2 )은 새 통계 파일을 생성하므로 원하는만큼 마지막 단계를 반복 할 수 있습니다. 나는 일반적으로 pass=3결과 비트 레이트에 항상주의하면서 두 번을합니다.

한편, 당신은 사용도 오디오를 압축 할 수 있습니다 lame또는 oggenc:

oggenc -q<n> <audio_pcm.wav>

마지막으로 오디오 및 비디오를 리 뮤싱합니다.

mencoder -audiofile <audio>.ogg video2.h264 -oac copy -ovc copy \
         -of lavf -lavfopts format=mp4 -o <video>.mp4
  • -of lavf -lavfopts format=mp4발생 mp4lavopts의 muxers을 사용하여 파일 형식을.

3

40 분짜리 HD 비디오 프리젠 테이션을 505MB에서 183MB로 압축했습니다.
이는 100MB → 36MB입니다.
원본 비디오는 HD였으며 출력은 눈에 띄는 차이가 거의 없었습니다.
비디오 파일입니다. "계속 유지하고 싶지만 HD가 과도합니다."
이유와 함께 사용한 명령은 다음과 같습니다.

ffmpeg -n -loglevel error -i inputfile.mp4 -vcodec libx264 -crf 28 -preset faster -tune film outputfilename.mp4

  • -n: 출력 파일 덮어 쓰기 방지 (테스트 후 일괄 처리에 적합)
  • -loglevel error : 오류 표시 및 진행 행과 행 숨기기
  • -i inputfile.mp4 : 입력 파일 이름
  • -vcodec libx264: 최상위 답변 에서 스 와이프
  • -crf 28: 약간의 눈에 띄는 차이가있는 단일 패스 압축 ( "0 = 무손실, 23 = 기본값, 51 = 최악; 주관적으로 정상 범위는 17 – 28 " ) ref 문서
  • -preset faster: '중간' 참조 문서 의 기본 인코딩 시간보다 2 배 빠릅니다.
  • -tune film: 지정 입력은 HQ 비디오 (다른 옵션은 '만화', 'stillimage'를 포함 ..)은 심판 오피스
  • outputfilename.mp4 : 출력 파일 이름

비디오 파일 디렉토리의 경우 :

for i in *.{avi,flv,m4v,mov,wmv,mp4,MP4,TS,mkv}; do ffmpeg -n -loglevel error -i "$i" -vcodec libx264 -crf 28 -preset faster -tune film "cc${i}"; done

이슈 :

  • 명령에 모든 확장명을 갖지 않고 "모든 비디오 파일"을 수집하는 깔끔한 방법
  • "cc"접두사없이 파일 이름을 출력하고 삭제하기 전에 비디오를 확인할 수있는 더 확실한 방법
  • .webm파일이 명령과 작동하지 않습니다. 교환했다 "cc${i}""${i%.*}.mp4"

핸드 브레이크는 UI가있는 오픈 소스 대안입니다


효과가있다. 그러나 너무 많은 시간이 걸립니다. 실행 시간 단축을위한 개선이 있습니까?
Nirali


1

비디오의 크기를 줄이고 자동으로 다른 crf 값을 시도하는 bash 스크립트를 작성했습니다.

기본적으로 당신은

  • crf 값의 범위를 선택하십시오
  • 스크립트를 실행
  • 생성 된 비디오의 크기를 확인하고 원하는 비디오를 선택하십시오

이것은 당신이 달성하고자하는 크기 제한이 있고 그것을 할 수있는 crf 값이 무엇인지 모른다면 정말 유용합니다.

이것이 누군가를 도울 수 있기를 바랍니다. 나는 동료들과 공유했고 모두가 도움이되었다는 것을 알게되었습니다.

#!/bin/bash

# bigger values of crf will lead to a bigger compression (smaller video size)
#for i in 1 2 3 4 5
for i in {25..28}
do
# you can remove the option -y if you want to be asked if to overwrite a file with the same name (leave the -y only if you understand what you are doing, otherwise you might rewrite an important file)
   ffmpeg -y -i NAMEOFTHEVIDEOTOCOMPRESS.mp4 -c:v libx264 -crf $i -preset veryfast -profile:v baseline -level 3.0 -strict -2 out_$i.mp4
   printf "\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Done compression at crf=$i \n\n"
done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.