「Flac を Mp3 に変換」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎Usage: 翻訳)
(→‎並列バージョン: ==== Parallel with recursion ==== を追加)
47行目: 47行目:
   
 
parallel ffmpeg -i {} -qscale:a 0 {.}.mp3 ::: ./*.flac
 
parallel ffmpeg -i {} -qscale:a 0 {.}.mp3 ::: ./*.flac
  +
  +
==== Parallel with recursion ====
  +
  +
Fd is a fast, user-friendly alternative to [[find]]. This one liner avoids the "while read" loop, which may have performance implications according to a response on Stack Exchange. [https://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice/]
  +
  +
[[Install]] {{Pkg|fd}} first, then run:
  +
  +
fd -t f -e flac -x ffmpeg -i "{}" -qscale:a 0 "{.}.mp3"
   
 
==== 再帰的増分的に変換を行うための Makefile ====
 
==== 再帰的増分的に変換を行うための Makefile ====

2021年7月25日 (日) 16:53時点における版

関連記事

この記事ではコマンドラインやスクリプトツールを使って FLAC と MP3 の音声ファイルを相互に変換する方法、そして同じことをグラフィカルに行うためのユーティリティを紹介しています。

パッケージ

  • whatmp3AUR - 引数として FLAC ファイルが存在するディレクトリのリストを受け取って指定したオプションで MP3 に変換する Python スクリプト。
  • flac2allAUR - FLAC から Ogg Vorbis や MP3 に変換するオーディオコンバータ。タグやメタデータは全て移植される。
  • flac2mp3-bashAUR - Flac を Mp3 に簡単に変換できる Bash スクリプト。
  • audiotoolsAUR - Transcode between different formats and keep tags with track2track, can encode from CDDA with cdda2track, has an optional Ncurses GUI.

グラフィカルアプリケーション

  • SoundConverterGNOME デスクトップの音声変換専用のユーティリティ。GStreamer を使用。GNOME Audio Profiles を利用することができマルチスレッド変換が可能です。動画から音声を抽出することもできます。
http://soundconverter.org/ || soundconverter
  • soundKonverter — 様々な音声操作プログラムの Qt グラフィカルフロントエンド。変換やリッピングなどの音声操作が行えます。
https://github.com/HessiJames/soundkonverter/wiki || soundkonverter
  • WinFF — 強力なマルチメディアコンバータである FFmpeg の GUI。音声変換の専用プロファイルを備えています。
https://code.google.com/p/winff/ || winffAUR

スクリプト

以下の2例では、カレントディレクトリにある FLAC ファイルを LAME MP3 エンコーダで変換します。どちらのスクリプトもID3 タグを元の FLAC ファイルから作成される MP3 ファイルに移して、MP3 V0 にエンコードします。V0 では可変ビットレートになり、大抵は 220 から 260 kbps の間になります。V0 ファイルの音声は透過的であり、元の音源 (CD あるいはロスレス) と変換後のファイルの違いを聴き分けることはできません。ただし、ファイルのサイズはずっと小さくなります。V0 などの LAME のスイッチや設定に関する詳細情報は Hydrogenaudio LAME Wiki を読んでください。

元の .flac ファイルは変更されず、同一のディレクトリに .mp3 が作成されます。作業ディレクトリに存在する *.flac 以外の拡張子のファイル (.nfo, 画像, .sfv など) は無視されます。

Usage

使いやすいように、このスクリプトを PATH に追加してください。ターミナルを開いて、変換したい FLAC ファイルのディレクトリに cd して、flac2mp3 (またはスクリプトの名前) を起動します。ターミナルでは、デコードとエンコードの過程が表示されますが、しばらく時間がかかります。完了です。この時点ですべての新しい MP3 ファイルを好きな場所に mv *.mp3 することは簡単です。

FFmpeg を使う

システムに FFmpeg がインストールされている場合、大抵 flaclame パッケージもインストールされています。FFmpeg にはエンコードとデコードのあらゆる機能が組み込まれています。

#!/bin/bash

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

並列バージョン

LAME はシングルスレッドのエンコーダなので、複数のファイルを同時にマルチコアでエンコードすることで素早く変換することが可能です。並列処理するには、parallel パッケージをインストールして、以下のコマンドを使ってください:

parallel ffmpeg -i {} -qscale:a 0 {.}.mp3 ::: ./*.flac

Parallel with recursion

Fd is a fast, user-friendly alternative to find. This one liner avoids the "while read" loop, which may have performance implications according to a response on Stack Exchange. [1]

Install fd first, then run:

fd -t f -e flac -x ffmpeg -i "{}" -qscale:a 0 "{.}.mp3"

再帰的増分的に変換を行うための Makefile

警告: Makefile は空白を正しく処理しません。詳しくは [2] を参照。

make -j$(nproc) で並列して変換が行えるというだけでなく、既に変換済みのファイルが存在する場合、もう一度変換することがないというメリットがあります:

SOURCE_DIR := flacdir
XCODE_MP3_DIR := mp3dir
# NOTE: see lame -v option for quality meaning
XCODE_MP3_QUALITY := 0

# Find .flac sources and determine corresponding targets
flac_srcs := $(shell find $(SOURCE_DIR) -type f -name '*.flac')
flac_2_mp3_tgts := $(patsubst $(SOURCE_DIR)/%.flac, $(XCODE_MP3_DIR)/%.mp3, \
    $(flac_srcs))

.PHONY: all mp3 flac_2_mp3

all: mp3 

mp3: flac_2_mp3

flac_2_mp3: $(flac_2_mp3_tgts)

$(XCODE_MP3_DIR)/%.mp3: $(SOURCE_DIR)/%.flac
        @echo "converting -> $@"
        @mkdir -p "$(@D)"
        @ffmpeg -v error -i "$<" -codec:a libmp3lame \
            -q:a $(XCODE_MP3_QUALITY) "$(@)"

FFmpeg を使わない

何らかの理由で FFmpeg がインストールされていない・する気もないという場合、flaclame をインストールしてください。以下では、flac に付属しているメタデータユーティリティを使用してタグの情報を取得して lame に手渡しています。一度 FLAC を WAVE にデコードしてから MP3 エンコーダにかけているので多少変換にかかる時間が多くなります。

#!/bin/bash

for a in *.flac; do
  # give output correct extension
  OUTF="${a[@]/%flac/mp3}"

  # get the tags
  ARTIST=$(metaflac "$a" --show-tag=ARTIST | sed s/.*=//g)
  TITLE=$(metaflac "$a" --show-tag=TITLE | sed s/.*=//g)
  ALBUM=$(metaflac "$a" --show-tag=ALBUM | sed s/.*=//g)
  GENRE=$(metaflac "$a" --show-tag=GENRE | sed s/.*=//g)
  TRACKNUMBER=$(metaflac "$a" --show-tag=TRACKNUMBER | sed s/.*=//g)
  DATE=$(metaflac "$a" --show-tag=DATE | sed s/.*=//g)

  # stream flac into the lame encoder
  flac -c -d "$a" | lame -V0 --add-id3v2 --pad-id3v2 --ignore-tag-errors \
    --ta "$ARTIST" --tt "$TITLE" --tl "$ALBUM"  --tg "${GENRE:-12}" \
    --tn "${TRACKNUMBER:-0}" --ty "$DATE" - "$OUTF"
done

再帰的に変換

上記のスクリプトを拡張して作業ディレクトリの全てのサブディレクトリで再帰的に変換を行うことができます。最初の行 (for .... do) を以下のように置き換えてください:

find -type f -name "*.flac" -print0 | while read -d $'\0' a; do

使用方法

使いやすいように、スクリプトを PATH に追加してください。ターミナルを開いて、変換したい FLAC ファイルがあるディレクトリに cd して、flac2mp3 (あなたがスクリプトに付けた名前) を実行します。ターミナルにデコード・エンコードのプロセスが詳細に表示され、2〜3分は変換に時間がかかります。完了したら、新しい MP3 を mv *.mp3 でどこか好きなところに移動してください。

参照