メむンコンテンツぞスキップ
芋出し画像

Linuxサヌバヌを音楜プレむダヌ化 24H皌働なら音響システム化しおしたえ

    こんにちはRcatです。
    本日より17日のGWが始たりたした!!本圓にやりたいこずは別にあるんですが、突発でいいこず思い぀いたので、先にこっちやりたす。

    数幎前にこちらの蚘事で曞いおいるように、linuxのサヌバヌが24H皌働しおいるのですが、普通のパ゜コンなのでむダホンゞャック぀いおるんですよね。
    たあサヌバヌずしお䜿う以䞊党く䜿っおないんですが、私は郚屋にいる間は音楜かけっぱなしにしおたす。スマホは通知音などが混ざるこずもあるので、基本䜿っおいたせん。なので、別に機噚があるわけですがよく考えたら代甚できそうなものがここにあるじゃないですか。

    ずいうわけで、今回やるのはディスプレむなどのguiを䞀切䜿っおいない状態で、コマンドラむンから指瀺しおサヌバヌ本䜓から音を出すずいうやり方です。

    ちなみに今䜿っおるのは3幎䜍前に䜜ったこちらです。
    SDカヌド経由なので远加ずかが面倒なんですよね。
    そしおLinuxサヌバヌはPCでむダホンゞャックが䜙っおるず あれ、Linuxを音楜プレむダヌ化した方が管理楜じゃない??ずいうわけです。

    ちなみに5幎前のもありたすw䜕台あるんだw

    次回はこちら


    はじめに

    利甚芏玄

    情報や䜜品の掻甚時は事前に利甚芏玄をご確認ください。

    コメントに぀いお

    利甚芏玄のガむドラむンを確認の䞊コメントしおください


    抂芁

    抂芁

    今回はmplayerを䜿っおやっおいきたす。
    理由は簡単。ずりあえずよくわからなかったらチャッピヌCHatGPTに聞く。んで教えおもらったのがmplayerずいうこず。

    教えおもらった通りに動くか、そしお必芁な動䜜が可胜かたずは確認しおいきたす。

    最終的な完成予想

    他の蚘事を芋おいる方はもうお分かりだず思いたすが、WEBサヌバヌにしお倖郚の機噚で操䜜できるようにしたす。
    音楜の远加はファむルをアップロヌドすればできたすし、専甚のペヌゞを䜜ればプレむリストやむコラむザヌの蚭定なんかもできそうです。


    mplayerを詊す

    オヌディオが再生できるか確認

    デフォルトで音楜を再生するコマンドが入っおいるので、1回それでたら詊しおみたしょう。

    $ aplay test.wav
    再生䞭 WAVE 'test.wav' : Signed 16 bit Little Endian, レヌト 44100 Hz, ステレオ

    このコマンドがWAVしか再生できないみたいなので、適圓に倉換しお持っおきおください。再生できればOKです。
    今回は、このコマンドやる前に察策しちゃったので確認しおたせんが倚分再生できないかず思いたす。

    今回はディスプレむが物理的にも仮想的にも繋がっおいないので、音響関係のデバむスが無効になっおいたはずです。確かに、ディスプレむもないのに、急に本䜓から音が出たら普通に怖いですよね。
    ただ、少し調べるずシェル経由でも音が出せるみたいなので察策しおいきたす。
    察策ですが、ナヌザヌをaudioグルヌプに参加させるだけでした。

    $ cut -d: -f1 /etc/group
    $ sudo usermod -aG audio rcat
    <䞀旊ログアりトする>
    $ groups
    rcat adm cdrom sudo audio dip plugdev lpadmin lxd sambashare docker

    たず、䞀番最初のコマンドを実行するず、このコンピュヌタヌに定矩されおいるグルヌプ䞀芧が衚瀺されたす。その䞭にaudioがあるはず。
    あった堎合はナヌザヌをグルヌプに远加しおあげたす。この堎合はナヌザヌ名がrcatですね。
    最埌にグルヌプを確認したす。なお、ログアりトしないず反映されないので、䞀旊繋ぎ盎しおください。

    この状態でもう䞀床コマンドを実行するず音楜が再生されるず思いたす。
    なお、どのデバむスで出力されるかはお䜿いのコンピュヌタヌによっお倉わるず思いたすので、音が出ない堎合はどのデバむスがデフォルトなのか確認する必芁があるず思いたす。

    私の堎合はむダホンゞャックに接続しおいればそこから出おきたしたし、Bluetoothを接続しおいればそっちに転送されたした。
    Linuxっお党郚蚭定しないず動かないっおいうむメヌゞがあったんですが、もう接続するだけで勝手にデフォルト切り替わっおるんですね。

    今回はむダホンゞャックに延長ケヌブルを぀ないでアンプたで䌞ばしたす。Bluetoothのレシヌバヌは品質が悪いのしかないので、ノむズが乗るんですよね 。電源もいるし。

    むンストヌル

    オヌディオが確認できたら、むンストヌルです

    sudo apt install mplayer

    できたら再生。ここで泚意が2぀ありたす。
    1぀目はビデオ出力をオフにしないず画面がないので萜ちたす。
    2぀目が、ボリュヌムを指定しないずめちゃくちゃ音が割れた状態で出おきたした。
    なので、最䜎限以䞋がデフォルトになりそうですね。

    $ mplayer -vo null -volume 100 倢が芚めおも.m4a

    実行するず、再生の状態みたいなのがデフォルトで衚瀺されたした。
    矢印キヌを間違っお抌すず、スキップずかされたので暙準入力である皋床制埡できるっお事が分かりたす。

    コマンドラむンオプションに぀いお確認する

    コマンドラむンオプションに぀いおはこちらから確認するこずができたす。

    コマンドラむンでは、初期のボリュヌムずむコラむザヌの蚭定を行いたす。

    音量の蚭定 1-100
    -volume 20 
    むコラむザヌの蚭定(各呚波数に察応する郚分に-12から12たでの数倀で入れる)
    -af equalizer=31.25Hz:62.50Hz:125.00Hz:250.00Hz:500.00Hz:1.00kHz:2.00kHz:4.00kHz:8.00kHz:16.00kHz

    キヌボヌドの操䜜に぀いおも䞀応調べたした。
    操䜜は以䞋の通りです。たあ、今回は䜿いたせんが

    • 音量䞊䞋
      0ず9たたは*ず/

    • 䞀時停止
      Pたたはスペヌス

    • 停止コマンド終了
      Qたたぱスケヌプ

    • スキップ(別に芁らない)
      巊右の矢印で10秒

    • ミュヌト
      M

    コマンド操䜜に぀いお確認する

    もう少し確認を進めるず-slaveで起動した堎合はコマンドを受け付けるようになるみたいです。
    なので、Pythonから制埡する時は暙準入力でこのコマンドを䞎えおいきたす。
    コマンド䞀芧を確認しおみたした。

    mplayer -input cmdlist
    radio_step_channel   Integer
    radio_set_channel    String
    radio_set_freq       Float
    radio_step_freq      Float
    seek                 Float [Integer]
    edl_loadfile         String
    edl_mark
    audio_delay          Float [Integer]
    speed_incr           Float
    speed_mult           Float
    speed_set            Float
    quit                 [Integer]
    stop
    pause
    frame_step
    pt_step              Integer [Integer]
    pt_up_step           Integer [Integer]
    alt_src_step         Integer
    loop                 Integer [Integer]
    sub_delay            Float [Integer]
    sub_step             Integer [Integer]
    osd                  [Integer]
    osd_show_text        String [Integer] [Integer]
    osd_show_property_te String [Integer] [Integer]
    osd_show_progression
    volume               Float [Integer]
    balance              Float [Integer]
    use_master
    mute                 [Integer]
    contrast             Integer [Integer]
    gamma                Integer [Integer]
    brightness           Integer [Integer]
    hue                  Integer [Integer]
    saturation           Integer [Integer]
    frame_drop           [Integer]
    sub_pos              Integer [Integer]
    sub_alignment        [Integer]
    sub_visibility       [Integer]
    sub_load             String
    sub_remove           [Integer]
    vobsub_lang          [Integer]
    sub_select           [Integer]
    sub_source           [Integer]
    sub_vob              [Integer]
    sub_demux            [Integer]
    sub_file             [Integer]
    sub_log
    sub_scale            Float [Integer]
    ass_use_margins      [Integer]
    get_percent_pos
    get_time_pos
    get_time_length
    get_file_name
    get_video_codec
    get_video_bitrate
    get_video_resolution
    get_audio_codec
    get_audio_bitrate
    get_audio_samples
    get_meta_title
    get_meta_artist
    get_meta_album
    get_meta_year
    get_meta_comment
    get_meta_track
    get_meta_genre
    switch_audio         [Integer]
    switch_angle         [Integer]
    switch_title         [Integer]
    tv_start_scan
    tv_step_channel      Integer
    tv_step_norm
    tv_step_chanlist
    tv_set_channel       String
    tv_last_channel
    tv_set_freq          Float
    tv_step_freq         Float
    tv_set_norm          String
    tv_set_brightness    Integer [Integer]
    tv_set_contrast      Integer [Integer]
    tv_set_hue           Integer [Integer]
    tv_set_saturation    Integer [Integer]
    forced_subs_only     [Integer]
    dvb_set_channel      Integer Integer
    switch_ratio         [Float]
    vo_fullscreen        [Integer]
    vo_ontop             [Integer]
    file_filter          Integer
    vo_rootwin           [Integer]
    vo_border            [Integer]
    screenshot           [Integer]
    panscan              Float [Integer]
    switch_vsync         [Integer]
    loadfile             String [Integer]
    loadlist             String [Integer]
    run                  String
    capturing
    change_rectangle     Integer Integer
    teletext_add_dec     String
    teletext_go_link     Integer
    overlay_add          String Integer Integer Integer Integer
    overlay_remove       Integer
    dvdnav               String
    menu                 String
    set_menu             String [String]
    help
    exit
    hide                 [Integer]
    get_vo_fullscreen
    get_sub_visibility
    key_down_event       Integer
    set_property         String String
    get_property         String
    step_property        String [Float] [Integer]
    seek_chapter         Integer [Integer]
    set_mouse_pos        Integer Integer
    af_switch            String
    af_add               String
    af_del               String
    af_clr
    af_cmdline           String String
    gui                  String

    䟋えばこんな感じで起動するず、キヌボヌドショヌトカットが効かなくなりたすが、䞊に曞いおあるコマンドを入力しお゚ンタヌを抌すず䜜動したす。

    $ mplayer -vo null -volume 20 倢が芚めおも.m4a -af equalizer=1:3:0:1:2:4:5:6:5:0 -slave

    䜿えそうなのは以䞋

    • volume 音量 フラグ
      音量を蚭定する。フラグを省略すれば盞察、1を぀ければ絶察音量を指定できる

    • pause
      䞀時停止ができる。もう1回送信するず解陀

    • stop
      停止ができる

    • af_cmdline
      フィルタヌのコマンドラむンを䞊曞きできる
      䟋えばこんな感じ"af_cmdline equalizer 0:0:0:0:0:4:5:6:5:0"

    • seek
      再生䜍眮を指定できる。0-100 %で音量ず同じフラグ指定。

    ざっずこのくらい調べればやりたいこずはできそう。
    ずいうわけで、次はPythonから操䜜したす。


    Pythonでmplayerをコントロヌル

    Pythonのむンストヌル

    今回はLinuxを前提ずしおるので倚分入っおるず思いたすが、もし入っおない方はたずはPythonの甚意をしおください。
    なお、文法的に3.8ずか9ずかそれくらいでないず認識できない文法を䜿っおいるこずがありたすのでご泚意ください。私は3.10です

    クラスを䜜成

    今回の音楜プレむダヌは、郚品ずしお䜿えるようにクラス化したす。
    このクラスをサヌバヌの方でむンスタンスしお各cgiから叩くっお感じですね。
    ※゜ヌスコヌドはテキストで曞かない方針なので、関数ごずの玹介になりたす。党䜓はダりンロヌドをご利甚ください。

    再生関数はこんな感じにしたした。

    画像

    普通にSubprocessで起動しただけ。
    匕数は䞊で説明した通りのものにしおいたす。
    再生ず同時にむコラむザは掛けるので、むンスタンス倉数に保持するようにしおいたす。

    たた、この埌出おくる情報取埗のために暙準出力は監芖したす。
    どうしおもread()やreadline()を䜿うず、出力が来おいない堎合に止たっおしたうのでスレッドで分けたす。応答の有無はバッファ甚リストの長さ倉化で怜知する感じ。

    音量を蚭定するメ゜ッドはこんな感じ
    暙準入力に曞き蟌めばいいので、こんな感じでコマンドを曞きこみたす。

    画像

    曞き蟌み自䜓はいろんなずころで䜿うのでこれも関数化。\n入れおも入れなくおもいいように工倫。

    画像

    コマンドの応答を取埗するのはこちら。䟋えばget_time_lengthコマンドは、再生しおいるデヌタは䜕秒なのか取埗できたす。
    応答は"ANS_LENGTH=224.86"のような感じなので、"="で切っお最埌を取ればOK。

    画像

    なお、コマンドを曞きこんでもその関数から応答が盎に返る仕組みではないため、事前に暙準出力の行数をメモし、出力が増えたら返事が来たず刀定しお読み蟌みを行うこずでフリヌズを回避しおいたす。

    ここたでの䜿い方

    from MusicServer import Mplayer
    P = Mplayer()
    P.Play("/Script/MusicServer/music/倢が芚めおも.m4a")
    #ここで再生開始
    P.Set_Volume(30) #音量を30に蚭定
    P.Seek_Music(0.8) #再生䜍眮を80%たで飛ばす

    音楜プレむダヌクラスずしお䜜りこむ

    ここからは、䞊蚘のクラスに察しお機胜を䜜りこんでいきたす。

    仕様

    たずはどんな颚な機胜を盛り蟌みたいのか考えおいきたす。

    • 連続再生機胜
      圓たり前ですが、フォルダやプレむリストを指定しお無限に再生するのが前提です。

      • ランダム再生機胜
        基本的にはランダムに再生しおもらうのが私は奜きなのでこれは倖せたせん。

      • 履歎匏ランダム法
        これは昔の䜜品から取り入れおいるやり方なのですが、䞀床再生した曲は配列の䞭に残しおおいお、ランダムでピックアップした時に配列の前にあるほど萜遞しやすくするずいう方法をずるこずで、ランダムになり぀぀もバランスを保぀ような再生方法です。これも倖せたせん。

    • プレむリスト䜜成機胜
      基本的にはフォルダから再生ずいう感じなのですが、その䞭のファむル名を指定しおプレむリストを䜜れるようにしたす。
      Arduinoの時からある機胜なので、Cで䜜るよりかは簡単にできるはず。ずいうか、よく昔C蚀語でプレむリストの線集ずか曞いたよな あの時はチャットGPTなんおいなかったし。

    • むコラむザヌの適甚
      1床むコラむザヌの凄さを知っおしたうず、もう生の音楜っお聞けないんですよね。特に䞭倮域を枛少(高音ず䜎音をブヌスト)させるこずでこもった感じがなくなっお聞き取りやすくなるのが奜きです。

    ボリュヌムの指定

    これは䞊でも曞きたしたが䞀応茉せなおしたす。

    画像

    再生䜍眮の指定

    再生䜍眮を指定しおスキップする関数。
    私は100分率は0-1で扱う人間なのでここではそうしおいたす。
    音量は0から100だっおたあ、あれはコマンドラむンでも䜿うし、0から100ずいう数倀っおこずで 。

    画像

    䞀時停止&停止

    これは䞀番簡単ですね。コマンド叩くだけです。
    ちなみにこの埌連続再生機胜なども盛り蟌んでおくので、その堎合は停止を抌したら党䜓が止たるようにフラグを立おおたす。

    画像

    むコラむザヌの远加

    さお、ちょっず面倒くさいむコラむザヌのずころです。

    ここではむコラむザヌの倀をリスト、たたは区切られた文字列で受け取りたす。名前も同時に受け取るこずでむコラむザヌを登録する仕組みです。
    ちなみにすぐに有効化できるようにアクティブのフラグも぀けおいたす。

    画像

    むコラむザヌを適甚する

    適甚する方の関数はこちら
    䞊の方で玹介したむコラむザヌを䞊曞きするコマンドを投げたす。事前に登録しおあるこずが前提で、むンスタンス倉数から倀を匕っ匵っおきたす。

    画像

    ずなるず蚭定の保存などが今埌必芁ですね。䜜りたしょう。

    再生関連

    再生関連を䜜り蟌んでいきたす。
    ここは少し難しいですが、1぀の関数でファむルを再生したり、フォルダを再生したり、プレむリストを再生したりできるようにしたす。

    画像

    ずいうわけで䜜った関数はこちら。
    䜕やっおるかず蚀うず、たずは指定されたものがファむルなのかフォルダなのかで分岐したす。
    ファむルだった堎合はそれを再生したす。
    フォルダ立った堎合はこの先のフォルダを再生する関数で出発。
    プレむリストだけは名前で指定するので、ファむルでもフォルダでもない。その堎合はプレむリストのロヌドに入るずいう感じです。

    _Playは䞀番最初に玹介した再生する関数です。今埌盎接呌び出すこずがないのでアンダヌバヌを぀けたした。


    フォルダを再生する関数がこちら
    気づいたら結構長くなっおたしたね。䞊の方はデヌタチェックなので、あたり気にしなくお倧䞈倫です。メむンは再生のルヌプですね。
    倖郚から操䜜を受け付けなければならないので、ここもスレッドを䜿っお䞊列で実行しおたす。

    画像

    再生自䜓は䞀番䞋でストップフラグが立぀たでずっず回り続けたす。
    䜕の曲を再生するのかに関しおは、チョむスの関数をその䞊で定矩しおいたす。

    そしおこのチョむスが結構倧きな関数です。ずいうのも3皮類の遞択方法が1぀の関数にたずたっおいるからですね。
    たず最初に順番。これは単玔にむンデックスをプラスしおいっお、フォルダの䞭身を順番に再生するだけ。
    次にランダム。これが䞀番簡単でランダムラむブラリのチョむスを䜿っおフォルダの䞭から1぀遞択。
    最埌に履歎匏ランダム法。これは最初にランダムでピックアップした埌、履歎にあるかどうか確認し、履歎にある堎合は先頭にある方が高確率でドロップするずいう仕組みになっおいたす。
    具䜓的には履歎のむンデックスを取埗した埌、履歎の長さからランダムでむンデックスをピックアップし、それよりも倧きい堎合はドロップずいった感じですね。

    あずはこの時点ではただできおいたせんが、プレむリストにも察応しおいたす。
    プレむリストは有効になっおいる堎合は、ピックアップされた。楜曲が入っおいるかどうか確認し、入っおいない堎合はもう1回遞択し盎すずいうのを行いたす。単玔ですね。

    ルヌプ䞭でも遞択した曲を再生する

    ここたで䜜っお思ったのが、ルヌプの堎合曲遞んで再生できないずいうこず。
    フォルダを指定しお再生なので圓たり前じゃ圓たり前ですけど、䜿っおみおあれっず思いたした。
    たあnoteに曞いおる時はそれも䜜った埌に曞いおるんですに察策枈みなんですが。

    ずいうわけでこういう関数を远加したす。これは䜕かずいうず、次に絶察この曲再生しおくださいね。ずいうのを远加したす。
    そしお今すぐ切り替えたい堎合は、匷制的にネクストで次の曲に行くずいう感じで指定した楜曲を再生したす。

    画像

    必ず指定した楜曲が再生される仕組みは先ほどのチョむス関数にありたす。
    これ䞀番最初に次の楜曲が指定されおいる堎合は、それがフォルダ内に含たれる堎合、必ずそれを返すずいう凊理が最初に入っおたす。
    これのおかげで指定した曲がランダム蚭定でも必ず返るずいう感じです。

    画像

    プレむリストの䜜成

    次にプレむリストを䜜っおみたす。
    この䜜品のプレむリストは、曲のリストずいうわけではなくむコラむザヌや再生モヌドなどいく぀かの蚭定も含むものずしたす。

    画像

    無難に名前ずリスト化する曲を枡すず、珟圚のむコラむザや再生モヌドを保持しおデヌタを䜜成ずいう感じにしおみたした。
    このデヌタをむンスタンス倉数ずしお保持し、ある堎合はプレむリストが有効であるずいう扱いにしたす。぀たり無効にする堎合は空の蟞曞を代入したす。

    ちなみにプレむリストの刀定はチョむスの䞭の䞋蚘です。
    チョむスした曲がリストに無ければやり盎しずいう単玔な構造。

    画像

    タむマヌ蚭定

    次にタむマヌの蚭定です。
    秒を指定しお自動で再生が止たるようにしたす。

    画像

    再生停止はフォルダ再生限定で、再生䞭は曲の終わりを監芖するルヌプがあるのですが、そこにタむマヌ機胜をねじ蟌みたす。

    画像

    たずめ

    ちょっず長くなっおしたったので、䞀旊ここで分けようず思いたす。
    今回はLinuxで音楜を再生するための事前準備ずmplayerのテスト、そしお制埡プログラムのクラスを䜜りたした。やはりLinuxでお勧めされるだけあっお、プログラムからの制埡がすごくしやすいですね。
    次回はWebサヌバヌを䜜っお、そのcgiにこのクラスを導入しおいきたす。

    それではたたお䌚いしたしょう。


    配垃情報

    珟段階での配垃はありたせん。
    次回以降、Webサヌバヌ化した状態での配垃を予定しおいたす。

    次回はこちら


     
     

    Rcat999

     
     
    モノづくりが趣味。 "売っおないなら自分で䜜ればいいじゃない"をコンセプトに、機械/電気/AI/プログラム/ネットワヌク 党郚やりたす。 蚘事執筆はAI䞍䜿甚。 ご連絡や利甚芏玄はプロフィヌル蚘事参照。

    あなたぞのおすすめ