답변:
lame
완벽하게이 작업에 적합하지만, 내가 사용하는거야 ffmpeg
그리고 ffprobe
그들은 단지 MP3 파일보다 더 일반화 될 수 있기 때문에 내가 내 손의 뒷면처럼 그들을 알고 있기 때문에,이 대답을합니다. 가장 먼저:
sudo apt-get install ffmpeg
내가 알고있는 도구는 미디어 파일을 읽은 다음 즉시 입력을 덮어 쓸 수 있습니다. 중간 파일을 사용해야합니다. 단일 파일의 경우 다음을 수행 할 수 있습니다.
ffmpeg -i file.mp3 -c:a libmp3lame -b:a 192k temp.mp3
mv temp.mp3 file.mp3
이를 한 줄로 결합 할 수 있습니다.
ffmpeg -i file.mp3 -c:a libmp3lame -b:a 192k temp.mp3 && mv temp.mp3 file.mp3
는 &&
것을이 의미 mv
명령하지 않는 한 실행되지 않습니다 ffmpeg
(성공을 의미) 0의 상태로 종료됩니다.
파일의 비트 전송률을 확인하려면 다음을 사용할 수 있습니다 ffprobe
.
ffprobe -show_streams -select_streams a:0 -v quiet file.mp3 | grep -F 'bit_rate=320000'
-show_streams
ffprobe
개별 스트림에 대한 정보를 표시하도록 지시 합니다. 어느 것을 선택 -select_streams
해야하는지 알려주고 '첫 번째 오디오 스트림 (비디오 스트림으로 저장된 표지 아트의 경우 MP3 파일에 중요 함)을 의미합니다. 파이프 ( )는 표준 출력을 가져와 공급합니다 . 주어진 패턴과 일치하는 행 (이 경우 문자열을 포함하는 행) 만 인쇄합니다 . 320kkbps MP3에서이를 실행하면 다음과 같은 줄이 나타납니다.a:0
|
ffprobe
grep
grep
bit_rate=320000
bit_rate=32000
다른 비트 전송률로 실행하면 출력이 전혀 없습니다. grep이 일치하지 않고 상태 1로 종료됩니다. 이는 ffmpeg 명령으로 해당 명령을 연결할 수 있음을 의미합니다.
ffprobe -show_streams -select_streams a:0 -v quiet file.mp3 | grep -F 'bit_rate=320000' && ffmpeg -i file.mp3 -c:a libmp3lame -b:a 192k temp.mp3 && mv temp.mp3 file.mp3
또는 좀 더 읽기 쉽게 :
ffprobe -show_streams -select_streams a:0 -v quiet file.mp3 | grep -F 'bit_rate=320000' &&
ffmpeg -i file.mp3 -c:a libmp3lame -b:a 192k temp.mp3 &&
mv temp.mp3 file.mp3
320kbps MP3에서만 작동합니다. 몇 가지 테스트 파일로 시도하십시오.
다음 단계는 여러 파일로 작업하는 것입니다. 이를 수행하는 표준 방법에는 for
루프와 find
명령 의 두 가지가 있습니다. 다음은 디렉토리의 모든 MP3에서 작동합니다.
for f in *.mp3; do
ffprobe -show_streams -select_streams a:0 "$f" | grep -F 'bit_rate=320000' &&
ffmpeg -y -i "$f" -c:a libmp3lame -b:a 192k /tmp/temp.mp3 && mv /tmp/temp.mp3 "$f"
done
이것은 하위 디렉토리에 들어 가지 않을 것입니다. 그렇게하려면 globstar
쉘 옵션 을 설정해야합니다 .
shopt -s globstar
for f in **/*.mp3; do
ffprobe -show_streams -select_streams a:0 "$f" | grep -F 'bit_rate=320000' &&
ffmpeg -y -i "$f" -c:a libmp3lame -b:a 192k /tmp/temp.mp3 && mv /tmp/temp.mp3 "$f"
done
로 find
:
find . -name '*.mp3' -exec sh -c 'ffprobe -show_streams -select_streams a:0 "$0" | grep -F "bit_rate=320000" &&
ffmpeg -y -i "$0" -c:a libmp3lame -b:a 192k /tmp/temp.mp3 && mv /tmp/temp.mp3 "$0"' '{}' \;
이들 모두는 순차적으로 엄격하게 실행되며 한 번에 하나의 파일 만 변환합니다. 그러나 프로세서는 그 이상의 기능을 제공 할 수 있습니다. 작업 속도를 높이기 위해 GNU를 사용할 수 있습니다 parallel
.
sudo apt-get install parallel
shopt -s globstar
parallel 'ffprobe -show_streams -select_streams a:0 {} | grep -F "bit_rate=320000" &&
ffmpeg -y -i {} -c:a libmp3lame -b:a 192k {.}.temp.mp3 && mv {.}.temp.mp3 {}' ::: **/*.mp3
또는:
find . -name '*.mp3' | parallel 'ffprobe -show_streams -select_streams a:0 {} | grep -F "bit_rate=320000" &&
ffmpeg -y -i {} -c:a libmp3lame -b:a 192k {.}.temp.mp3 && mv {.}.temp.mp3 {}'
Unrecognized option 'select_streams' Failed to set value 'a:0' for option 'select_streams'
avconv -i {} -b:a 192k {.}.temp.mp3 && mv {.}.temp.mp3 {}