我有一堆立體聲 MP3,我想將其轉換為單聲道。做這個的最好方式是什麼?我更喜歡可以批量處理它們的東西。我想保持盡可能接近原版的品質。我的檔案也有不同的位元率,所以我不想讓所有檔案都為 320kpbs,而有些檔案只有 128。
另外,有什麼快速方法可以查看整個庫中哪些文件是立體聲的?
答案1
從立體聲轉換為單聲道意味著重新編碼,因此保持相同的位元率是沒有意義的。事實上,轉換128 kbit/s MP3 -> 一個新的128 kbit/s MP3 會給你帶來極其糟糕的質量,即使第二個是單聲道的(因此需要較低的比特率才能獲得相同的主觀品質)。
一般來說,我會為MP3 使用可變比特率(VBR) 設置,它以特定質量為目標,並讓編碼器設置所需的任何比特率(完全靜音的音頻需要比鯨歌更低的比特率,鯨歌需要比鯨歌更低的比特率)迴響貝斯)。在命令列中,ffmpeg 可以使用選項將音訊轉換為單聲道-ac 1
,如下所示:
ffmpeg -i input.mp3 -c:a libmp3lame -q:a 2 -ac 1 output.mp3
看這一頁取得使用指南-q:a
。請注意,該頁面上的表格針對立體聲音訊;您將看到的實際比特率會稍低一些。通常,我建議 3-4,但由於您是從 MP3 而不是原始 CD 進行編碼,因此您應該設定更高的目標。
當然,這可以很容易地實現自動化。在 Linux/OSX/其他類似 UNIX 的系統上,要轉換 MP3 目錄:
for f in *.mp3; do ffmpeg -i "$f" -c:a libmp3lame -q:a 2 -ac 1 mono-"$f"; done
要遞歸地執行此操作:
find . -type f -name "*.mp3" -exec ffmpeg -i '{}' -c:a libmp3lame -q:a 2 -ac 1 mono-'{}' \;
如果您有 GNU Parallel 和多核心機器,您可能會發現這很有用:
find . -type f -name "*.mp3" | parallel ffmpeg -i {} -c:a libmp3lame -q:a 2 -ac 1 mono-{}
答案2
答案3
Lame 可以使用 -m 開關將檔案轉換為單聲道,優點是保留元標記(我不確定 ffmpeg 是否也可以做到這一點)。
這是一個有點複雜的範例,它在使用可變位元率品質選項之一對其進行轉碼之前確定 mp3 的位元率。
貓s2mono.sh #!/bin/bash mp3文件=$@ mp3大小(){ 杜-sk“$1”| awk '{印 $1 * 8 }' } mp3長度(){ id3info“$1”| \ awk '/=== TLEN/ { if ($NF > 0) { len=int( $NF/1000) }} END {print len}' } mp3率(){ 迴聲 $(( `mp3size "$1"` / `mp3length "$1"` )) } 位元速率=`mp3rate "$mp3file"` 如果 [ $bitrate -gt 155 ];則VBR='-V4';菲 如果 [ $位元速率 -gt 190 ];那麼VBR='-V2';菲 如果 [ $bitrate -gt 249 ];那麼VBR='-V0';菲 echo 下採樣 $mp3file lame --silent $VBR -mm --mp3input "$mp3file" \ "$(basename "$mp3file" .mp3 )-mono.mp3"
我在一個資料夾中運行了這個程序,其中所有 mp3 的立體聲格式總大小為 80 MB。產生的單聲道 mp3 僅消耗 32 MB。
find . -iname \*mp3 -print0 |xargs -0 -L1 sh s2mono.sh
(...)
du -skc *-mono.mp3| tail -n1
32376 total
find . -iname \*mp3 |grep -ve '-mono' |\
while read f; do du -sk "$f" ;done |\
awk '{ tot+=$1} END{print tot}'
80112
至於你問題的最後一部分,file
將會做:
find /R/audio/muzica/_ripped/wav -exec file {} \+ |grep Monaural
答案4
這是我發現的最簡單的方法
為我在.mp3;執行 ffmpeg -i "$i" -ac 1 "${i%.} - mono.mp3";完成
同樣的方法也可用於從其他音訊格式轉換為 mp3 以及轉換為單聲道
為我在.m4b;執行 ffmpeg -i "$i" -ac 1 "${i%.} - mono.mp3";完成