フォルダ内のすべての音声・動画ファイルを再生する 【Raspberry Pi】

Python

フォルダに音声や動画のファイルを入れておくと、すべての音声、動画ファイルを再生する Python のスクリプトについてまとめておきます。
以下の環境で動作確認をしています。

環境: Raspberry Pi(buster 以降)

背景 ~ フォルダ内のすべての音声・動画ファイルを再生したい

最近の Raspberry Pi には、音声や動画を再生できる「VLCメディアプレーヤー」が標準で入っています。
画面上でダブルクリックすることで、mp3、wav、mp4 ファイルなどを再生することが可能です。
この VLC メディアプレーヤーをターミナルや Python から操作できると、指定時刻に、音楽、時報、お知らせを鳴らすなど、自由なカスタマイズや自動化が可能になります。

ところが、ネット検索でラズパイで音声を再生する方法などとして探すと、なぜか、新たなソフトウェアをインストールして操作方法を覚えるなど、余計な手間が増えてしまうものが多いです。
すでに動くソフトウェアが入っているのであれば、標準機能だけで動かしたいところです。

いくらか試行錯誤してみたところ、ターミナルや Python から VLC メディアプレーヤーを用いてファイルを再生することができました。そこで、ポイントをまとめ、公開しておくことにします。

VLC メディアプレーヤーや Python は、すでに、Raspberry Pi に標準で入っています。したがって、標準機能のみを用いて音声や動画ファイルを再生することが可能、プログラミングでのカスタマイズも自由自在、ということになります。
当初、音声ファイルが再生できればよいと思っていたのですが、動画ファイルを入れてみたころ、とくに問題なく音声の再生ができました。スクリプトを修正することで、ランダム再生なども可能となります。

音声、動画ファイルを再生する手順

再生用のフォルダ、音声・動画ファイル、スクリプトを準備する

① 以下を参考に、Raspberry Pi にフォルダ(例:”sound1″)を作成してください。
そのフォルダの中にさらに、音声ファイルを入れるフォルダ(例:”folder01″)を作成してください。
フォルダ: “/home/pi/sound1/folder01/”
② ①のフォルダ “folder01” に音声、動画ファイルを入れてください。音声や動画ファイルは複数あっても動作します。
例: test1.mp3, test2.wav, test3.mp4
※ ファイル名は、半角英数字としてください。日本語は、(Windows からコピーしたときなどに)読み込まないことがあるようです。
※ なお、Windows のリモートデスクトップを使って Raspberry Pi にアクセスしている場合は、たとえば、Windows 側で音声ファイルをコピーして、Raspberry Pi のリモート画面のフォルダ(”folder01″)上で「貼り付け」を実行することで、Windows と Linux 間で簡単にデータを移行できます。
※ ファイルのフォーマットは、mp3、wav、mp4 ファイルについて動作確認をしています。複数のフォーマットに対応しています。
③ ①のフォルダ “sound1” 内でテキストファイルを作成して “sound1.py” 等のファイル名とし、以下のサンプルスクリプトをコピー&ペーストして保存してください。
もし、①、②で、フォルダの場所やフォルダ名を変更した場合は、スクリプト内のパス(path1)の記載を修正してください。

音声・動画を再生する手順

④ 事前に、Raspberry Pi にスピーカーを接続し、mp3 などの音声・動画が再生できることを確認してください。音量も調整しておきます。
⑤ スクリプトを実行する場合は、Raspberry Pi 上でターミナルを起動し、以下のコマンドを実行してください。
$ python /home/pi/sound1/sound1.py
→ 音声が鳴れば成功です。

★ なお、Raspberry Pi 3 以前では、3.5mm ステレオミニプラグでのスピーカー/ヘッドホンがデフォルトとなっています。ミニプラグのスピーカーをつなぐと動作すると思います。
スピーカーの設定を変更するには、Raspberry Pi の画面右上のスピーカーのアイコンを右クリックし、チェックマークを切り替えることで変更できると思います。HDMI モニターのスピーカーやUSB スピーカーでも動くと思います。

スクリプトの説明

