옵션 1

옵션 1

파일 이름을 말하는 음성으로 시작하도록 수정하고 싶은 .mp3 파일이 많이 있습니다. 이를 수행하는 가장 쉬운 방법은 다음과 같습니다.

for file in ./*.mp3; do
    BASE="$(basename "$file" .mp3)"
    mv $file $BASE-bak.mp3
    say "[[volm 0.4]] $BASE" -o $BASE-pre.aiff
    ffmpeg -i $BASE-pre.aiff -f mp3 -acodec libmp3lame -ab 192000 -ar 44100 $BASE-pre.mp3
    rm $BASE-pre.aiff
    mp3cat -o $file $BASE-pre.mp3 $BASE-bak.mp3
done

이것거의작동하지만 결과 mp3 파일이 손상되었습니다(길이는 적당하지만 소리가 나지 않으며 파일 이름을 말하는 데 걸린 시간(약 2초) 후에 항상 재생이 중지됩니다(대략 2초). mp3cat그러나 ffmpegor 또는 다른 것을 사용하는 것 역시 작동하지 않는 것 같고, 내 생각에는 적절한 양의 스트림을 갖지 않아 mp3wrap생성된 파일과 관련이 있는 것 같습니다 (그게 무엇을 의미하든).say

이 문제를 해결하는 방법이나 완전히 다른 방식으로 수행하는 방법에 대한 제안이 있습니까?

답변1

ffmpeg를 사용하도록 스크립트를 수정했습니다. 언제나 그렇듯, 데이터 손실을 방지하려면 스크립트를 실행하기 전에 파일을 백업하세요.

옵션 1

속도가 느려지면 파일이 다시 인코딩되지만 메타데이터는 보존됩니다.

for file in ./*.mp3; do
    BASE="$(basename "$file" .mp3)"
    mv "${file}" "${BASE}-bak.mp3"
    say "[[volm 0.4]] ${BASE}" -o "${BASE}-pre.aiff"
    ffmpeg -i "${BASE}-pre.aiff" -f mp3 -acodec libmp3lame -ab 192000 -ar 44100 "${BASE}-pre.mp3"
    rm "${BASE}-pre.aiff"
    ffmpeg -i "${BASE}-pre.mp3" -i "${BASE}-bak.mp3" -filter_complex [0:a][1:a]concat=n=2:v=0:a=1 -map_metadata 1 "${file}"
    rm "${BASE}-pre.mp3"
done

옵션 2:

빠르고 재인코딩이 필요하지 않으며 메타데이터가 손실됩니다.

for file in ./*.mp3; do
    BASE="$(basename "$file" .mp3)"
    mv "${file}" "${BASE}-bak.mp3"
    say "[[volm 0.4]] ${BASE}" -o "${BASE}-pre.aiff"
    ffmpeg -i "${BASE}-pre.aiff" -f mp3 -acodec libmp3lame -ab 192000 -ar 44100 "${BASE}-pre.mp3"
    rm "${BASE}-pre.aiff"
    echo "file '${BASE}-pre.mp3'" >temp
    echo "file '${BASE}-bak.mp3'" >>temp
    ffmpeg -f concat -safe 0 -i temp "${file}"
    rm "${BASE}-pre.mp3"
    rm temp
done

어느 쪽이든 결과 파일은 QuickTime을 사용하여 제대로 작동하는 것처럼 보이며 전체 파일이 제대로 재생됩니다.

답변2

이것을 시도해 보십시오: 대상 .mp3도 변환하려는 동일한 형식으로 변환하십시오. 몇 가지 수정 사항과 주의 사항을 적용하여 단계를 다시 작성하세요.

mkdir -p backup/
mkdir -p working/
for file in ./*.mp3; do
    BASE="$(basename "$file" .mp3)"
    say "[[volm 0.4]] $BASE" -o "${BASE}-pre.aiff"
    ffmpeg -i "${BASE}-pre.aiff" -f mp3 -acodec libmp3lame -ab 192000 -ar 44100 "${BASE}-pre.mp3"
    ffmpeg -i "$file" -f mp3 -acodec libmp3lame -ab 192000 -ar 44100 "${BASE}-bak.mp3"
    rm "${BASE}-pre.aiff"
    mv "$file" backup/
    mp3cat -o "$file" "${BASE}-pre.mp3" "${BASE}-bak.mp3"
    mv "${BASE}-pre.mp3" working/
    mv "${BASE}-bak.mp3" working/
done

관련 정보