비디오를 다른 비디오와 완전히 동일한 형식으로 변환

비디오를 다른 비디오와 완전히 동일한 형식으로 변환

두 개의 비디오 파일 A와 B가 있다고 가정해 보겠습니다.

이제 A를 B와 동일한 형식(예: 동일한 컨테이너, 동일한 오디오 및 비디오 코덱), 동일한 비트 전송률, 크기 등으로 변환하고 싶습니다.

명령줄 도구(또는 GUI 도구)를 사용하여 이를 자동화할 수 있는 방법이 있습니까(즉, 정보를 수동으로 추출하여 수동으로 입력 매개변수로 제공하지 않고)?

답변1

ffmpeg 출력을 구문 분석하면 부분적으로 이를 달성할 수 있다고 생각하지만 최상의 결과를 위해 인코딩하는 방법에 대한 문서의 미로를 알고 있어야 합니다. 이것은 약간 까다롭습니다.

아마도 또 다른 접근 방식은 매개변수를 하나로 설정하고 모든 A, B 등에서 트랜스코더 작업을 실행할 수 있는 공통 표준을 찾는 것일 수 있습니다.

답변2

아니요 모든 매개변수가 B와 동일할 수는 없습니다. 비디오 A의 다른 속성이 비디오 B와 일치하도록 비디오 A의 일부 속성을 절충하거나 조정해야 합니다.

답변3

그런 다음 자신만의 분석기를 만들 수 있습니다.

if-elif 구성($A는 파일 A의 경로)을 사용하여 grep/sed/awk 파이프라인과 함께 ffmpeg(ffmpeg 경로는 $exe임)를 사용하여 정보를 변수로 추출할 수 있습니다.

다음 예제에서는 비디오 코덱, 비디오 해상도, 프레임 속도를 가져와서 이를 24fps 이하로 재설정하고 오디오 인코딩 주파수를 가져옵니다.

videoa=`$exe -i $A 2>&1 | grep Stream.*Video | sed -e 's/.*Video: //' -e 's/[, ].*//'`
if [ $videoa = "h264" ];then videob="-c:v libx264"
elif [ $videoa = "hevc" ];then videob="-c:v libx265"
fi

resolution=$($exe -i "$f"  2>&1 | grep -oP 'Stream .*, \K[0-9]+x[0-9]+')
crop="crop=960:544:0:2,"
if [ $(echo $($exe -i "$f" 2>&1 | sed -n "s/.*, \(.*\) fp.*/\1/p") | awk  '{printf "%.0f\n", $1}';) -gt 24 ];then r="-r 24";else r=""; fi
if [ $(echo $($exe -i "$f" 2>&1 | sed -n "s/.*, \(.*\) Hz.*/\1/p") | awk  '{printf "%.0f\n", $1}';) -gt 44100 ];then af="-ar 44100";else af=""; fi

video="-map_chapters -1 -map_metadata -1 -vf ${crop}scale=${resolution},setsar=1/1,setdar=16/9 $videob -an $r"
$exe -y -ss $ss -i "$f" -t $t -map 0:v:0 $video $v

관련 정보