0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

フォルダ内のmp3の再生時間合計を取得するコマンド

Posted at

英語のハノンのmp3の合計再生時間を知りたい

きっかけ

近年の英語教材の中でも非常に良いと聞くことが多い、英語のハノンの学習を始めた。
音声のみで学習することが多くなるため、学習の目処をつけるためにmp3の再生時間の合計を知りたい。

抽出要件

要件はこちら

  • mp3はzipでこちら のページからダウンロードできる
  • _slowとファイル名に入ったmp3は除外したい。ナチュラルスピードの音源のみを聴くつもりなので。
  • hh:mm:ssの出力で知りたい

最終コマンド

mp3のフォルダ直下で下記を実行する

find . -name "*.mp3" ! -name "*slow*" -exec ffmpeg -i {} 2>&1 \; | grep "Duration" | awk '{print $2}' | tr -d , | awk -F: '{ sum += ($1 * 3600) + ($2 * 60) + $3 } END { printf "Total Duration: %02d:%02d:%02d\n", sum/3600, (sum%3600)/60, sum%60 }'

コマンド解説

find

find . -name "*.mp3" ! -name "*slow*"
  • .: カレントディレクトリを指定
  • -name "*.mp3": 拡張子が.mp3のファイルを検索対象とする
  • ! -name "*slow*": ファイル名に「slow」が含まれないファイルを対象とする

カレントディレクトリ内で、ファイル名に「slow」が含まれていないMP3ファイルを検索。
あえてポイントを書くなら、除外に関しては! -name "*slow*"で除外するのがポイント。

ffmpeg

ffmpegは、音声や動画ファイルを処理するためのコマンド。ファイルの変換、編集、情報の抽出などが可能であり、以下のような用途でよく使われる。

  • ファイル形式の変換: 例えば、MP4をMP3に変換するなど、さまざまなフォーマットの相互変換に対応
  • 動画・音声の編集: 切り取り、結合、トリミングなどの編集作業
  • メタデータの抽出: ファイルの再生時間やビットレート、解像度などの情報を取得

今回は、MP3ファイルの再生時間などのメタデータを抽出するために使用する。

-exec ffmpeg -i {} 2>&1 \;
  • -exec: findで見つかった各ファイルに対して、指定したコマンド(ここではffmpeg)を実行
  • ffmpeg -i {}: {}findによって見つかったファイルのパスに置き換えられる。-iオプションは、入力ファイルを指定
  • 2>&1: 標準エラー出力を標準出力にリダイレクトし、すべての出力を処理可能に
  • \;: -execコマンドの終了を意味する

このコマンドでは、ffmpegを使って各MP3ファイルの再生時間などの情報を取得する。

ffmpegを使った時点では、ファイルごとに下記のような情報が取得出来る。ここから再生時間情報を取得していくことになる

ffmpeg version 7.0.2 Copyright (c) 2000-2024 the FFmpeg developers
  built with Apple clang version 15.0.0 (clang-1500.1.0.2.5)
  configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/7.0.2 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags='-Wl,-ld_classic' --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libharfbuzz --enable-libjxl --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-audiotoolbox --enable-neon
  libavutil      59.  8.100 / 59.  8.100
  libavcodec     61.  3.100 / 61.  3.100
  libavformat    61.  1.100 / 61.  1.100
  libavdevice    61.  1.100 / 61.  1.100
  libavfilter    10.  1.100 / 10.  1.100
  libswscale      8.  1.100 /  8.  1.100
  libswresample   5.  1.100 /  5.  1.100
  libpostproc    58.  1.100 / 58.  1.100
[mp3 @ 0x130804a20] Estimating duration from bitrate, this may be inaccurate
Input #0, mp3, from './047_Unit 3.1_natural.mp3':
  Metadata:
    album           : 英語のハノン
    album_artist    : 筑摩書房
    artist          : 筑摩書房
  Duration: 00:01:13.31, start: 0.000000, bitrate: 128 kb/s
  Stream #0:0: Audio: mp3 (mp3float), 44100 Hz, mono, fltp, 128 kb/s

grep

ffmpegの出力から再生時間抽出するために使用する。
具体的にはDurationの件を抽出する。

grep "Duration"

ffmpegの出力から、再生時間に関する情報が含まれる行だけを取り出す。

awk

テキストファイルの内容をフィールドごとに分割し、条件に基づいて処理を行うことができる。

awk '{print $2}' | awk -F: '{ sum += ($1 * 3600) + ($2 * 60) + $3 } END { printf "Total Duration: %02d:%02d:%02d\n", sum/3600, (sum%3600)/60, sum%60 }'
  • {print $2}: 抽出された行の2番目のフィールド(再生時間)を取り出す
  • -F:: :を区切り文字として再生時間を「時:分:秒」に分割
  • sum += ($1 * 3600) + ($2 * 60) + $3: 各部分を秒に変換して合計
  • END { printf "Total Duration: %02d:%02d:%02d\n", sum/3600, (sum%3600)/60, sum%60 }': 合計時間を「時:分:秒」の形式で表示

awkを使うことで、再生時間を秒単位に変換し、それを合計して、最終的な合計再生時間を出力する。

tr

文字列の変換や削除を行うためのコマンド。文字列内の特定の文字を他の文字に置き換えたり、特定の文字を削除するために使われる。

tr -d ,
  • tr -d ,: 小数点以下の桁を扱いやすくするために、カンマを削除

この部分では、awkで処理する前に、再生時間の小数点部分からカンマを削除してフォーマットを整えている。

抽出結果結論

英語のハノン 初級 : Total Duration: 04:21:43
英語のハノン 中級 : Total Duration: 04:57:59
英語のハノン 上級 : Total Duration: 05:32:41

だいたいどれも4-5時間程度であることが分かった。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?