みなさん、こんにちは。
今回はPYTHONとffmpegを利用してオーディオファイルのサンプリングレートをチェックする方法を紹介しようと思います。
プログラムの意図
前回、複数のオーディオファイルを1つのMP4ファイルにする記事を紹介しました。
この記事で一番重要なのが、すべてのオーディオファイルのサンプリングレートを統一することなのです。
ファイルが多ければ多いほど、手動でサンプリングレートをチェックするのは大変だと思い、今回のプログラム作成を考えました。
ffprobeを使う
オーディオファイルのサンプリングレートをチェックにするには、ffprobe というプログラムを使用します。
ffprobeは、ffmpegをインストールする際に含まれている実行ファイルの一つなので、ffmpegがインストールされていれば、ffprobeもインストールされています。
下記のコマンドを実行するとオーディオファイルのサンプリングレートを調べることが出来ます。
ffprobe input.mp3
出力結果の一部にStream #0:0 という行があり、下記の場合では、48000 Hzがサンプリングレートになります。
Stream #0:0: Audio: mp3, 48000 Hz, stereo, fltp, 128 kb/s'
使用するライブラリ subprocess, os
今回は、subprocess というライブラリを使用します。
subprocessは標準でインストールされているライブラリなので、新たにインストールする必要はありません。
コマンドプロンプトで動かすプログラムを、PYTHONで操作する時に使用します。
また、subprocess の PIPE を利用して、コマンドから出力される結果を取得することもします。
プログラムコードの説明
import os.path
import subprocess
from subprocess import PIPE
filefolder = 'C:\\Labo\\music\\'
cmd1 = 'ffprobe "'
for count, filename in enumerate(os.listdir(filefolder)):
if(filename.endswith('.mp3')):
cmd = cmd1 + os.path.join(filefolder, filename) + '"'
comment = subprocess.run(cmd, shell=True, stdout=PIPE,
stderr=PIPE, text=True, encoding="utf-8")
comment2 = comment.stderr.split("\n")
comment3 = [s for s in comment2 if 'Hz' in s]
samplerate = str(comment3).split(",")
print(filename, samplerate[1])
1~3行目 ライブラリのインポート
os、subprocessをインポートします。
5行目 オーディオファイルの保存場所
オーディオファイルの保存場所を定義します。
6行目 コマンドの文字列を作成
コマンド ffprobe の文字列を作成しておきます。
cmd1 = 'ffprobe "'
ffprobe “ファイル名” という表現になるので、ファイル名の前のダブルクオーテーションを含めます。
8行目 フォルダ内のファイル名を取得
for count, filename in enumerate(os.listdir(filefolder)):
上記のように処理をすると、countに数字、filenameにファイル名を代入することが出来ます。
for filename in enumerate(os.listdir(filefolder)):
上記のようにcount を無くして、filenameだけにすると、filenameはタプル(tuple)型になり、filenameには(index番号、ファイル名)という複数要素が入り、文字列操作がやりにくくなります。
10行目 拡張子が mp3のものだけを取り出す
endswithは文字列の後方を検索します。
オーディオファイルでは、ジャケット画像なども含まれていることもあるので、mp3だけを取り出すようにしています。
12行目 コマンドを作成
実行するコマンドを作成します。実際にファイル処理する場合、絶対パスを含めたファイル名を指定する必要があるので、os.path.join で絶対パスをファイル名につなげています。
14行目 コマンドを実行
コマンドを実行します。
comment = subprocess.run(cmd, shell=True, stdout=PIPE,
stderr=PIPE, text=True, encoding="utf-8")
コマンドを実施した時に出力データはstdoutに代入されます。エラー内容であれば、stderrに代入されます。
今回、ffprobe で出力されるデータはstderrに代入されるのに注意して下さい。
ファイル名に日本語を含まれている場合、文字化けになるので、encoding=”utf-8″ を追加しています。このエンコーディングでも文字化けするようでしたら、“encoding=”shift_jis” に変えて試してください。
17~20行目 コマンド後のデータ出力からサンプリングレートを取り出す
comment2 = comment.stderr.split("\n")
comment3 = [s for s in comment2 if 'Hz' in s]
samplerate = str(comment3).split(",")
print(filename, samplerate[1])
ffprobe から出力されるデータは改行されているので、split(“\n”)で改行ごとに分けます。
サンプリングレートには Hz という文字が含まれているので、Hz を含んだ行を取り出します。
comment3はリスト型なので、文字列に変換し、コロンでHzの部分だけを抜き出します。
そして、ファイル名とサンプルレートを print で出力して完了です。
実行すると、下記のように表示させることが出来ます。
まとめ
いかがだったでしょうか。
ffprobe では、コマンドに出力されるデータが重要になってきます。そして今回は、そのコマンドに出力されるデータを取得・処理することがキーポイントになっています。
応用すれば、ビットレート、タイトル、曲の長さなども出力させることが出来ますので、是非、試してみて下さい。
「役に立った!」と思れましたら、下のSNSボタンで記事のシェアをしていただけると嬉しいです!
コメント