.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.