Bash script เพื่อแปลง * flac ทั้งหมดเป็น * .mp3 ด้วย FFmpeg?


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
คุณลอง "FOR LOOP" แล้วหรือยัง
Danila Ladner

@DanilaLadner ยังไม่ ขอบคุณสำหรับคำใบ้
เควินดง

ฉันเขียนสคริปต์ที่ทำสิ่งนี้ขนานและคัดลอกแท็กไปที่: http://tuxhelp.org/#flac-distiller

ขอโทษที่ฉันลืมมัน หลังจากแปลงชื่อไฟล์เป็นไฟล์. avi.mp3 คุณสามารถใช้: เปลี่ยนชื่อ "s / .avi // g" * .avi.mp3 เพื่อลบ. 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'
mkc

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

โปรดทราบว่าสิ่งนี้จะถูกนำไปใช้ซ้ำในไดเรกทอรีที่กำหนด นั่นคือถ้าคุณเรียกใช้สิ่งนี้จากโฟลเดอร์ Music ของคุณมันจะแปลง flacs ทั้งหมดจากโฟลเดอร์ย่อยและสร้าง. mp3 อยู่ข้างๆ คุณสามารถทำได้โดยไม่ต้อง ffmpeg โดยใช้ flac และ lame โดยตรง (เช่นอ่าน w / flac, pipe to lame, ส่งออกไปยังไฟล์. mp3) ดังที่แสดงในลิงค์


คุณสามารถใช้-maxdepth 1ฉันคิดว่าเหมือนในคำตอบของ X Tian เพื่อ จำกัด การเรียกซ้ำ

2
ใช่คุณสามารถ. คุณยังสามารถใช้ ls piped เพื่อ xargs หรือสำหรับวง ฉันแค่ตั้งสมมติฐาน (อาจผิด) ว่าการค้นหาแบบเรียกซ้ำมีความสำคัญมากกว่าสิ่งที่ OP ต้องการ (เช่นเปลี่ยน. flac ทั้งหมดจากคลังเพลงของฉัน)
Lewis Diamond

16
คำสั่งนี้ยอดเยี่ยม - อย่างไรก็ตาม; คุณจะพบไฟล์ที่ชื่อ * .flac.mp3 ฉันใช้คำสั่งของคุณกับสิ่งนี้ ...find -name "*.flac" -exec bash -c 'ffmpeg -i "{}" -y -acodec libmp3lame -ab 128k "${0/.flac}.mp3"' {} \;
เชน

2
ใช่ดังที่ฉันอธิบายไว้ในบล็อกฉันชอบการเพิ่มไฟล์. mp3 เพราะมันบอกฉันว่าไฟล์นี้มาจากแหล่งที่ไม่สูญเสียซึ่งควรจะหาที่ไหนสักแห่งในฮาร์ดไดรฟ์ของฉัน
Lewis Diamond

@ ความคิดเห็นเชนทำงานให้ฉัน
Chaudhry Waqas

8

หากคุณมีช่องว่างสีขาวในชื่อไฟล์:

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

ฉันมีโฟลเดอร์ที่ประกอบด้วยไฟล์ mp4 และ wav ฉันจะแปลงทั้งหมดเป็น mp3 ได้อย่างไร ขอขอบคุณ.
kRazzy R

2

ฉันใช้ทุกสิ่งที่ฉันพบที่นี่ (และอาจเป็นในไซต์อื่น ๆ ) และสร้างเครื่องมือขนาดเล็กที่ไม่เพียง แต่สร้าง mp3s ของ flacs ซ้ำ แต่ยังรักษาเส้นทางสัมพัทธ์เพื่อสร้างพวกมันที่อื่นด้วยการสนับสนุนมัลติเธรด

โอ้และใช่ฉันเห็นว่าฉันไม่ได้ใช้ ffmpeg ในกรณีนั้นเพราะ OSMC ของฉันไม่ได้ให้บริการแพ็คเกจสำหรับ ffmpeg เพียง avconv แต่เนื่องจากคุณอยู่ที่นี่แล้วฉันคิดว่าคุณรู้ว่ามันเป็น "พื้น" เหมือนกัน - อย่างน้อยก็ในส่วนที่สำคัญที่สุด เพียงแค่แทนที่คำสั่ง "avconv" ด้วย "ffmpeg" วิ่งครั้งแรกของฉันอยู่กับถัง ffmpeg และตัวเลือกเดียวกันแน่นอน

ฉันไม่ได้เป็นแฮ็กเกอร์ทุบตี แต่ฉันจัดการมันเป็น bashscript แรกของฉันที่มีความต้องการที่กำหนดและอาจมีบางคนได้รับประโยชน์ ฉันเปิดกว้างสำหรับคำแนะนำใด ๆ จากคุณ แต่จนถึงตอนนี้ก็ใช้ได้สำหรับฉัน

สคริปต์ของฉันหมุน 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
Alex Stragies

1

