자르기 및 크기 조정을 통해 비디오를 고정된 화면 크기로 변환

자르기 및 크기 조정을 통해 비디오를 고정된 화면 크기로 변환

나는 이것을 스스로 알아내려고 노력했지만 수많은 옵션 때문에 혼란스러워졌습니다.

ffmpeg이상적으로는 또는 ( mencoder또는 다른 것을 사용하지만 둘 다 사용해 본 적이 있음)을 사용하여 수신 비디오를 고정된 화면 크기로 변환하고 싶습니다 .

비디오가 너무 넓거나 너무 짧은 경우 비디오를 중앙에서 자릅니다. 크기가 올바르지 않은 경우 크기를 위아래로 조정하여 고정된 화면 크기에 정확히 맞도록 하세요.

나에게 궁극적으로 필요한 것은 720x480 XVid AVI 및 MP3 오디오 트랙입니다.

최대 해상도로 크기를 조정하는 방법을 보여주는 많은 페이지를 찾았지만 비디오가 정확히 해당 해상도여야 합니다(초과 부분을 잘라내고 검은색 막대가 없음).

누구든지 그것을 실행하기 위한 명령줄을 말해 줄 수 있습니까? 아니면 적어도 일부/대부분의 방법을 알려줄 수 있습니까? 여러 개의 명령줄이 필요한 경우(해상도를 얻기 위해 X를 실행하고 이 계산을 수행한 다음 해당 계산의 출력으로 Y를 실행) 스크립트를 작성할 수 있습니다.

답변1

ffmpeg -i input.file -vf "scale=(iw*sar)*max(720/(iw*sar)\,480/ih):ih*max(720/(iw*sar)\,480/ih), crop=720:480" -c:v mpeg4 -vtag XVID -q:v 4 -c:a libmp3lame -q:a 4 output.avi

"input.file"을 입력 파일 이름으로 바꾸십시오.

답변2

나는 ffmpeg 전문가는 아니지만 이것이 도움이 될 것입니다.

먼저 다음과 같이 입력 비디오의 크기를 얻을 수 있습니다.

ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width in.mp4

상당히 새로운 ffmpeg를 사용하면 다음 옵션을 사용하여 비디오 크기를 조정할 수 있습니다:

ffmpeg -i in.mp4 -vf scale=720:480 out.mp4

너비나 높이를 설정하여 비디오 크기를 조정하고 화면 비율을 유지할 -1수 있습니다. ffmpeg실제로 -2계산된 값이 균등해야 하므로 이것이 더 나은 선택입니다. 따라서 다음을 입력할 수 있습니다.

ffmpeg -i in.mp4 -vf scale=720:-2 out.mp4

영상을 받고 나면 높이를 계산하는 720x480중이라 예상보다 크기가 클 수 있으니 ffmpeg잘라주셔야 합니다. 이는 다음과 같이 수행할 수 있습니다.

ffmpeg -i in.mp4 -filter:v "crop=in_w:480" out.mp4

마지막으로 다음과 같은 스크립트를 작성할 수 있습니다(쉽게 최적화할 수 있지만 가독성을 위해 단순하게 유지했습니다).

#!/bin/bash

FILE="/tmp/test.mp4"
TMP="/tmp/tmp.mp4"
OUT="/tmp/out.mp4"

OUT_WIDTH=720
OUT_HEIGHT=480

# Get the size of input video:
eval $(ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width ${FILE})
IN_WIDTH=${streams_stream_0_width}
IN_HEIGHT=${streams_stream_0_height}

# Get the difference between actual and desired size
W_DIFF=$[ ${OUT_WIDTH} - ${IN_WIDTH} ]
H_DIFF=$[ ${OUT_HEIGHT} - ${IN_HEIGHT} ]

# Let's take the shorter side, so the video will be at least as big
# as the desired size:
CROP_SIDE="n"
if [ ${W_DIFF} -lt ${H_DIFF} ] ; then
  SCALE="-2:${OUT_HEIGHT}"
  CROP_SIDE="w"
