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


13

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

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


나는 이것이 ffmpeg에서만 단독으로 수행 될 수 있다고 생각하지 않지만, 스크립트를 작성하려는 경우 확실히 수행 할 수 있습니다.
evilsoup

이미 스크립트를 작성했지만 필요하지 않은 경우 코드를 정리하고 싶었습니다.
sashoalm

min(…)치수를 구문 분석하는 간단한 스크립트를 사용하면 가장 쉬운 기능과 같은 기능을 사용하는 스케일 필터를 사용하는 것이 가능 합니다. 수행 할 수있는 작업의 예는 여기 내 명령을 참조하십시오. superuser.com/questions/547296/…
slhck

답변:


10

최신 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

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


1
+1 그러나 그것은 정말로 끔찍한 명령입니다. : P
evilsoup

알 겠어? 논리 부분으로 나누고 몇 가지 값을 삽입하려고 10 분을 보냈지 만 포기했습니다. 조금 낡았 고 아마도 이것보다 훨씬 더 간결하게 쓸 수있을 것입니다.
slhck

14

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

-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는 너비와 동일한 배율을 적용하여 종횡비를 유지합니다.


A + 즉시 사용 가능합니다. 선택된 답변의 솔루션은 종횡비를 유지 하지 못했습니다 . 프레임을 압착했습니다.
287352 2016 년

5

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

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.