내가이 문제를 알아 내려고 노력했지만 수많은 옵션이 당황 스러웠습니다.
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
li와 같이 변경할 수 있습니다. > -
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