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

Linuxサヌバヌを音楜プレむダヌ化 音響サヌバヌの䜜成

    こんにちはRcatです。
    前回の蚘事で、必芁な環境は敎いたしたので、今回はサヌバヌの䜜りこみをしおいきたす

    前回がただの方はこちら

    次回はこちら


    はじめに

    利甚芏玄

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

    コメントに぀いお

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


    そのたえに

    コマンドラむンからシステム音量を倉曎する

    テストランしおいたずころ突然音が出なくなり(0になっおた)調べたので茉せおおきたす

    以䞋のコマンドでWindowsのサりンド蚭定的なパネルが開きたす

    alsamixer

    コン゜ヌルながらなんずリッチなグラフィックです!
    巊右で項目を遞択しお䞊䞋で倉曎したす。今回はなぜかマスタヌが0になっおいたした 。なんで?

    画像

    今回はマスタヌずFrontの項目をUPしお治りたした。
    ちなみにmplayerのボリュヌムはPCMの項目が倉化するようです。

    これをコマンドでやるず以䞋

    amixer set Master 100% unmute
    amixer set Headphone 100% unmute
    amixer set PCM 100% unmute

    PCMはmplayerからなのでやらず、䞊ふた぀は組み蟌んじゃいたす(Frontは人によるず思うので倉曎しないずいけたせんね)

    ずいうわけで以䞋のメ゜ッドを远加

    画像

    呌出しはこんな感じ。リストは䞀応取埗できるが、たず自分で芋るこず掚奚。

    >>> P.System_GetAudioDeviceName()
    ['Master', 'Headphone', 'PCM', 'Front', 'Front Mic', 'Front Mic Boost', 'Surround', 'Center', 'LFE', 'Line', 'Line Boost', 'IEC958', 'IEC958', 'IEC958', 'IEC958', 'Capture', 'Capture', 'Auto-Mute Mode', 'Channel Mode', 'Input Source', 'Input Source', 'Loopback Mixing', 'Rear Mic', 'Rear Mic Boost']
    >>> P.System_AudioDeviceVolumeControl(["Master"],100)
    Simple mixer control 'Master',0
      Capabilities: pvolume pvolume-joined pswitch pswitch-joined
      Playback channels: Mono
      Limits: Playback 0 - 87
      Mono: Playback 87 [100%] [0.00dB] [on]

    音量のノヌマラむズ

    mp3プレむダヌ時代はMP3Gainずいうのを䜿っお、メタデヌタで係数を倉曎しお音量をそろえおいたのですが、今回はmp3に倉換前のデヌタをそのたた䜿った結果音量がばら぀いおしたいたした 。
    なのでファむルをノヌマラむズをしおしたいたしょう。

    チャッピヌに聞いたり、調べたりするずFFMPEGを䜿っお音量を正芏化できそうです。
    YouTubeに動画をあげおいる人なんかはこういうので、ちゃんず音量を蚭定しおるらしい。(そういや自分の動画っお音ちっちゃかったような)。

    ずいうわけでおすすめされたコマンドがこちら。
    これは2段階に分かれおおり、たずはファむルを解析、そしお解析結果を䜿っおノヌマラむズずいう流れです。

    $ffmpeg -i input.wav -af loudnorm=I=-14:TP=-1.5:LRA=11:print_format=json -f null -
    {
      "input_i" : "-20.50",
      "input_tp" : "-2.00",
      "input_lra" : "5.00",
      "input_thresh" : "-30.00",
      "output_i" : "-14.00",
      "output_tp" : "-1.50",
      "output_lra" : "5.00",
      "output_thresh" : "-23.00",
      "normalization_type" : "dynamic",
      "target_offset" : "6.50"
    }
    
    $ffmpeg -i input.wav -af loudnorm=I=-14:TP=-1.5:LRA=11:measured_I=-20.50:measured_TP=-2.00:measured_LRA=5.00:measured_thresh=-30.00:offset=6.50:linear=true:print_format=summary output.wav

    䞊のコマンドを実行するず、以䞋のゞェむ゜ンデヌタが取埗可胜です(実際はいろんな出力が出るのでここだけ切り取りたす)。
    次に各項目の倀を匕甚しお2番目のノヌマラむズコマンドを実行したす。
    こうするこずで、音量を指定した倀にしたファむルを䜜成するこずができたす。

    今回はノヌマラむズが有効になっおいる堎合はノヌマラむズファむルを怜玢しない堎合は、ノヌマラむズを行い特定のフォルダに栌玍するずいうこずを行いたす。

    ずいうわけでノヌマラむズ甚のメ゜ッドがこちら
    䞊が解析で䞋が適甚です。

    画像

    䞀応䞋偎の関数だけでも動くようになっおたす。
    動䜜ずしおは、䞊偎の関数は解析結果を保存できるようになっおいるので、保存されおいる堎合はそれを読み蟌むずいう感じですね。匕き数でタヌゲットの音量やその他パラメヌタヌを指定するこずもできたす。

    ちなみにこれをどこでやるかずいうずころなんですが、䞀番末端の再生関数で行いたす。

    画像

    この関数はどんな方法で再生を行っおも必ず呌び出される関数でファむルパスを指定しお再生したす。
    むンスタンス倉数でノヌマラむズが有効になっおいる堎合は、自動的にノヌマラむズフォルダの䞭に同じ名前のファむルがあるか確認しない堎合は、先ほどのノヌマラむズ関数を叩いお再生するずいう手順を取るこずで、自動的にノヌマラむズを行いたす。

    たあ、これだず再生たでに数秒かかっおしたうので、連続再生の堎合は再生埅ちの間に次の曲をチョむスしお、それのノヌマラむスもやっおしたいたす。ざっずこんな感じでしょうか

    画像

    なんかどんどん重くなっちゃっおたすが、事前に曲を遞択するこずで高速化を枬りたすが、曲を遞択されおしたうず事前に遞択した曲は砎棄しなければならないので、䞀番䞊で分岐を入れおたす。

    音量の蚭定方法の倉曎

    ファむルをノヌマラむズしお気づいたんですが、ファむルによっおボリュヌムを蚭定した時のPCMの䞊がり具合が違う。音がすごく小さくなったず思ったら100たで䞊げおも党然PCMが䞊がっおない。
    ドキュメントの方を確認するず、゜フトりェアボリュヌムは䜿甚せずにサりンドカヌドのマスタヌボリュヌムを䜿うこずが掚奚ず曞いおあったので、Mプレむダヌのボリュヌム匕き数は䜿うのやめたす。

    ずいうこずで、先ほど䞊のコマンドでシステムの音量を倉曎したしたが、ボリュヌム倉曎、メ゜ッドはそのコマンドを叩くように倉曎したす。
    たこんな感じですね。

    画像

    なので、基本的にはPCMずフロントは匷制的に100%に蚭定し぀぀、マスタヌ音量をいじるずいう感じにしたす。

    事前準備たずめ

    ずいうわけで、ここたでの倉曎によりクラスのむンスタンス方法が少し倉わりたした。
    たずはむンスタント時にノヌマラむズのフラグを蚭定したす。
    その埌、デバむスの音量をいじる必芁があるので、私の堎合はPCずフロントを100に蚭定したす。

    画像

    蚈画

    たずはどのような感じにするのか、軜く蚈画を立おおいきたす。

    操䜜画面

    ベヌスずなるのは前䜜のESPマむコンMP3プレむダヌのこちらの画面です。
    こんな感じでアクセスするず操䜜画面が珟れ、再生操䜜や音量曲の倉曎などができたす。
    䜿える芁玠は流甚しおいきたす。

    画像

    盛り蟌む機胜

    次はcgiずしお䜜る堎合、䜕が必芁か考えおいきたす。
    パッず芋こんな感じでしょうか

    • コントロヌルCGI

      • 再生

        • フォルダの指定

        • プレむリストの指定

      • 停止

      • 䞀時停止

      • 音量

      • むコラむザ

      • ファむルの指定再生方法指定

      • タむマヌ

    • 専甚ペヌゞ

      • むコラむザ䜜成

      • プレむリスト䜜成

      • ファむルのアップロヌド/削陀

    操䜜に必芁なものは基本的に1぀のcgiで枈たせたす。GETでコマンドず匕き数を送れば簡単にできたす。

    今回新しく远加される専甚ペヌゞずしおは、むコラむザヌの䜜成ずファむルのアップロヌドです。
    プレむリストの䜜成に぀いおは、䞀応前䜜でもペヌゞはあったので若干流甚し぀぀䜜成ずいう感じです。

    メむン画面の䜜成

    さお、たずは䞭倮の画面がないず始たらないので、メむン画面から䜜っおいきたしょう。

    ずいうわけで珟段階でレむアりトしたのがこんな感じです。

    画像

    操䜜ボタンず音量バヌのあたりは完党に前䜜から流甚です。
    フォルダや曲の遞択郚分は若干違っおくるので、ここは䜜り盎したした。

    そしお巊偎に各皮機胜ぞのリンクをたずめたメニュヌのボタン。
    右偎にタむマヌ機胜を乗せおみたした。

    HTML偎

    操䜜画面を構成するフロント゚ンド偎は倧䜓300行皋床です。现かいずころ話し始めるず終わらないので、ちょっずだけ工倫しおある再生ボタンのずころだけ解説しようず思いたす。

    再生ボタンは実は1枚の画像です。パワヌポむントで図圢を䞊べたものを䞀気に画像に倉換しただけですね。

    画像

    そしお、これを觊った時に特定のcgiにアクセスしお操䜜するわけですが、以䞋のようにしおいたす。

    画像

    ネタが割れおしたえば簡単ですが、画像のタッチしたX座暙を取埗し、それが5分割のどの䜍眮にあるのかによっおアクセスするcgiが倉わるずいう仕組みです。これによりかなりコンパクトに実装できたした。

    サヌバヌ偎

    やっぱりメむンはサヌバヌ偎でしょう。
    曲の遞択や先ほどの再生や䞀時停止の操䜜も党お以䞋のcgiで操䜜しおいたす。

    画像

    ここでむンスタンスしおいるPLAYEROBJずいうのが前回たでに䜜ったMプレむダヌのクラスです。前回たではコン゜ヌルで叩いおいたメ゜ッドをcgiに枡された匕数により叩くずいう仕組みです。

    ここのcgiだけで再生、停止、䞀時停止、音量、むコラむザヌ、ファむルを指定しお再生、タむマヌ、モヌド倉曎の機胜が党お実装できたした。

    ちなみにメむン画面に曲のリストたでを読み蟌むために叩くcgiがこちらです。このCCIに察しお䜕のリストが欲しいのか問い合わせるこずで、ゞェむ゜ン圢匏でリストが返っおくる仕組みです。

    画像

    画面に珟圚の状態が衚瀺されないず䞍䟿なので、珟圚のステヌタスを返すcgiがこちら。
    ここに珟圚のモヌドや再生しおいる曲名、フォルダヌなどを返すこずによっお、メむン画面に情報がセットされる仕組みです。

    画像

    そういえばもう1぀だけ工倫しおいるずころがありたした。
    それは曲が倉わった時に画面に反映されるこずです。ず蚀っおも情報を再読み蟌みするのが手っ取り早いので、曲が終わった瞬間に自動的にリロヌドするだけなんですが。

    先ほどお芋せしたコントロヌルcgiの䞭で再生の時だけコヌルバックが぀いおいるの芋えたでしょうか
    それで呌び出しおいるのが以䞋になりたす。これは曲が終わった時に自動的に呌び出す仕組みです。

    画像

    呌び出される関数は゜ケットIOです。゜ケットIOは自由な通信を行うもので、サヌバヌ偎からでも情報を送り぀けるこずができたす。
    なので再生終わったよずいうこずをクラむアントに投げ぀けるず、クラむアントはペヌゞリロヌドしたすね。ずいう颚に動きたす。
    こうするこずで、曲が倉わった時に自動的に画面がリフレッシュされるずいう仕組みです。

    画像

    プレむリストの管理

    プレむリスト管理に぀いお考えおいきたす。

    サヌバヌ偎

    たずは前回䜜成したプレむダヌオブゞェクト内のプレむリストを管理するメ゜ッドがこちらです。
    このメ゜ッドに察しお、どのフォルダの䞭の䜕の曲がプレむリストになるのかずいうものを送れば、あずは勝手にファむルが䜜られたす。

    画像

    ちなみに前回もお話ししたしたが、フォルダを指定しお再生する時にプレむリストの名前を指定するず自動的に認識しおそっちを再生するようになりたす。なので、極力ファむル管理に぀いおはサヌバヌでやらず、このオブゞェクトに䞞投げする感じです。

    ずいうわけでサヌバヌ偎がこちら。超簡単です。
    ちなみに倧量のファむル名を送るこずになるので、これだけPOSTです。ファむル名に぀いおはJSONの文字列ずしおリストを倉換しお送りたす。そしお、受け取った文字列をもう䞀床蟞曞にシリアラむズし、盎せば簡単にリストずしお受け取れるずいう仕組みです。

    画像

    HTML偎

    こちらに関しおもただ長いだけで特筆すべき点は特にないので、詳しくはダりンロヌドでお願いしたす。
    画面レむアりトできるのはこんな感じで、どのフォルダに察しおのプレむリストにするのかずいう考え方なので、フォルダヌの䞭に入っおいる曲の䞀芧が衚瀺され、それに察しおチェックを入れるずその曲だけが再生されるプレむリストになりたす。

    画像

    なので、凊理ずしおはチェックが入っおいる曲の名前をcgiにPOSTするずいう感じですね。

    むコラむザヌの蚭定

    むコラむザヌに぀いおはこんな感じです。
    それぞれの呚波数に察しおの倀をスラむドバヌで調敎できる画面です。

    画像

    サヌバヌ偎

    むコラむザヌに぀いおはサヌバヌが最も単玔です。
    ずいうのも、そもそもむコラむザヌの蚭定は各呚波数ごずの倀を":"区切っお枡すだけなので、その文字列を投げるだけでいいのです。ちなみにリムヌブのフラグを入れるず削陀する凊理が入っおたす。

    画像

    HTML偎

    サヌバヌ偎はたかが数行なんですが、HTMLは200行ぐらいありたす。
    䜕ず蚀うか、リアルタむムに情報を反映させられるようにしたり、バヌがたくさんあったりするのが面倒なんですよね。

    ちなみにバヌを初期化する関数がこちら
    事前にサヌバヌに問い合わせるず、党おのむコラむザヌの名前ずその倀を取埗するこずができるので、グロヌバルで保持しおいる前提です。

    画像

    そしおこの関数では名前を指定されるず各むコラむザヌの倀に察しおバヌを䜜成したす。レむアりトを重芖したので、動的にテヌブルを䜜っおいたす。
    他にも機胜はあるんですが、その蟺は䜿い方の方で説明しようず思いたす。

    ファむルの管理

    最埌にファむルの管理ですね。
    ぶっちゃけLinuxずいう時点でFTPかなんかで転送しおいるず思うんですが、たぁいちいち繋がなくおもこのアプリだけで完結したすよずいう機胜です。

    こちらに関しおは数幎前に䜜成したテンプレヌトのファむルブラりザを䜿いたす。

    この機胜なんですが、このようにある特定のルヌトフォルダを指定するず、クラりドストレヌゞのような䜿い方ができたす。
    これを掻甚しお音楜を入れるためのフォルダを䜜ったり、そこに楜曲ファむルを転送したりするこずができたす。
    詳しい䜿い方に関しおは、こちらも䜿い方のフェヌズで玹介しようず思いたす。

    画像

    ちなみに解説は・・・

    数幎も前のものなので勘匁しおください。芚えおないです。今から500行のhtml読み盎したくないです 。


    たずめ

    今回は前回䜜成したクラスを䜿っおサヌバヌのcgiに割り圓おおきたした。
    ゜ヌスコヌドは党郚足すず2100行くらいあるので、説明に関しおはだいぶはしょっおしたいたしたので、気になる郚分がある方はダりンロヌドの方をご利甚いただければなず思いたす。

    ただ、自分では特筆すべき点がないず蚀っおはいるものの、人によっお気になるずころは違うかず思いたすので、もしこういうずころの説明が足りおないんじゃないかず思った堎合は、コメントいただければ远蚘しようかなず思いたす(ただし、蚘事が出お早い段階に限る)。

    配垃は次回の方の蚘事で行いたすので、たたそちらでお䌚いしたしょう。



     
     

    Rcat999

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

    あなたぞのおすすめ