・ import glob as gl1 は、フォルダ内の全ファイルを一括で取得するために使っています。
・ import shlex と subprocess とした部分は、コマンドプロンプトを実行するために使います。
・ 関数 play_vlc1() は、Raspberry Pi の「VLCメディアプレーヤー」を実行するための関数です。
・ path1 とした行で、音声ファイルが入っているフォルダを指定しています。
音声フォルダを変更する場合は修正してください。
・ ”a1 = …” としたところで、指定したフォルダ(path1)内のすべてのファイルを取得しています。
フォルダ内にテキストファイルなどを入れてしまうと、エラーとなると思いますので、用途に応じて、”*.*” とした部分を “*.mp3” 等に限定するなど修正をしてください。
・ 取得したすべての音声ファイルを再生するため、for ループで繰り返し実行します。
for ループを外して書き換えることで、たとえば指定したひとつの音声ファイルのみを実行するなど、自由にカスタマイズすることが可能です。
・ for ループの中で、音声ファイルのフルパス file1 を取得します。このパスを play_vlc1( file1 ) に渡すことで、音声・動画を再生します。
・ 冒頭の def play_vlc1( file1 ) で、音声・動画の再生を実行しています。cmd1 とした行で、実行するコマンドの文字列を作っています。具体的には、”cvlc – -play-and-exit [ファイルのパス]”の文字列を作っています。
この “cvlc … ” は、VLCメディアプレーヤーを実行するコマンドです。
同コマンドをターミナル上で実行すると、Python を使わなくても音声ファイルを個別で再生することが可能です。
・ arg1, ret1 とした行で、コマンドを実行しています。この記載は、Linux のターミナルでのコマンドを Python 側から実行する際のお約束という理解でよいです。
・ tm1.sleep( 3 ) としたところで、複数の音声ファイルを再生する間に、3秒の待ち時間を入れています。
音声が連続で再生されると違和感があるため、典型例として待ち時間を入れています。数値自体は、使いたい状況に応じて微調整をしてください。

うまく動いたら & 発展編

・ うまく動いたら、フォルダに音声や動画を追加して、1つの/複数の/すべてのファイルが再生できるか確認してみてください。
・ このスクリプトを Linux の crontab -e で登録しておけば、指定時刻にフォルダ内の音声・動画を自動再生することが可能となります。
・ また、folder01、folder02、… など、音声を入れるフォルダを複数作っておけば、スクリプトを編集することで、曜日や時間帯に応じて、フォルダを切り替えて再生するなども可能になります。

・ また、今回のスクリプトでは、フォルダ内の全ファイルを Python から読みだして、個々のファイルに対してVLC メディアプレーヤーを呼び出すようにしています。
for ループの部分を外して、フォルダに対して同コマンドを実行してみたところ(play_vlc1() 関数の引数に、mp3 ファイル等のフルパスではなく、フォルダを入力する)、フォルダ内のファイルを一括で再生できました。
さらに、コマンドに – -random というオプションを加えると(”cvlc – -play-and-exit – -random [フォルダのパス]” とすると)、フォルダ内の複数のファイルに対し、ランダム再生が可能となりました。
(”- -” としたところは、サイトの表示の都合でこのように記載しています。実際はスペースを入れずにマイナス記号を2つ続けて記載してください。)
したがって、VLCメディアプレーヤーの標準機能を使ってランダム再生をすることも可能ですし、Python のプログラムを編集して、アクセスするフォルダや再生順を自由にカスタマイズすることも可能です。
・ cvlc のコマンドの詳細については、ターミナルで “cvlc –help” を実行し、ヘルプを参照してみてください。手元の Raspberry Pi で確認する限りでは、機能するオプションと、機能しないオプションがあるようです。
・ 音声ファイルによっては、ダウンロード先によって音量がバラバラだったりします。Python を使うと、音量のレベル合わせについても可能になります。関心のある方は、下記の関連リンクを参照してください。
・ また、USB スピーカーと Raspberry Pi の新旧の組み合わせには相性があるようで、cron を使った自動実行時に多少設定が必要となりました。これについても、把握している範囲で関連リンクなどにまとめていますので、関心があるようでしたら参照してみてください。

まとめ

フォルダに音声や動画ファイルを入れておくと、すべてのファイルを再生するスクリプトについてまとめました。
特にソフトウェアのインストールなどをすることもなく、音声などの再生が可能になりました。
朝起きたら、また、昼の時間帯になったら、フォルダに入れた好きな曲を指定時刻に自動再生する、なども可能になりました。

なお、VLC メディアプレーヤーが動いたら、つぎのステップとして指定時刻に時報を鳴らす方法などについてもまとめています。
もし関心があるようでしたら、以下のリンクも参照してみてください。

関連リンク
・ Raspberry Pi で時報を鳴らす 【Python】
・ Raspberry Pi を自動で起動、シャットダウンする
・ 指定範囲を繰り返し再生する音楽プレーヤー【Python】
・ ブラウザで動く音楽プレーヤー 【JavaScript & Python】
・ USBスピーカーをデフォルトに設定する 【Raspberry Pi】

サンプルスクリプト sound1.py


import glob as gl1 
import shlex as sl1 
import subprocess as sp1 
import time as tm1 

def play_vlc1( file1 ): 
    cmd1  = "cvlc --play-and-exit " + file1 
    print( cmd1 ) 
    arg1 = sl1.split( cmd1 ) 
    ret1 = sp1.call( arg1 ) 
    tm1.sleep( 3 ) 

path1 = "/home/pi/sound1/folder01/" 

a1 = gl1.glob( path1 + "*.*" ) 
print( a1 ) 

for i1 in range( len( a1 ) ): 
    file1 = a1[i1] 
    play_vlc1( file1 ) 

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