비디오를 특정 크기에 맞추려면 어떻게해야합니까? FFmpeg로 비디오를 업 스케일하지 않습니까? 플레이어가 처리

가로 세로 비율을 유지하면서 비디오를 640×360 (휴대 전화 플레이어가 처리 할 수있는 최대 크기)에 맞출 필요가 있지만 비디오 가 640×360보다 으면 변경되지 않기를 바랍니다.

ffmpeg의 명령 행을 사용하여이 동작을 수행 할 수있는 방법이 있습니까?



답변

최신 ffmpeg 버전에서는 scale필터 force_original_aspect_ratio옵션을 사용할 수 있습니다 . 예를 들어 업 스케일링없이 비디오를 1280 × 720에 맞추려면 (자세한 내용은 이 게시물 참조 ) :

ffmpeg -i input.mp4 -filter:v "scale='min(1280,iw)':min'(720,ih)':force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2" output.mp4

여기 scale에서 입력 비디오가 이보다 큰 경우 필터의 크기는 1280 × 720입니다. 더 작 으면 업 스케일되지 않습니다. pad필터 목표 크기에서 경우에 1280 × 720의 종횡비 또는 크기 다르다 출력 비디오를 가져올 필요가있다.


구형 ffmpeg 버전에서는 다소 해킹이있는 해결 방법이 있습니다. 먼저 출력의 너비, 높이 및 종횡비를 정의하십시오. 이렇게하면 입력 내용이 저장됩니다.

width=640; height=360
aspect=$( bc <<< "scale=3; $width / $height") # <= floating point division

이제 Jim Worrall이 작성한 매우 복잡한 필터 명령을 적용 해 보겠습니다 .

ffmpeg -i input.mp4 -vf "scale = min(1\,gt(iw\,$width)+gt(ih\,$height)) * (gte(a\,$aspect)*$width + \
lt(a\,$aspect)*(($height*iw)/ih)) + not(min(1\,gt(iw\,$width)+gt(ih\,$height)))*iw : \
min(1\,gt(iw\,$width)+gt(ih\,$height)) * (lte(a\,$aspect)*$height + \
gt(a\,$aspect)*(($width*ih)/iw)) + not(min(1\,gt(iw\,$width)+gt(ih\,$height)))*ih" \
output.mp4

실제로이 모든 기능을 설명하지는 않지만 기본적으로 모든 비디오를 피드 할 수 있으며 업 스케일이 아닌 다운 스케일 만 가능합니다. 당신이 그것을 위해 있다면 필터를 개별 표현으로 분해 할 수 있습니다. 이것을 줄이는 것이 가능할 수도 있지만 그렇게 작동합니다.


답변

더 읽기 쉬운 버전은 다음과 같습니다.

-filter_complex "scale=iw*min(1\,min(640/iw\,360/ih)):-1"

640 / iw는 수평 스케일링 계수이고 360 / ih는 수직 스케일링 계수입니다

축척 된 이미지를 출력 상자 안에 맞추고 (저장) 종횡비를 유지하려고합니다. 최소 기능으로 최소 배율을 선택하면됩니다 : min (640 / iw, 360 / ih)

업 스케일링을 방지하려면 (예 : 스케일링 계수> 1.0) min (1, min (640 / iw, 360 / ih))

다음 단계는 스케일링 계수에 입력 너비 및 입력 높이를 곱하여 출력 해상도를 계산하는 것입니다.
출력 너비 = iw * min (1, min (640 / iw, 360 / ih))
출력 높이 = ih * 최소 (1, 최소 (640 / iw, 360 / ih))

마지막 단계는 필터 명령을 구성하는 것입니다. 출력 높이를 지정할 필요가 없습니다. -1을 지정할 수 있으며 ffmpeg는 너비와 동일한 배율을 적용하여 종횡비를 유지합니다.


답변

나도 같은 문제가 있었지만 스마트 폰으로 만든 세로 비디오 때문에 비디오를 사각형 640×640에 맞추면 해결되었습니다.

따라서 immerzi 논리와 일부 연구를 사용하면 다음과 같이 끝납니다.

-vf "scale=iw*min(1\,if(gt(iw\,ih)\,640/iw\,(640*sar)/ih)):(floor((ow/dar)/2))*2"

마지막 부분은 많은 엔코더에 필요한 높이를 2로 나눌 수있는 부분입니다.


답변