답변:
이 답변을 참조하십시오 . 편의를 위해 아래에 인용했습니다.
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를 사용할 수 있습니다.
-crf 24
하면 품질이 눈에 띄게 떨어지지 않고 255.3MB의 비디오를 72.7MB로 줄였습니다. 공감하다!
libx265
더 큰 크기 축소에 사용할 수 있습니다 .
ffmpeg -i input.avi -vcodec libx264 -crf 24 output.avi
합니다. 100mb 비디오를 9mb로 줄였습니다. 비디오 품질에는 거의 변화가 없습니다. 감사합니다!
특정 비트 전송률을 찾고 있지 않으면 -crf
옵션을 권장합니다 . 이것은 x264
인코딩에 가장 일반적으로 사용됩니다 : http://slhck.info/articles/crf
한마디로 : CRF가 23이면 "DVD"품질의 영화 (약 700MB-1GB)가되고 CRF 값이 낮을수록 품질이 높아집니다 (큰 파일).
모바일 장치에 더 많은 비디오를 넣을 수 있도록 파일 크기를 줄이겠다 고 언급했습니다. 여기에있는 모든 대답은 압축 품질을 낮추는 것이지만 비디오 프레임 크기를 줄이는 것에 대해서는 아무도 언급하지 않았습니다. 내 경험에서 재 압축하는 것보다 약 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
이 질문에 대한 다른 제안 된 답변을 대부분 테스트했습니다. 테스트 데이터 결론은 다음과 같습니다. 다음은 내가 제안한 답변입니다.
(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
데이터
제안 된 방법을 사용하여 (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에 지시하면 원하는 결과를 얻지 못할 수 있습니다.
정보 내용을 낮추는 또 다른 방법은 색 농도를 낮추는 것입니다. 이 작업을 수행하는 방법은 아직 논의되지 않았습니다.
옵션없이 실행될 때 ffmpeg
이미 일부 최적화를 수행 하는 것 같습니다 . 따라서 설정을 사용하기 전에 명시 적으로 정보를 잃어 버렸거나 이해하지 못하는 경우 기본 변환을 시도하십시오.
ffmpeg -i input.mp4 output.mp4
필자의 경우 비디오 및 오디오의 비트 전송률을 줄였으며 (입력 및 출력 파일을 실행 ffprobe
하여 확인 및 비교할 수 있음) 700MB 비디오를 비슷한 품질의 60MB 비디오로 변환했습니다.
예전 카메라에서 생성 한 모션 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.log
및 divx2pass.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
발생 mp4
lavopts의 muxers을 사용하여 파일 형식을.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
이슈 :
.webm
파일이 명령과 작동하지 않습니다. 교환했다 "cc${i}"
→"${i%.*}.mp4"
품질을 크게 저하시키지 않으면 서 지정된 파일 크기 (비트 전송률) 내에서 비디오를 "적합"하려면 2- 패스 인코딩을 사용해야합니다. 이것은 매우 자세한 주제입니다 : http://web.archive.org/web/20171130050515/http://www.mpabo.com/2014/12/14/ffmpeg-and-x264-encoding-guide/
비디오의 크기를 줄이고 자동으로 다른 crf 값을 시도하는 bash 스크립트를 작성했습니다.
기본적으로 당신은
이것은 당신이 달성하고자하는 크기 제한이 있고 그것을 할 수있는 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
ffmpeg
매뉴얼 페이지에는-fs
출력 크기를 제한 하는 옵션이 표시됩니다ffmpeg -i in.avi -fs 100M out.avi
.