정적 크기의 플레이어에 맞게 ffmpeg / avconv를 사용하여 비디오 크기 조정 인 html 5 비디오 플레이어가 있습니다. 내가

폭 700px, 높이 400px 인 html 5 비디오 플레이어가 있습니다. 내가 사용하려고 해요 avconv(가로 세로 비율을 유지하면서)과 내 플레이어에 맞는 확인하고 크기를 조정할 수는 FFmpeg을 사용합니다.

입력은 모든 크기의 파일이 될 수 있으므로 더 큰 파일의 크기를 조정해야하지만 더 작은 파일의 크기를 검은 막대로 가운데에 맞 춥니 다. 지금까지 시도한 결과 : -s-aspect, 스위치 pad와 함께 사용되는 것을 보았지만 -vf필요한 것을 얻을 수있는 방법을 이해하지 못했습니다.

이미지

이것은 내가 필요한 것에 대한 대략적인 아이디어입니다. 그것이 가능한지 잘 모르겠습니다. CSS의 최대 너비 / 최대 높이와 ​​거의 같습니다. 나는 이것이 혼란스러운 단어 일 수 있음을 알고 있지만 누군가 내가 말하는 것을 이해하면 도움을 주셔서 감사합니다. 감사합니다.

avconv 명령 :

avconv -y -i control.avi -vcodec libx264 -b 2000k -bufsize 20M -acodec aac -strict experimental -ar 44100 -ab 256k bigbuck_out.mp4



답변

간단한 방법은 스케일 필터force_original_aspect_ratio 에서 옵션 을 사용하는 것입니다 .


원본 이미지. 640×480, 4 : 3 종횡비 비디오를 나타냅니다.

이 예에서 원본 이미지는 원래 종횡비를 유지하면서 16 : 9 종횡비 출력에 맞게 조정됩니다. 이렇게하려면 다음 중 하나를 수행하십시오.

필라 박스 또는 레터 박스


필라 박스 이미지. 640×480 (4 : 3) 입력을 1280×720 (16 : 9) 출력에 장착

ffmpeg -i input -vf "scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2" output
  • 이미지가 확대됩니다. 업 스케일링을 피하려면 아래 예를 참조하십시오.

  • 입력 종횡비가 출력 종횡비보다 넓은 경우 레터 박스가 대신 발생합니다. 예를 들어, 16 : 9 출력에 맞는 2.35 : 1 종횡비의 입력은 레터 박스를 생성합니다.

위와 동일하지만 업 스케일링 없음


업 스케일링없이 1280×720 (16 : 9) 출력으로 640×480 (4 : 3) 입력.

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

수확고


자른 이미지. 4 : 3 입력 화면비, 16 : 9 출력 화면비.

ffmpeg -i input -vf "scale=1280:720:force_original_aspect_ratio=increase,crop=1280:720" output

답변

고정 출력 너비에 필라 또는 레터 박스를 추가하는 명령은 다음과 같습니다. 시간이 오래 걸리지 만 패딩을 지정해야합니다.

먼저, 쉘에서 출력 너비와 높이를 정의하십시오.

width=700
height=400

그런 다음 명령을 실행하십시오.

ffmpeg -i in.mp4 -filter:v "scale=iw*min($width/iw\,$height/ih):ih*min($width/iw\,$height/ih), pad=$width:$height:($width-iw*min($width/iw\,$height/ih))/2:($height-ih*min($width/iw\,$height/ih))/2" out.mp4

크기와 크기를 조정하는 데 필요한 기본 요소로 요약되어 있습니다. 다른 비디오 및 오디오 옵션을 원하는대로 추가하십시오. 의 번호를 참고 width하고 height대부분의 코덱을 위해 일하기 위해 2로 나눌 수있다.

진행 상황에 대한 설명은 다음과 같습니다.

  • 스케일링 :
    • 먼저 너비 또는 높이를 기준으로 스케일링할지 여부를 파악해야합니다.
    • 이를 위해 출력 너비를 입력 너비로 나누고 출력 높이를 입력 높이로 나눕니다. 이것은 우리에게 각 차원의 스케일 팩터를 줄 것입니다.
    • 그런 다음 어느 쪽이 더 낮은 지 확인하고 (와 함께 min()) 크기 조정을 위해 해당 요소 만 선택합니다.
    • 마지막으로 입력 너비와 높이에 해당 계수 ( iw*min(…):ih*min(…))를 곱합니다 .
  • 심:
    • $width:$height 출력 너비와 높이
    • 결과 비디오를 배치 할 위치를 파악하려면 최대 출력 너비에서 배율을 조정하고 최대 출력 높이에서 배율을 빼야합니다.
    • 스케일 된 너비와 높이는 scale필터 의 표현식입니다 .
    • 결과 오프셋을 2로 나누면 양쪽에 테두리가 추가됩니다.

답변

세 단계 로이 작업을 수행해야합니다.

  1. 입력 종횡비 확인
  2. DAR> 너비가 7/4 인 비디오의 크기를 조정하고 (가로 세로 비율을 유지하기 위해 너비를 700으로 변경하고 높이의 크기를 조정) DAR <7/4의 높이를 가진 비디오의 크기를 조정하십시오
  3. 비디오를 700 : 400 공간에 맞도록 채 웁니다.

FFmpeg / avconv는 한 번의 트랜스 코딩으로 비디오 필터를 사용하여 스케일링 / 패딩을 한 번만 수행 할 수 있습니다. 예를 들어 16 : 9 비디오를 찍으려면 가로 방향으로 크기를 조정 한 다음 결과를 레터 박스로 지정하십시오.

ffmpeg -i input.avi -filter:v 'scale=700:-1,pad=700:400:(ow-iw)/2:(oh-ih)/2' \
-c:v libx264 -b:v 2000k -bufsize 20M -c:a aac -strict experimental -ar 44100 -b:a 256k output.mp4

…하지만 첫 번째 단계 (가로 세로 비율 감지 및 필요한 7 : 4와 비교)에는 일종의 스크립트를 사용해야합니다.

ffprobe input.avi 2>&1 | sed -n '/Video:/s/.*DAR \([0-9]*:[0-9]*\)].*/\1/p'

… ’16 : 9’또는 ‘4 : 3’과 같은 비디오의 종횡비를 얻을 수 있습니다. bash 스크립트에서는 다음과 같은 것을 사용합니다.

#!/bin/bash

##  Get the aspect ratio in the form x/y
dar=$(ffprobe test0.mp4 2>&1 | sed -n '/Video:/s/.*DAR \([0-9]*:[0:9]*\)].*/\1/p' | sed 's|:|/|')
##  use bc to do x/y*100 (bash can't handle floats)
DAR=$(bc <<< 'scale=2; $dar*100')

##  ${DAR%.00} will remove the trailing .00 left by bc
if [ ${DAR%.00} -ge 175 ]; then
    ffmpeg -i "$1" -filter:v 'scale=700:-1,pad=700:400:(ow-iw)/2:(oh-ih)/2' \
    -c:v libx264 -b:v 2000k -bufsize 20M -c:a aac -strict experimental -ar 44100 -b:a 256k "${1%.*}.mp4
else
    ffmpeg -i "$1" -filter:v 'scale=-1:400,pad=700:400:(ow-iw)/2:(oh-ih)/2' \
    -c:v libx264 -b:v 2000k -bufsize 20M -c:a aac -strict experimental -ar 44100 -b:a 256k "${1%.*}.mp4
fi

exit 0

분명히 당신은 당신의 요구에 맞게 그것을 조정해야합니다.