Tüm * flac * Fmpmpeg ile * .mp3 dönüştürmek için Bash komut dosyası?


28

Belirli bir klasördeki tüm * .flac dosyasını * .mp3 dosyasına dönüştürmek istiyorum.

Bu denedim ama işe yaramadı:

# change to the home directory
cd ~/music
# convert all *.flac files
ffmpeg -i *.flac -acodec libmp3lame *.mp3
# (optional: check whether there are any errors printed on the terminal)
sleep 60

Hedefime nasıl ulaşılır?


3
"LOOP İÇİN" denediniz mi?
Danila Ladner

@DanilaLadner Henüz değil. İpucu için teşekkürler.
Kevin Dong,

Paralel olarak bunu yapan bir komut dosyası yazdım ve etiketleri kopyaladım: http://tuxhelp.org/#flac-distiller

Üzgünüm unuttum. Dönüştürüldükten sonra dosya adı file.avi.mp3 olur. Bunu kullanabilirsiniz: yeniden adlandırmak için "s / .avi // g" * .avi.mp3 .avi.

1
Zor işten sonra bilgisayar molası verin.
MeowMeow

Yanıtlar:


37

Bunu dene:

for i in *.flac ; do 
    ffmpeg -i "$i" -acodec libmp3lame "$(basename "${i/.flac}")".mp3
    sleep 60
done

1
Alan içeren dosyalar ile çalışmıyor. $(basename "${i/.flac}")Boşlukları işlemek için nasıl değişiklik yapabilirim ?
ppr,

1
@ppr Bu satırı fordöngünün hemen önüne koymayı deneyin : IFS = $ '\ n'
mkc

6
Ben değiştirerek uzay sorunu çözüldü $(basename "${i/.flac}").mp3için "$(basename "${i/.flac}").mp3"(etrafındaki tırnak koyarak)
MalcolmOcean

50

Basit bir 1 astar çözümü: find -name "*.flac" -exec ffmpeg -i {} -acodec libmp3lame -ab 128k {}.mp3 \;

http://lewisdiamond.blogspot.ca/2012/01/converting-flac-to-mp3.html

Bunun, verilen dizinde tekrarlı olarak uygulanacağını unutmayın. Yani eğer bunu Müzik klasörünüzden çalıştırırsanız, tüm klasörleri alt klasörlerden dönüştürür ve yanında bir .mp3 oluşturur. Bağlantıda gösterildiği gibi, doğrudan flac ve lame kullanarak (yani, w / flac, lame borusu, bir dosyaya .mp3 çıktısı okuyarak) ffmpeg olmadan da yapabilirsiniz.


Sen kullanabilirsiniz -maxdepth 1tekrarlamasinda sınırlamak için X Tian yanıtında gibi sanırım.

