Bash script को FFmpeg के साथ सभी * flac * .mp3 में बदलने के लिए?


28

मैं सभी * .flac * .mp3 को विशिष्ट फ़ोल्डर में परिवर्तित करना चाहता हूं।

यह वही है जो मैंने कोशिश की है, लेकिन काम नहीं करता है:

# 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

मेरा लक्ष्य कैसे प्राप्त करें?


3
क्या आपने "LOOP के लिए" कोशिश की?
डैनिला लैडनर

@DanilaLadner अभी तक नहीं। सुराग के लिए धन्यवाद।
केविन डोंग

मैंने एक स्क्रिप्ट लिखी, जो समानांतर में है, और टैग को कॉपी करती है: http://tuxhelp.org/#flac-distiller

क्षमा करें, मैं इसे भूल गया। कन्वर्ट फ़ाइल नाम बनने के बाद file.avi.mp3 का उपयोग कर सकते हैं: नाम बदलें "s / .avi // g" * .avi .mp3 for remove .avi।

1
कंप्यूटर को कड़ी मेहनत के बाद ब्रेक दें।
MeowMeow

जवाबों:


37

इसे इस्तेमाल करे:

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

1
यह अंतरिक्ष वाली फाइलों के साथ काम नहीं कर रहा है। मैं $(basename "${i/.flac}")रिक्त स्थान को संभालने के लिए कैसे संशोधित कर सकता हूं ?
ppr

1
@ppr forलूप से ठीक पहले यह लाइन डालने की कोशिश करें : IFS = $ '\ n'
mcc

6
मैं बदलकर अंतरिक्ष समस्या हल हो जाती $(basename "${i/.flac}").mp3को "$(basename "${i/.flac}").mp3"(उसके चारों ओर उद्धरण डाल)
MalcolmOcean

50

एक सरल 1 लाइनर समाधान: find -name "*.flac" -exec ffmpeg -i {} -acodec libmp3lame -ab 128k {}.mp3 \;

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

ध्यान दें कि यह दिए गए निर्देशिका में पुनरावर्ती रूप से लागू किया जाएगा। यानी अगर आप इसे अपने म्यूजिक फोल्डर से चलाते हैं, तो यह सब फ्लैप्स को सबफोल्डर्स से बदल देगा और इसके आगे .mp3 का निर्माण करेगा। आप इसे सीधे facmpeg के बिना भी कर सकते हैं flac और lame (यानी w / flac, lame करने के लिए पाइप, फ़ाइल में आउटपुट .mp3) का उपयोग करके, जैसा कि लिंक में दिखाया गया है।


आप का उपयोग कर सकते हैं -maxdepth 1मुझे लगता है कि एक्स तियान के जवाब में पुनरावृत्ति को सीमित करने के लिए।

2
हाँ तुम कर सकते हो। तुम भी xsgs या पाश के लिए पाइप लाइन का उपयोग कर सकते हैं। मैं सिर्फ (संभवतः गलत) धारणा बना रहा हूं कि एक पुनरावर्ती खोज ओपी की आवश्यकता के साथ अधिक है (यानी मेरे संगीत पुस्तकालय से सभी .flac को बदलें)।
लेविस डायमंड

16
यह आदेश महान है - हालांकि; आप * .flac.mp3 नामक फ़ाइलों के साथ समाप्त होते हैं। आपकी आज्ञा का उपयोग करते हुए, मैं इसे लेकर आया ...find -name "*.flac" -exec bash -c 'ffmpeg -i "{}" -y -acodec libmp3lame -ab 128k "${0/.flac}.mp3"' {} \;
शेन

2
हां, जैसा कि मैंने ब्लॉग में समझाया है, मुझे .mp3 जोड़ने का यह पहलू पसंद है क्योंकि यह बताता है कि यह फाइलें दोषरहित स्रोत से आती हैं, जो कि मेरी हार्ड ड्राइव पर कहीं मिलनी चाहिए।
लुईस डायमंड

@ शाने टिप्पणी ने मेरे लिए काम किया।
चौधरी वकास

8

यदि आपके पास फ़ाइल नामों में कुछ सफेद स्थान हैं:

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

मेरे पास mp4 और wav फ़ाइलों के मिश्रण वाला एक फ़ोल्डर है। मैं उन सभी को एमपी 3 में कैसे बदलूं? धन्यवाद।
krazzy आर

2

मैंने यहां (और शायद कुछ अन्य साइटों पर) पाया सब कुछ ले लिया और न केवल एमपी 3 के फ्लैक्स को पुन: बनाने के लिए एक छोटा सा उपकरण बनाया, बल्कि उन्हें मल्टीथ्रेड समर्थन के साथ कहीं और बनाने के लिए सापेक्ष पथों को संरक्षित किया।

ओह, और हाँ, मैं देख रहा हूँ, मैंने उस मामले में ffmpeg का उपयोग नहीं किया, क्योंकि मेरे OSMC ने ffmpeg के लिए पैकेज उपलब्ध नहीं कराया, केवल avconv, लेकिन चूंकि आप पहले से ही यहाँ हैं, मुझे लगता है कि आप जानते हैं, यह "मूल रूप से" है वही - कम से कम सबसे महत्वपूर्ण भाग के लिए। बस "ffmpeg" के साथ "avconv" कमांड को बदलें। मेरे पहले रन ffmpeg बिन और सटीक समान विकल्पों के साथ थे।

मैं किसी भी तरह से बैश हैकर नहीं हूं, लेकिन मैंने इसे प्रबंधित किया, क्योंकि दिए गए मांगों के साथ मेरी पहली बैशस्क्रिप्ट है, और शायद किसी को फायदा होगा। मैं आपकी ओर से किसी भी सुझाव के लिए खुला हूं, लेकिन अभी तक यह मेरे लिए काम करता है।

