Tập lệnh Bash để chuyển đổi tất cả * flac thành * .mp3 với FFmpeg?


28

Tôi muốn chuyển đổi tất cả * .flac thành * .mp3 trong thư mục cụ thể.

Đây là những gì tôi đã thử, nhưng không hoạt động:

# 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

Làm thế nào để có được mục tiêu của tôi?


3
bạn đã thử "CHO ​​LOOP" chưa?
Danila Ladner

@DanilaLadner Chưa. Cảm ơn các đầu mối.
Kevin Dong

Tôi đã viết một tập lệnh thực hiện điều này, song song và sao chép các thẻ qua: http://tuxhelp.org/#flac-distiller

Xin lỗi tôi quên nó. Sau khi chuyển đổi tên tệp thành file.avi.mp3, bạn có thể sử dụng: đổi tên "s / .avi // g" * .avi.mp3 để xóa .avi.

1
Cho nghỉ máy tính sau khi làm việc chăm chỉ.
MeowMeow

Câu trả lời:


37

Thử đi:

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

1
Nó không hoạt động với các tập tin chứa không gian. Làm thế nào tôi có thể sửa đổi $(basename "${i/.flac}")để xử lý không gian?
ppr

1
@ppr Hãy thử đặt dòng này ngay trước forvòng lặp: IFS = $ '\ n'
mkc

6
Tôi đã giải quyết vấn đề không gian bằng cách thay đổi $(basename "${i/.flac}").mp3thành "$(basename "${i/.flac}").mp3"(đặt dấu ngoặc kép xung quanh nó)
MalcolmOcean

50

Một giải pháp lót đơn giản: find -name "*.flac" -exec ffmpeg -i {} -acodec libmp3lame -ab 128k {}.mp3 \;

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

Lưu ý rằng điều này sẽ được áp dụng đệ quy trong thư mục đã cho. Tức là nếu bạn chạy nó từ thư mục Music của bạn, nó sẽ chuyển đổi tất cả các flac từ các thư mục con và tạo ra một .mp3 bên cạnh nó. Bạn cũng có thể làm điều đó mà không cần ffmpeg bằng cách trực tiếp sử dụng flac và què (tức là đọc w / flac, pipe để què, xuất ra tệp .mp3), như được hiển thị trong liên kết.


Bạn có thể sử dụng -maxdepth 1Tôi nghĩ như trong câu trả lời của X Tian để hạn chế đệ quy.

2
Có bạn có thể. Bạn cũng có thể sử dụng ls piped để xargs hoặc một vòng lặp for. Tôi chỉ đưa ra giả định (có thể sai) rằng tìm kiếm đệ quy phù hợp hơn với những gì OP cần (nghĩa là thay đổi tất cả .flac từ thư viện nhạc của tôi).
Kim cương Lewis

16
Lệnh này là tuyệt vời - tuy nhiên; Bạn kết thúc với các tệp có tên * .flac.mp3. Sử dụng lệnh của bạn, tôi đã nghĩ ra điều này ...find -name "*.flac" -exec bash -c 'ffmpeg -i "{}" -y -acodec libmp3lame -ab 128k "${0/.flac}.mp3"' {} \;
Shane

2
Vâng, như tôi đã giải thích trong blog, tôi thích khía cạnh này khi thêm .mp3 vì nó cho tôi biết các tệp này đến từ một nguồn không mất dữ liệu, nên được tìm thấy ở đâu đó trên ổ cứng của tôi.
Kim cương Lewis

@Shane bình luận làm việc cho tôi.
Chaudhry Waqas

8

Nếu bạn có một số khoảng trắng trong tên tệp:

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

Tôi có một thư mục với hỗn hợp các tập tin mp4 và wav. Làm cách nào để chuyển đổi tất cả chúng thành mp3? Cảm ơn bạn.
kRazzy R

2

Tôi đã lấy tất cả mọi thứ tôi tìm thấy ở đây (và có thể trên một số trang web khác) và tạo ra một công cụ nhỏ để không chỉ tạo ra các bản mp3 của flac theo cách đệ quy, mà còn giữ các đường dẫn tương đối để tạo chúng ở nơi khác với sự hỗ trợ đa luồng.

ồ, và vâng, tôi hiểu rồi, tôi đã không sử dụng ffmpeg trong trường hợp đó, bởi vì OSMC của tôi không cung cấp các gói cho ffmpeg, chỉ avconv, nhưng vì bạn đã ở đây, tôi đoán bạn biết, về cơ bản là " giống nhau - ít nhất là cho phần quan trọng nhất. Chỉ cần thay thế lệnh "avconv" bằng "ffmpeg". Lần chạy đầu tiên của tôi là với thùng ffmpeg và các tùy chọn chính xác giống nhau.