else
  SCALE="${OUT_WIDTH}:-2"
  CROP_SIDE="h"
fi

# Then perform a first resizing
ffmpeg -i ${FILE} -vf scale=${SCALE} ${TMP}

# Now get the temporary video size
eval $(ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width ${TMP})
IN_WIDTH=${streams_stream_0_width}
IN_HEIGHT=${streams_stream_0_height}

# Calculate how much we should crop
if [ "z${CROP_SIDE}" = "zh" ] ; then
  DIFF=$[ ${IN_HEIGHT} - ${OUT_HEIGHT} ]
  CROP="in_w:in_h-${DIFF}"
elif [ "z${CROP_SIDE}" = "zw" ] ; then
  DIFF=$[ ${IN_WIDTH} - ${OUT_WIDTH} ]
  CROP="in_w-${DIFF}:in_h"
fi

# Then crop...
ffmpeg -i ${TMP} -filter:v "crop=${CROP}" ${OUT}

답변3

한 번에 자르고 크기를 조정하려면 다음과 같이 자르고 크기를 조정하는 필터 체인을 만들 수 있습니다.

ffmpeg -i SomeInput.mp4 -vf "crop=in_h*9/16:in_h,scale=-2:400" -t 4 SomeOutput.mp4

위의 코드는 먼저 비디오를 16:9 세로 비율로 자른 다음 높이 400px x 적절한(짝수) 너비로 크기를 조정합니다.

답변4

저는 ffmpeg를 처음 접했지만 이제 VB.NET에 SD 카드 액세스가 가능한 소형 장치에서 사용할 수 있는 다양한 출력 형식의 원시 동영상을 생성할 수 있는 멋진 작은 변환기가 있지만 사용되는 복잡한 비디오를 디코딩하기에는 전력이 충분하지 않습니다.

크기를 조정하고 자를 때 작동하는 방식 때문에 매개변수를 수동으로 코딩하고 작성해야 합니다. 기본적으로 최종 너비와 높이를 알아야 합니다.

두 가지 옵션 확인란이 있습니다.

종횡비 유지(X) 모든 픽셀 채우기(X)

입력에는 (1) 원본 비디오 너비, (2) 원본 비디오 높이, (3) 장치 너비, (4) 장치 높이로 4개의 변수만 필요합니다.

VB.NET은 모든 언어에 쉽게 적용할 수 있습니다.

    Dim crop As String = "" ' will build this in ffmpeg format for -s or scale and crop

    If cbAspectRatio.Checked = False Then
        m_dest_output_w = sz._w
        m_dest_output_h = sz._h

        ' scale to w * h - simple
        crop = " -s " & m_dest_output_w & ":" & m_dest_output_h
    Else
        Dim ratio As Double = CDbl(m_video_width) / CDbl(m_video_height) ' this is aspect ratio of original unsized video

        If cbFillPixels.Checked = False Then ' shrink to fit
            If sz._w * ratio <= m_video_height Then
                m_dest_output_w = sz._w
                m_dest_output_h = sz._w / ratio
            Else
                m_dest_output_h = sz._h
                m_dest_output_w = sz._h / ratio
            End If

            ' no cropping just resizing to a non-filled area that fits

            crop = " -s " & m_dest_output_w & ":" & m_dest_output_h ' no cropping needed as letterboxed

        Else ' expand / fill --- cropping needed
            If sz._w * ratio >= m_video_height Then
                m_dest_output_w = sz._w
                m_dest_output_h = sz._w * ratio

                crop = ",crop=" & sz._w & ":" & sz._h & ":0:" & Math.Abs((m_dest_output_h - sz._h)) \ 2
            Else
                m_dest_output_h = sz._h
                m_dest_output_w = sz._h * ratio

                crop = ",crop=" & sz._w & ":" & sz._h & ":" & Math.Abs((m_dest_output_w - sz._w)) \ 2 & ":0"
            End If

            crop = " -vf scale=" & m_dest_output_w & ":" & m_dest_output_h & crop

            m_dest_output_w = sz._w
            m_dest_output_h = sz._h
        End If
    End If

관련 정보