मेरी स्क्रिप्ट 4 उदाहरणों को स्पिन करने के लिए, प्रत्येक कोर के लिए एक इस तरह है:

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

और कार्यकर्ता स्क्रिप्ट इस तरह:

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

जो https://github.com/erdnuesse/flac-to-mp3 पर पाया जा सकता है

सादर, के


नाव पर आपका स्वागत है, अच्छा प्रयास। +1
एलेक्स स्ट्रैगीज़

1

मैं @ केतन के जवाब पर काम कर रहा हूँ, एवोकन का उपयोग कर रहा हूँ, क्योंकि ffmpeg यहाँ पर अच्छा काम नहीं करता है।

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

यह flacएक फ़ोल्डर में mp3फ़ाइलों को फ़ाइलों में परिवर्तित करता है और फिर एक मौजूदा "एमपी 3" फ़ोल्डर में ले जाता है। फ़ाइलों को "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
sed अभिव्यक्ति की समाप्ति की आवश्यकता है '
Jaime M.

1

GNU समानांतर इस तरह के कार्यों के लिए बनाया गया है:

# 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

यह नौकरियों को समानांतर (एक काम प्रति सीपीयू कोर) में चलाएगा और सुनिश्चित करेगा कि टर्मिनल पर आउटपुट एक साथ मिश्रित न हो।

अध्याय 1 + 2 पढ़ने में 15 मिनट अधिक खर्च करने के लिए: https://zenodo.org/record/1146014


यह दिलचस्प लग रहा है। क्या आप बता सकते हैं कि {.}.mp3 :::निर्माण क्या करता है? या मैनुअल अनुभाग का संदर्भ दें जो इसे समझाता है?
जॉटर

0

समानांतर FTW (कोई संदेह नहीं है कि आपके पास एक से अधिक कोर हैं - उनका उपयोग क्यों नहीं करते?):

ls *flac | while read f; do ffmpeg -i "$f" -acodec libmp3lame $f.mp3 & done



0

अगर यह मदद कर सकता है .... मैंने ऐसा करने के लिए एक छोटी सी bash स्क्रिप्ट लिखी है .... आपको ffmpeg / flac इंस्टॉल करने की आवश्यकता है।

यह काम किस प्रकार करता है:

इसमें 2 तर्क दिए गए हैं:

  1. आपकी संगीत लाइब्रेरी का फ़ोल्डर (flac / ogg / mp3 ...)
  2. गंतव्य फ़ोल्डर (आपको इसे पहले बनाने की आवश्यकता है)।

यह उत्पादन:

  • गंतव्य फ़ोल्डर में स्रोत फ़ोल्डर से एक सटीक प्रतिलिपि, साथ:
    • गैर फ्लैक फ़ाइलों में कॉपी किया गया।
    • flac एमपी 3 (VBR उच्च गुणवत्ता) में तब्दील फ़ाइलें
  • फ्लैक फ़ाइलों को परिवर्तित करने के लिए कमांड के साथ एक रन.श फ़ाइल (यह स्क्रिप्ट स्वचालित रूप से निष्पादित होती है)।

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

नेस्टेड फ़ोल्डरों में एमपी 3 के सभी फ्लैक या wav फ़ाइलों को पुन: रूपांतरित करने के लिए, मैंने इस कमांड का उपयोग किया:

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 या wav फ़ाइलों के साथ एक के अंदर "mp3" नाम का एक फ़ोल्डर बनाएगा और mp3 फ़ोल्डर के अंदर, यह नाम की पुरानी फ़ाइल एक्सटेंशन को रखे बिना, 320kbps की बिटरेट के साथ रिश्तेदार एमपी 3 फ़ाइलों को बचाएगा।


0

फ़ाइल का नाम "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 का उपयोग करने पर विचार करें। आपकी स्क्रिप्ट के संबंध में इसके कुछ सुझाव हैं।
ल्लगन

-1

के लिए * .flac में

OUTF = करेंecho "$a" | sed s/\.flac$/.mp3/g

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

किया हुआ


2
U & L में आपका स्वागत है, आपका उत्तर शायद ही चार साल पहले @Ketan के स्वीकृत उत्तर से कुछ भी जोड़े।
आर्केमेयर

-2

मुझे लगता है कि यह काफी देर से आता है, लेकिन स्मृति के लिए, मेरी स्क्रिप्ट "बैटचौडीकोवेट" को सोर्सफोर्ज पर देखें। यह एक (काफी बड़ी) शेल स्क्रिप्ट है जो कई स्वरूपों के बीच, ऑडियो फाइलों के कुशल बड़े रूपांतरण के लिए डिज़ाइन की गई है। विशेष रूप से, यह सामान्य टैग को परिवर्तित करने के लिए अपना सर्वश्रेष्ठ बनाता है।


यह सवाल है के बारे में कैसे खोल में पाश को संभालने के लिए। उपयोगकर्ता पहले से ही कमांड को जानता है कि वे रूपांतरण करने के लिए उपयोग करना चाहते हैं।
जी-मैन ने

स्टैक एक्सचेंज में आपका स्वागत है । क्या आप एरिक दुजार्डिन हैं ? यदि ऐसा है, तो संपर्क फ़ॉर्म का उपयोग करना अच्छा होगा और अपने खातों को मर्ज करने के लिए '' मुझे उपयोगकर्ता प्रोफ़ाइल मर्ज करने की आवश्यकता है '' का चयन करना होगा।
स्कॉट

क्षमा करें, मैं फ़ाइलों को परिवर्तित करने के घोषित लक्ष्य के साथ मदद करने की कोशिश कर रहा था। वैसे भी प्रदान की गई स्क्रिप्ट पढ़ने लायक हो सकती है।
एरिक दुजार्डिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.