2
Evet yapabilirsin. Ayrıca xargs'a aktarılan ls komutunu veya for for döngüsünü de kullanabilirsiniz. Sadece özyinelemeli bir aramanın OP'nin ihtiyaç duyduğu şey boyunca daha fazla olduğu varsayımına (muhtemelen yanlış) varıyorum (yani tüm .flac'ı müzik kütüphanemden değiştiriyorum).
Lewis Diamond

16
Bu komut harika - ancak; Sonunda * .flac.mp3 adlı dosyalarla bitiyorsunuz. Senin emrini kullanarak, bununla geldim ...find -name "*.flac" -exec bash -c 'ffmpeg -i "{}" -y -acodec libmp3lame -ab 128k "${0/.flac}.mp3"' {} \;
Shane

2
Evet, blogda açıkladığım gibi, .mp3'ü eklemenin bu yönünü sevdim çünkü bana bu dosyaların kayıpsız bir kaynaktan geldiğini ve bunun sabit diskimde bir yerde bulunması gerektiğini söyledi.
Lewis Diamond,

@Shane yorum benim için çalıştı.
Chaudhry Waqas

8

Dosya adlarında bazı boşluklar varsa:

for a in *.flac; do
  f="${a[@]/%flac/mp3}"
  ffmpeg -i "$a" -qscale:a 0 "$f"
done

Mp4 ve wav dosyalarının bir karışımını içeren bir klasörüm var. Hepsini mp3'e nasıl dönüştürebilirim? Teşekkür ederim.
kRazzy R

2

Burada bulduğum her şeyi (ve belki başka sitelerde) aldım ve sadece tekrarlayan flash mp3leri oluşturmak için değil, aynı zamanda çoklu okuma desteğiyle başka bir yerde onları oluşturmak için göreceli yolları koruyan küçük bir araç yarattım.

oh, ve evet, görüyorum ki, bu durumda ffmpeg kullanmadım, çünkü OSMC'm ffmpeg için paketler sunmadı, sadece avconv, ama zaten burada olduğunuzdan, sanırım "temelde" Aynı - en azından en önemli kısım için. Sadece "avconv" komutunu "ffmpeg" ile değiştirin. İlk seferim ffmpeg bin ve aynı seçeneklerle yapıldı.

Ben kesinlikle bir bash hacker değilim, ama verilen talepleri ile ilk bashript olarak, ve belki de birileri fayda sağlayacak. Sizin tarafınızdan herhangi bir öneri için açığım, ama şu ana kadar benim için çalışıyor.

Her bir çekirdekte bir tane olmak üzere 4 örneği döndüren senaryom şöyle:

#!/bin/bash
# this should be quite self-explanatory 
for i in {1..4}
do
echo "started instance no: $i"
/home/osmc/transform.sh . &
# sleeping time can be shorter, this is just so, that 
# not all 4 processes will want to start with the same 
# file, during runtime collisions should not become an issue
sleep 5
done
echo "all instances started"

Ve çalışan senaryo şöyle:

#!/bin/bash
# take care of spaces
IFS=$'\n'
# my music folders, remote is the source, local the target dir
remote=/mnt/music/FLAC
local=/mnt/1tb/mp3
# for all flac files start loop
for i in $(find $remote -type f -iname '*.flac' );
do
## SET VARIABLES for PATHS and FILENAMES
## this might be able to be super short with sed and complex one-liner,
## but I s*ck at regex
fullfile=$i
# strip extension
filename="${i##*/}"
# add new extension
filename="${filename%.*}.mp3"
# get full dirname from inputfile
fulldir=$(dirname "${i}")
# strip leading dirs from full input dir
# count the dirs, add two, then you're good.
reldir="$(echo $fulldir | cut -d'/' -f5-)"
# some subdirs in my collection even have a flac subdir, you might
# ignore this, it strips only if it exists
reldir=${reldir//flac}
# combine target dir and relative dir
outdir="$local/$reldir"
# generate the full output filename for conversion
outfile="$outdir/$filename"
# create whole target directory - yes, I need it only once, but hey,
# it works, didn't want to start a if not exist statement... should I? 
mkdir -p "$outdir"
# run conversion - finally... you may want or need to replace 
# "avconv" with "ffmpeg"
avconv -n -nostats -loglevel info -i "$fullfile" -codec:a libmp3lame -qscale:a 0 "$outfile"
done

hangi bulunabilir https://github.com/erdnuesse/flac-to-mp3 adresinde

Saygılar, Kay


aramıza hoşgeldin, iyi çaba. +1
Alex Stragies

1

Ffmpeg burada iyi çalışmadığı için @ Ketan'ın avconv kullandığı cevap üzerinde çalıştım.

for i in *.flac ; do 
    avconv -i "$i" "./mp3/$i".mp3
done

Bu, flacbir klasördeki dosyaları dosyalara dönüştürür mp3ve ardından varolan bir "mp3" klasörüne taşır. Dosyalar "original_name.flac.mp3" modelinde adlandırılacak


1
find . -maxdepth 1 -type f -name '*.flac' | while IFS= read -r f; do
  ffmpeg -i  "$f" -acodec libmp3lame "$( sed -e's/\.flac/.mp3/g' <<< $f )"
done

1
sed ifadesinin sona ermesi gerekiyor '
Jaime M.

1

GNU Parallel bu tür görevler için yapılır:

# change to the home directory
cd ~/music
# convert all *.flac files
parallel ffmpeg -i {} -acodec libmp3lame {.}.mp3 ::: *.flac
# (optional: check whether there are any errors printed on the terminal)
sleep 60

İşleri paralel olarak çalıştırır (CPU çekirdeği başına bir iş) ve terminaldeki çıktının bir arada olmadığından emin olun.

Daha fazla bilgi edinmek için bölüm 1 + 2'yi okuyarak 15 dakika harcayın: https://zenodo.org/record/1146014


Bu ilginç görünüyor. {.}.mp3 :::Yapının ne yaptığını açıklayabilir misiniz ? Ya da onu açıklayan manuel bölüme bakın?
jottr


0

Örneğin, birden fazla avi dosyanız varsa:

ls *.avi | xargs -I {} ffmpeg -i {} {}.mp3

0

Yardımcı olabilirse .... Bunu yapmak için küçük bir bash betiği yazdım .... Ffmpeg / flac yüklü olması gerekir.

Nasıl çalışır:

2 argüman alır:

  1. Müzik kütüphanenizin klasörü (flac / ogg / mp3 ...)
  2. Hedef klasör (daha önce oluşturmanız gerekir).

Üretir:

  • Kaynak klasörden hedef klasöre tam bir kopya ile:
    • flac olmayan dosyalar kopyalanır.
    • mp3'e dönüştürülen flac dosyaları (VBR yüksek kalite)
  • Flac dosyalarını dönüştürme komutlarını içeren bir run.sh dosyası (bu komut dosyası otomatik olarak yürütülür).

#!/bin/bash

FLAC_PATH=$1
CONV_PATH=$2

DEBUG=0;

function usage {
  echo "";
  echo "    This script convert all flac files from a folder to mp3 files to a second folder";
  echo "";
  echo "    Usage :";
  echo "        ./conv.sh {Source Folder} {Destination Folder}";
  echo "        note : booth folder must exist before starting this script";
  echo "               files other than flac are copied to the destination folder";
  echo "";
}

if [ ! -d "$2" ]; then
  echo "";
  echo " ERROR : [$2] is not a directory.";
  usage
  exit 1
fi;

if [ ! -d "$2" ]; then
  echo "";
  echo " ERROR : [$2] is not a directory.";
  usage
  exit 1
fi;

COMMANDS="run.sh"
echo "" > run.sh
echo " convert from $FLAC_PATH to $CONV_PATH ";

find "${FLAC_PATH}" -type f |while read myFile; do
  SRC_DIR=${myFile%/*}
  SRC_FILE=${myFile##*/}
  DST_DIR=$CONV_PATH/$SRC_DIR
  mkdir -p "${DST_DIR}"
  # TEST if the file is a flac ....
  metaflac --show-md5sum "${myFile}" 2>/dev/null 1>/dev/null
  if [ $? -eq 0 ]; then
    echo -n "  *** $myFile [FLAC !] : "
    DST_FILE=${myFile%.*}
    OUT_PATH="${DST_DIR}/$( echo $SRC_FILE | sed -e 's/.flac$/.mp3/')"

    if [ $DEBUG == 1 ]; then
      echo "  SRC = $myFile";
      echo "  OUT = $OUT_PATH"
    fi;

    if [ -f "$OUT_PATH" ]; then
      echo "  exist, do nothing !";
    else
      echo "  add to compress list !";
      echo "ffmpeg -y -i \"${myFile}\" -codec:a libmp3lame -q:a 0 -map_metadata 0 -id3v2_version 3 \"${OUT_PATH}\" " >> $COMMANDS
    fi;

  else
     echo -n "  *** $SRC_FILE  [NOT FLAC] : "
     if [ -f "${CONV_PATH}/${myFile}" ]; then
       echo " exist, do nothing !"
     else
       echo "  copy."
       cp "${myFile}" "${CONV_PATH}/${myFile}"
     fi
  fi

done;

echo " And now, CONVERT THE FLAC's!!! "
sh run.sh

0

İç içe geçmiş klasörlerdeki tüm flac veya wav dosyalarını tekrar tekrar mp3'e dönüştürmek için bu komutu kullandım:

find '~/Music/' -iname '*.flac' , -iname '*.wav' -exec bash -c 'D=$(dirname "{}"); B=$(basename "{}"); mkdir "$D/mp3/"; ffmpeg -i "{}" -ab 320k -map_metadata 0 -id3v2_version 3 -acodec libmp3lame "$D/mp3/${B%.*}.mp3"' \;

Flac veya wav dosyalarının içinde "mp3" adında bir klasör oluşturacak ve mp3 klasörünün içinde, eski dosya uzantısını adında tutmadan 320kbps bit hızında göreceli mp3 dosyalarını kaydedecektir.


0

Dosya adı "wav2mp3"

#!/bin/sh
# put the script to /usr/local/sbin
EXT_IN=$1
QUALITY=$2

if [ "${EXT_IN}" = "" -o "${QUALITY}" = "" ]; then
    printf "Usage: wav2mp3 \<in_file_ext\> \<quality\> \ne.g. wav2mp3 wav 2\n"
    exit 1
fi

#String delimeter
SAVEIFS=${IFS}
IFS='
'
# List of the files in directory lower than current to array
FILES_LIST=`find . -type f  -name "*.${EXT_IN}"`
for FILE in ${FILES_LIST}; do
    echo $FILE
    PREFIX=`echo $FILE | awk -F \. 'OFS="."{ $NF="" }1' | sed 's/.$//'`
    echo $PREFIX
    ffmpeg -i $FILE -codec:a libmp3lame -qscale:a $QUALITY $PREFIX.mp3
done

Shellcheck.net'i kullanmayı düşünün. Senaryonuzla ilgili birkaç öneri var.
llogan

-1

bir * .flac için

OUTF yap =echo "$a" | sed s/\.flac$/.mp3/g

ffmpeg -i "$ a" -acodec libmp3lame "$ OUTF"

tamam


2
U&L'ye hoş geldiniz, cevabınız dört yıl önce @Ketan'ın kabul ettiği cevaba herhangi bir şey eklemeniz zor.
Archemar

-2

Bunun oldukça geç olduğunu biliyorum, ama hafıza için sourceforge'daki "batchaudiocvt" betiğime bakın. Birçok format arasında ses dosyalarının verimli bir şekilde dönüştürülmesi için tasarlanmış (oldukça büyük) bir kabuk betiğidir. Özellikle, normal etiketleri dönüştürmek için elinden gelenin en iyisini yapar.


Bu soru hakkında kabuğunda döngü nasıl işleneceğini. Kullanıcı dönüşüm yapmak için kullanmak istedikleri komutu zaten biliyor.
G-Man

Stack Exchange'e hoş geldiniz . Sen Eric Dujardin misin? Öyleyse , hesapların birleştirilmesi için iletişim formunu kullanmak ve '' Kullanıcı profillerini birleştirmem gerekiyor '' seçeneğini seçin.
Scott

Üzgünüm, sadece dosyaları dönüştürme hedefine yardım etmeye çalışıyordum. Her neyse, sağlanan senaryo okunmaya değer olabilir.
Eric Dujardin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.