Bash script untuk mengkonversi semua * flac ke * .mp3 dengan FFmpeg?


28

Saya ingin mengonversi semua * .flac ke * .mp3 di folder tertentu.

Ini yang saya coba, tetapi tidak berhasil:

# 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

Bagaimana cara mencapai tujuan saya?


3
apakah Anda mencoba "FOR LOOP"?
Danila Ladner

@DanilaLadner Belum. Terima kasih untuk petunjuknya.
Kevin Dong

Saya menulis sebuah skrip yang melakukan ini, secara paralel, dan menyalin tag ke: http://tuxhelp.org/#flac-distiller

Maaf saya lupa. Setelah mengonversi nama file menjadi file.avi.mp3, Anda dapat menggunakan: ganti nama "s / .avi // g" * .avi.mp3 untuk menghapus .avi.

1
Istirahat komputer setelah kerja keras.
MeowMeow

Jawaban:


37

Coba ini:

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

1
Itu tidak bekerja dengan file yang mengandung ruang. Bagaimana saya bisa memodifikasi $(basename "${i/.flac}")untuk menangani spasi?
ppr

1
@ ppr Coba letakkan baris ini tepat sebelum forloop: IFS = $ '\ n'
mkc

6
Saya memecahkan masalah ruang angkasa dengan mengubah $(basename "${i/.flac}").mp3ke "$(basename "${i/.flac}").mp3"(menempatkan tanda kutip di sekitarnya)
MalcolmOcean

50

Solusi 1 liner sederhana: find -name "*.flac" -exec ffmpeg -i {} -acodec libmp3lame -ab 128k {}.mp3 \;

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

Perhatikan bahwa ini akan diterapkan secara rekursif di direktori yang diberikan. Yaitu jika Anda menjalankan ini dari folder Musik Anda, itu akan mengkonversi semua flac dari subfolder dan menghasilkan .mp3 di sebelahnya. Anda juga dapat melakukannya tanpa ffmpeg dengan langsung menggunakan flac dan lame (mis. Baca w / flac, pipe to lame, output ke file .mp3), seperti yang ditunjukkan dalam tautan.


Anda dapat menggunakan -maxdepth 1saya pikir seperti dalam jawaban X Tian untuk membatasi kekambuhan.

2
Ya kamu bisa. Anda juga bisa menggunakan ls yang disalurkan ke xargs atau a for loop. Saya hanya membuat asumsi (mungkin salah) bahwa pencarian rekursif lebih sesuai dengan apa yang dibutuhkan OP (yaitu mengubah semua .flac dari perpustakaan musik saya).
Lewis Diamond

16
Perintah ini bagus - namun; Anda berakhir dengan file bernama * .flac.mp3. Dengan menggunakan perintah Anda, saya datang dengan ini ...find -name "*.flac" -exec bash -c 'ffmpeg -i "{}" -y -acodec libmp3lame -ab 128k "${0/.flac}.mp3"' {} \;
Shane

2
Ya, seperti yang saya jelaskan di blog, saya suka aspek menambahkan .mp3 karena ini memberitahu saya file ini berasal dari sumber lossless, yang harus ditemukan di suatu tempat di hard drive saya.
Lewis Diamond

Komentar @Shane bekerja untuk saya.
Chaudhry Waqas

8

Jika Anda memiliki beberapa spasi putih di nama file:

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

Saya memiliki folder dengan campuran file mp4 dan wav. Bagaimana cara mengubah semuanya menjadi mp3? Terima kasih.
kRazzy R

2

Saya mengambil semua yang saya temukan di sini (dan mungkin di beberapa situs lain) dan membuat alat kecil untuk tidak hanya membuat mp3 flac secara rekursif, tetapi juga melestarikan jalur relatif untuk membuatnya di tempat lain dengan dukungan multithread.

oh, dan ya, saya tahu, saya tidak menggunakan ffmpeg dalam kasus itu, karena OSMC saya tidak menyediakan paket untuk ffmpeg, hanya avconv, tetapi karena Anda sudah di sini, saya kira Anda tahu, itu "pada dasarnya" sama - setidaknya untuk bagian terpenting. Cukup ganti perintah "avconv" dengan "ffmpeg". Berjalan pertama saya adalah dengan bin ffmpeg dan opsi yang sama persis.

