ffmpeg를 사용하여 mp3 파일을 자동으로 연결하기 위해 다음 bash 스크립트를 작성했습니다.
i=0
for f in "${@:2}"
do
filter+="[$i:a:0]"
i=`expr $i + 1`
files+="-i $f "
done
filter+="concat=n=$i:v=0:a=1[outa]"
ffmpeg $files -filter_complex $filter -map '[outa]' "$1.mp3"
그러나 파일 이름에 공백이 포함된 파일을 처리해야 하는 경우가 종종 있지만 터미널로 드래그하면 모든 공백이 이스케이프되어 다음 명령 호출이 생성됩니다.
./mergemp3.sh outfilename /path/to/my\ file\ with\ spaces.mp3 /path/to/another\ file\ with\ spaces.mp3
나에게는 이것이 맞는 것 같다. 그러나 ffmpeg는 실패합니다
/path/to/my: No such file or directory
분명히 ffmpeg는 백슬래시로 올바르게 이스케이프 처리되었음에도 불구하고 파일 이름의 공백을 이해하지 못합니다. 파일 이름 목록에 대한 좋은 세부 정보가 있는 것 같아요. 어떤 아이디어가 있나요?
답변1
명령줄을 작성할 때 명확성과 안전성을 위해 배열을 사용하는 것이 좋습니다.
files=()
i=0
for f in "${@:2}"
do
filter+="[$((i++)):a:0]"
files+=(-i "$f")
done
filter+="concat=n=$i:v=0:a=1[outa]"
ffmpeg "${files[@]}" -filter_complex "$filter" -map '[outa]' "$1.mp3"
답변2
이것을 시도해 보십시오. 이것은 단지 bash
(내가 처음으로 사용한 것을 기준으로) 모든 쉘에서 작동할 것입니다.답변@Kusalananda를 통해):
output=$1; shift
i=0
for f in "$@"; do
shift
set -- "$@" -i "$f"
filter="$filter[$i:a:0]"
i=$((i+1))
done
filter="${filter}concat=n=$i:v=0:a=1[outa]"
ffmpeg "$@" -filter_complex $filter -map '[outa]' "$output.mp3"
이것은 하우징 부분에 관한 것입니다. 복잡한 필터가 실제로 필요한지 잘 모르겠습니다.