【第44回PYTHON講座】ffmpegでオーディオファイルのサンプリングレートをチェックする

PYTHON

みなさん、こんにちは。
今回は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行目 ライブラリのインポート

ossubprocessをインポートします。

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ボタンで記事のシェアをしていただけると嬉しいです!

コメント

タイトルとURLをコピーしました