.mp4 파일을 재귀 적으로 검색하고 ffmpeg로 처리


1

다른 폴더에있는 .mp4 비디오 파일이 있습니다. 우분투에서 다음 명령을 사용하여 ffmpeg로 모든 비디오 파일을 처리하고 싶습니다 (처리 된 비디오는 새 파일 이름으로 저장 됨).

ffmpeg -i input_video -vf scale=w=320:h=-1 -y -vcodec libx264 -preset ultrafast -r 20 output_video

파일 이름에 "xyz"라는 문자열이 포함 된 모든 .mp4 비디오 파일을 루트 폴더로 재귀 적으로 검색하는 bash 스크립트를 사용하여이 작업을 수행하고 싶습니다 /media/myShare.

또한 때때로 새로운 비디오 파일을 하위 디렉토리에 추가합니다. 스크립트를 다시 실행할 때 이미 변환 된 스크립트를 처리하고 새로 추가 된 스크립트 만 처리하고 싶지 않습니다. 이 모든 것을 어떻게 할 수 있습니까?

도움을 주시면 감사하겠습니다.


1
당신의 OS는 무엇입니까? "일괄 처리"태그는 Windows를 약간 제안합니다. 이 "추가로 ..."부분은 별도의 문제 (별도의 질문 일 수 있음)이며 전체 질문이 "너무 광범위"한 것으로 닫히기 쉽습니다. 제발 편집 질문을하고 향상시킬 수 있습니다.
— Kamil Maciorowski 님이

1
슈퍼 유저에 오신 것을 환영합니다! 있습니다 superuser.com이 무료 스크립트 / 코드 작성 서비스가 아닙니다. 지금까지 시도한 내용 (이미 사용중인 스크립트 / 코드 포함)과 중단 된 부분을 알려 주면 특정 문제에 대한 도움을 요청할 수 있습니다. 또한 좋은 질문을하려면 어떻게해야합니까?를 읽어보십시오 . .
— DavidPostill

@KamilMaciorowski 내 OS는 우분투입니다. 배치 태그를 remvode했습니다.
— 기계

답변:


2

스크립트를 작성해야하는 속성이 몇 가지 있습니다. 하나씩 살펴 보도록하겠습니다.

파일 이름에 패턴이있는 모든 MP4 파일을 반복적으로 찾아서 처리합니다.

여기 친구가 있습니다 find-대부분의 옵션이 필요하지 않으므로 라인을 따라 뭔가 find "$STARTFOLDER" -type f -name '*$PATTERN*.mp4'좋은 출발입니다. 당신은 for구조로 이것들을 반복 할 수 있습니다

언급하지 않은 내용 : 새 파일 이름 자동 생성

당신이 사용하려고 할 수 있습니다 basename의 라인을 따라, 그것에 대해 뭔가를 BN=$(basename "$FILEPATH" '.mp4'); BP=$(dirname "$FILEPATH"); NEWFILENAME="$BP/$BN-converted.mp4"좋아 보인다.

함께 모아서

이제 모든 건물 벽돌을 갖추 었으므로 물건을 연결해야합니다.

#!/bin/bash

STARTFOLDER="/media/myShare"
PATTERN="xyz"
MARKER="converted"

echo -n "Finding candidate files .."
FILELIST=$(find "$STARTFOLDER" -type f -name '*$PATTERN*.mp4')
echo ".. "$(echo -e "$FILELIST" | wc -l)" found"

while read FILEPATH; do
  # A bit of healthy paranoia
  test -z "$FILEPATH" && continue
  test -f "$FILEPATH" || continue
  echo -n "Working on $FILEPATH .."

  # New file name
  BN=$(basename "$FILEPATH" '.mp4')
  BP=$(dirname "$FILEPATH")
  NEWFILEPATH="$BP/$BN-$MARKER.mp4"

  # Skip result files
  ISRESULT=$(echo "$BN" | grep -e "$MARKER\\.mp4\$")
  if test -n "$ISRESULT"; then
    echo "..  skipping (is a result file)"
    continue
  fi

  # Skip processed files
  if test -f "$NEWFILEPATH"; then
    echo "..  skipping (result file exists)"
    continue
  fi

  # Process
  echo -n ".. running ffmpeg .."
  RES=$(ffmpeg -i "$FILEPATH" -vf scale=w=320:h=-1 -y -vcodec libx264 -preset ultrafast -r 20 "$NEWFILEPATH" </dev/null 2>&1)
  echo ".. done (exit code $?)"

done < <(echo -e "$FILELIST")

주의 사항 : 이것은 완전히 테스트되지 않았으며 오타가있을 수 있습니다


대답 해 주셔서 감사합니다. 변환 후 파일 이름에 MARKER가있는 원본 파일과 변환 된 파일이 있습니다. 너무 길어서 좋았지 만 스크립트를 다시 실행하면 파일 이름에 MARKER가있는 파일 만 제외되고 원본 파일은 제외됩니다. 원본 파일과 새로 생성 된 MARKER 파일을 제외하고 아직 처리되지 않은 파일 (예 : 스크립트 실행 후 추가 한 파일) 만 포함하고 싶습니다.
— 기계

결과 파일을 건너 뛰고 더 읽기 쉬운 출력을 생성하도록 스크립트를 편집했습니다.
— Eugen Rieck

ffmpeg 명령으로 줄의 주석을 해제하면 모든 파일을 완벽하게 반복합니다. 그러나 ffmpeg 명령이 활성화되면 첫 번째 파일이 올바르게 처리되고 ".. 완료 (종료 코드 0)"가 ​​인쇄되지만 이후에 다음 파일이 더 이상 처리되지 않고 스크립트가 종료됩니다 (즉, while 루프가 종료 됨). 왜 그런지 아십니까?
— 기계

내 나쁜 ffmpeg-stdin을 소비하여 루프를 망칩니다. 나는 ffmpeg에 대한 표준 입력 리디렉션을 제공하기 위해 답변을 편집했습니다
— Eugen Rieck

yow가 RES절대 사용하지 않는 변수로 캡처 되는 이유는 무엇 입니까? 전반적으로, 이것은 대부분 불필요하고 때로는 비효율적 인 변수 캡처에 의해 발생합니다. 또한 개인 변수에 소문자를 사용하십시오.
— tripleee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.