ฉันทำงานกับคำตอบของ @ Ketan โดยใช้ avconv เนื่องจาก ffmpeg ทำงานได้ไม่ดีตรงนี้

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

สิ่งนี้จะแปลงflacไฟล์ในโฟลเดอร์เป็นmp3ไฟล์และย้ายไปยังโฟลเดอร์ "mp3" ที่มีอยู่ ไฟล์จะถูกตั้งชื่อในรูปแบบ "original_name.flac.mp3"



1

GNU Parallel สร้างขึ้นสำหรับงานประเภทนี้:

# 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

มันจะเรียกใช้งานแบบขนาน (หนึ่งงานต่อซีพียูคอร์) และตรวจสอบให้แน่ใจว่าเอาต์พุตในเทอร์มินัลไม่ได้ผสมกัน

หากต้องการเรียนรู้เพิ่มเติมใช้เวลา 15 นาทีในการอ่านบทที่ 1 + 2: https://zenodo.org/record/1146014


มันดูน่าสนใจ คุณช่วยอธิบายโครงสร้างสิ่งที่{.}.mp3 :::ทำ? หรืออ้างอิงส่วนคู่มือที่อธิบายหรือไม่
jottr

0

Parallel FTW (ไม่ต้องสงสัยเลยว่าคุณมีมากกว่าหนึ่งคอร์ - ทำไมไม่ใช้มัน):

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


0

ตัวอย่างเช่นหากคุณมีไฟล์ avi หลายไฟล์:

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

0

ถ้ามันสามารถช่วยได้ .... ฉันได้เขียนสคริปต์ทุบตีขนาดเล็กเพื่อทำสิ่งนี้ .... คุณต้องติดตั้ง ffmpeg / flac

มันทำงานอย่างไร:

ใช้เวลา 2 ข้อโต้แย้ง:

  1. โฟลเดอร์ของคลังเพลงของคุณ (flac / ogg / mp3 ... )
  2. โฟลเดอร์ปลายทาง (คุณต้องสร้างก่อน)

มันผลิต:

  • สำเนาที่ถูกต้องจากโฟลเดอร์ต้นทางลงในโฟลเดอร์ปลายทางด้วย:
    • คัดลอกไฟล์ที่ไม่ใช่ flac
    • แปลงไฟล์ flac เป็น mp3 (คุณภาพสูง VBR)
  • ไฟล์ run.sh พร้อมคำสั่งในการแปลงไฟล์ flac (สคริปต์นี้จะทำงานโดยอัตโนมัติ)

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

ในการแปลงไฟล์ flac หรือ wav ทั้งหมดใน mp3 ซ้ำ ๆ ในโฟลเดอร์ที่ซ้อนกันฉันใช้คำสั่งนี้:

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

มันจะสร้างโฟลเดอร์ชื่อ "mp3" ในไฟล์ที่มีไฟล์ flac หรือ wav และในโฟลเดอร์ mp3 มันจะบันทึกไฟล์ mp3 ที่เกี่ยวข้องด้วยบิตเรตที่ 320kbps โดยไม่ต้องมีนามสกุลไฟล์เก่าในชื่อ


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 มีคำแนะนำเล็กน้อยเกี่ยวกับสคริปต์ของคุณ
llogan

-1

สำหรับใน * .flac

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

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

เสร็จแล้ว


2
ยินดีต้อนรับสู่ U&L คำตอบของคุณแทบจะไม่เพิ่มอะไรเลยกับ @Ketan ตอบรับสี่ปีที่ผ่านมา
Archemar

-2

ฉันรู้ว่าสิ่งนี้มาช้า แต่สำหรับหน่วยความจำโปรดดูสคริปต์ "batchaudiocvt" ของฉันบน sourceforge เป็นเชลล์สคริปต์ (ค่อนข้างใหญ่) ที่ออกแบบมาเพื่อการแปลงไฟล์เสียงที่มีประสิทธิภาพระหว่างหลายรูปแบบ โดยเฉพาะอย่างยิ่งมันเป็นการดีที่สุดในการแปลงแท็กปกติ


คำถามนี้เกี่ยวกับวิธีจัดการวนรอบในเชลล์ ผู้ใช้รู้คำสั่งที่ต้องการใช้เพื่อทำการแปลง
G-Man กล่าวว่า 'Reinstate Monica'

ยินดีต้อนรับสู่กองแลกเปลี่ยน คุณEric Dujardinไหม ถ้าเป็นเช่นนั้นจะเป็นการดีหากใช้แบบฟอร์มการติดต่อและเลือก '' ฉันต้องรวมโปรไฟล์ผู้ใช้ '' เพื่อให้บัญชีของคุณรวมเข้าด้วยกัน
สกอตต์

ขออภัยฉันแค่พยายามช่วยตามเป้าหมายที่ระบุไว้ในการแปลงไฟล์ อย่างไรก็ตามสคริปต์ที่ให้มาอาจมีค่าสำหรับการอ่าน
Eric Dujardin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.