내가이 문제를 알아 내려고 노력했지만 수많은 옵션이 당황 스러웠습니다.

ffmpeg 또는 mencoder (또는 다른 것을 사용하고 싶습니다. )를 사용하여 수신 동영상을 고정 된 화면 크기로 변환합니다.

동영상이 더 넓거나 짧으면 동영상을 중앙에서 자릅니다. 크기가 맞지 않으면 크기를 늘리거나 정확히 고정 된 화면 크기로 만들 수 있습니다.

정확히 필요한 것은 MP3 오디오 트랙이있는 XVid AVI의 720×480입니다.

많은 페이지가 최대 해상도로 크기를 조정하는 방법이 있지만 동영상이 정확히 그 해상도 여야합니다 (추가 부분이 잘리고 검은 색 막대가 없음).

누구나 실행 명령 줄을 알려줄 수 있나요? 여러 명령 줄이 필요한 경우 (해결 방법을 확인하려면 X를 실행하십시오. 계산 한 다음 해당 계산의 출력으로 Y를 실행) 스크립트를 작성할 수 있습니다.

댓글

  • 분명히 비디오 장치는 Mpeg4에서도 작동합니다. XVid AVI로, '가 더 쉽고 / 더 좋습니다.

답변

저는 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 

너비 또는 높이를 설정할 수 있습니다. ffmpeg가 가로 세로 비율을 유지하면서 동영상 크기를 조정할 수 있도록 -1에 추가합니다. 실제로 계산 된 값이 균등해야하므로 -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} 

댓글

  • ' 시나리오를 놓친다는 우스운 느낌이 들었지만 ' 많은 비디오 파일로 시도해 보았고 비디오를 절대 올바른 크기로 올바르게 자르고 크기를 조정하는 것 같습니다. 잘하셨습니다.
  • CROP_SIDE 결정에 문제가있는 것 같습니다.
  • `# 실제 크기와 원하는 크기 사이의 비율 가져 오기 w_rate = echo "scale=3; ${in_width}/${out_width}*1000"| bc | awk '{printf "%d", $0}' h_rate = echo "scale=3; ${in_height}/${out_height}*1000"| bc | awk '{printf "%d", $0}' # Let ' s는 더 짧은 쪽을 취하므로 동영상은 원하는 크기만큼 큰 #, 긴면 자르기 : crop_side = ' n ' if [$ {w_rate} -gt $ {h_rate}]; 그런 다음 scale = " -2 : $ {out_height} " crop_side = ' w ' else scale = " $ {out_width} :-2 " crop_side = ' h ' fi`

답변

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 “을 입력 파일 이름으로 바꿉니다.

댓글

  • ffprobe를 호출 할 필요가 없으므로 '이 답변이 가장 좋습니다. 명령의 백 슬래시 쉼표 시퀀스에 유의하십시오. C / JavaScript / PHP 문자열에 명령을 배치하는 경우 ' ' 백 슬래시를 이스케이프해야합니다.
  • 잘 했어요, 브라이언. 비디오 필터 부분도 제가 필요로하는 부분입니다. (예 : 이전 4 : 3 비디오를 16 : 9로 변환)!
  • 천재! 모두 하나에 완료됩니다.
  • 위의 스크립트보다 훨씬 깔끔합니다. XVID / MP3를 원하지 않는 경우 ' 두 번째 따옴표 뒤의 태그를 -c:a copy scaled_result.mp4
  • iw*sar에서 '의 sar에 대해 설명해 주시겠습니까?

답변

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

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

위는 먼저 동영상을 16 : 9 세로로 자른 다음 400px 높이 x 적절한 (짝수) 너비로 조정합니다.

Answer

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

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

옵션에 대한 두 개의 확인란이 있습니다 .-

가로 세로 비율 유지 (X) 모든 픽셀 채우기 (X)

입력으로 4 개의 변수 만 필요합니다. (1) 원본 비디오 너비, (2) 원본 비디오 높이, (3) 장치 너비, (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 

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다