Saya tidak berarti seorang bash hacker, tetapi saya berhasil, sebagai bashscript pertama saya dengan tuntutan yang diberikan, dan mungkin seseorang akan mendapat manfaat. Saya terbuka untuk saran dari pihak Anda, tetapi sejauh ini itu berhasil untuk saya.

skrip saya untuk memutar 4 instance, satu untuk setiap inti, seperti ini:

#!/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"

Dan skrip pekerja seperti ini:

#!/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

yang dapat ditemukan di https://github.com/erdnuesse/flac-to-mp3

Salam, Kay


selamat datang, upaya yang baik. +1
Alex Stragies

1

Saya bekerja pada jawaban @ Ketan menggunakan avconv, karena ffmpeg tidak bekerja dengan baik di sini.

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

Ini mengkonversi flacfile dalam folder menjadi mp3file dan kemudian pindah ke folder "mp3" yang ada. File akan dinamai dalam model "original_name.flac.mp3"


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
ekspresi sed membutuhkan akhiran '
Jaime M.

1

GNU Parallel dibuat untuk tugas-tugas semacam ini:

# 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

Ini akan menjalankan pekerjaan secara paralel (satu pekerjaan per inti CPU) dan memastikan output pada terminal tidak tercampur menjadi satu.

Untuk mempelajari lebih lanjut menghabiskan 15 menit membaca bab 1 + 2: https://zenodo.org/record/1146014


Ini terlihat menarik. Bisakah Anda menjelaskan apa yang {.}.mp3 :::dikerjakan konstruksinya? Atau referensi bagian manual yang menjelaskannya?
jottr


0

Misalnya, jika Anda memiliki banyak file avi:

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

0

Jika dapat membantu .... Saya telah menulis skrip bash kecil untuk melakukan ini .... Anda harus menginstal ffmpeg / flac.

Bagaimana itu bekerja:

Dibutuhkan 2 argumen:

  1. Folder perpustakaan musik Anda (flac / ogg / mp3 ...)
  2. Folder tujuan (Anda harus membuatnya sebelumnya).

Itu menghasilkan:

  • Salinan persis dari folder sumber ke folder tujuan, dengan:
    • file non flac disalin ke.
    • file flac diubah menjadi mp3 (VBR kualitas tinggi)
  • File run.sh dengan perintah untuk mengonversi file flac (skrip ini dijalankan secara otomatis).

#!/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

Untuk secara rekursif mengkonversi dalam mp3 semua file flac atau wav di folder bersarang, saya menggunakan perintah ini:

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"' \;

Ini akan membuat folder bernama "mp3" di dalamnya dengan file flac atau wav dan, di dalam folder mp3, itu akan menyimpan file mp3 relatif dengan bitrate 320kbps, tanpa menyimpan ekstensi file lama dalam namanya.


0

Nama file adalah "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

Pertimbangkan untuk menggunakan shellcheck.net. Ada beberapa saran mengenai skrip Anda.
llogan

-1

untuk in * .flac

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

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

selesai


2
selamat datang di U&L, jawaban Anda hampir tidak menambahkan apa pun ke @Ketan diterima jawaban empat tahun lalu.
Archemar

-2

Saya menyadari ini datang cukup terlambat, tetapi untuk memori, lihat skrip saya "batchaudiocvt" pada sourceforge. Ini adalah skrip shell (cukup besar) yang dirancang untuk konversi massa file audio yang efisien, di antara banyak format. Secara khusus, ini membuat yang terbaik untuk mengonversi tag yang biasa.


Pertanyaan ini adalah tentang bagaimana menangani loop di shell. Pengguna sudah tahu perintah yang ingin mereka gunakan untuk melakukan konversi.
G-Man Mengatakan 'Reinstate Monica'

Selamat datang di Stack Exchange . Apakah Anda Eric Dujardin ? Jika demikian, sebaiknya gunakan formulir kontak dan pilih '' Saya perlu menggabungkan profil pengguna '' agar akun Anda digabung.
Scott

Maaf, saya hanya mencoba membantu dengan tujuan yang dinyatakan untuk mengkonversi file. Pokoknya script yang disediakan mungkin layak dibaca.
Eric Dujardin
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.