Tôi không có nghĩa là một hacker bash, nhưng tôi đã quản lý nó, như là bản bashs đầu tiên của tôi với các yêu cầu nhất định, và có thể ai đó sẽ được hưởng lợi. Tôi mở cho bất kỳ đề nghị từ phía bạn, nhưng cho đến nay nó hoạt động cho tôi.

kịch bản của tôi để tăng 4 trường hợp, một cho mỗi lõi, giống như sau:

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

Và kịch bản worker như thế này:

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

có thể tìm thấy tại https://github.com/erdnuesse/flac-to-mp3

Trân trọng, Kay


Chào mừng bạn, nỗ lực tốt. +1
Alex Stragies

1

Tôi đã làm việc với câu trả lời của @ Ketan bằng avconv, vì ffmpeg không hoạt động tốt ở đây.

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

Thao tác này chuyển đổi flaccác tệp trong một thư mục thành mp3các tệp và sau đó chuyển sang thư mục "mp3" hiện có. Các tệp sẽ được đặt tên trong mô hình "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
biểu hiện sed cần một kết thúc '
Jaime M.

1

GNU Parallel được tạo cho các loại nhiệm vụ này:

# 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

Nó sẽ chạy các công việc song song (một công việc trên mỗi lõi CPU) và đảm bảo đầu ra trên thiết bị đầu cuối không bị trộn lẫn với nhau.

Để tìm hiểu thêm hãy dành 15 phút để đọc chương 1 + 2: https://zenodo.org/record/1146014


Điều này có vẻ thú vị. Bạn có thể giải thích những gì các {.}.mp3 :::công trình xây dựng? Hoặc tham khảo phần hướng dẫn giải thích nó?
jottr


0

Ví dụ: nếu bạn có nhiều tệp avi:

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

0

Nếu nó có thể giúp .... Tôi đã viết một tập lệnh bash nhỏ để làm điều này .... Bạn cần phải cài đặt ffmpeg / flac.

Làm thế nào nó hoạt động:

Phải mất 2 đối số:

  1. Thư mục của thư viện nhạc của bạn (flac / ogg / mp3 ...)
  2. Thư mục đích (bạn cần tạo nó trước).

Nó sản xuất:

  • Một bản sao chính xác từ thư mục nguồn vào thư mục đích, với:
    • các tập tin không flac sao chép vào.
    • các tập tin flac được chuyển đổi thành mp3 (VBR chất lượng cao)
  • Một tệp run.sh với các lệnh để chuyển đổi các tệp flac (tập lệnh này được thực thi tự động).

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

Để chuyển đổi đệ quy trong mp3 tất cả các tệp flac hoặc wav trong các thư mục lồng nhau, tôi đã sử dụng lệnh này:

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

Nó sẽ tạo một thư mục có tên "mp3" bên trong thư mục có tệp flac hoặc wav và bên trong thư mục mp3, nó sẽ lưu các tệp mp3 tương đối với tốc độ bit là 320kb / giây, mà không giữ phần mở rộng tệp cũ trong tên.


0

Tên tệp là "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

Cân nhắc sử dụng shellcheck.net. Nó có khá nhiều gợi ý liên quan đến kịch bản của bạn.
llogan

-1

cho một * .flac

làm OUTF =echo "$a" | sed s/\.flac$/.mp3/g

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

làm xong


2
Chào mừng bạn đến với U & L, câu trả lời của bạn hầu như không thêm bất cứ điều gì vào câu trả lời được chấp nhận của @Ketan bốn năm trước.
Archemar

-2

Tôi nhận ra điều này đến khá muộn, nhưng để nhớ, hãy xem kịch bản của tôi "batchaudiocvt" trên sourceforge. Nó là một tập lệnh shell (khá lớn) được thiết kế để chuyển đổi hàng loạt các tệp âm thanh hiệu quả, giữa nhiều định dạng. Đặc biệt, nó làm cho nó tốt nhất để chuyển đổi các thẻ thông thường.


Câu hỏi này là về cách xử lý vòng lặp trong shell. Người dùng đã biết lệnh họ muốn sử dụng để thực hiện chuyển đổi.
G-Man nói 'Phục hồi Monica'

Chào mừng bạn đến với Stack Exchange . Bạn có phải là Eric Dujardin ? Nếu vậy, sẽ tốt hơn nếu sử dụng biểu mẫu liên hệ và chọn '' Tôi cần hợp nhất hồ sơ người dùng '' để hợp nhất các tài khoản của bạn.
Scott

Xin lỗi, tôi chỉ cố gắng giúp với mục tiêu đã nêu là chuyển đổi các tệp. Dù sao thì kịch bản được cung cấp có thể đáng để đọc.
Eric Dujardin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.