• Skip to primary navigation
  • Skip to main content
  • Skip to footer

Inspiration life

ひらめきに従い行動する。

  • Contact
  • Author
  • Products

electron

Electron + React でサウンドファイルを再生する方法。

Miyanogawa Yuya
ゆうや
2024 03/23 · 20 min read

Electron + React でサウンドファイルを再生する方法。

こんばんは。宮野川です。個人でアプリ開発してます。

現在開発中のToDoアプリで効果音を実装しました。忘備録を書きました。Electron+React+Javascrpt環境でmp3やwavを鳴らす方法です。

開発環境

  • Electron
  • Nextron
  • Javascript
  • React

解決策:: How to play sound files on local file with Electron

  • 音声ファイルはパブリックフォルダに配置する。

メディアファイルを、パブリックフォルダ以外に配置すると、アクセスエラーになります。プログラムで扱う為には、パブリックフォルダに音声ファイルを配置しましょう。

User@pc renderer % tree
.
├── components
│   ├── Config.jsx
│   ├── EndOfDay.jsx
│   ├── HeadBanner.jsx
│   ├── TodayStamp.jsx
│   ├── TodayTodo.jsx
│   └── TodoBox.jsx
├── lib
│   └── theme.js
├── next.config.js
├── pages
│   ├── _app.jsx
│   ├── _document.jsx
│   └── home.jsx
├── public
│   ├── images
│   └── sounds
│       ├── Fast.mp3
│       ├── ink-pen-1.mp3
│       ├── mixkit-typewriter-soft-hit-1366.wav
│       ├── pencil-1.mp3
│       ├── tape-recorder-eject-1.mp3
│       └── writing-signature-2.mp3
└── style
    ├── home.module.css
    ├── todaystamp.module.css
    ├── todobox.module.css
    └── todotday.module.css

* directories, * files

React で音声ファイルを扱い警告が出る場合のFixコード

React でHTML5 Audio API を使うと、警告が出る場合があります。その場合は下記のコードで解決できます。

// audio_player.play() ・・・*1
// Fix Code
let playPromise = audio_player.play()
if (playPromise !== undefined) {
    playPromise.then(_ => {
      // Automatic playback started!
      // Show playing UI.
    })
    .catch(error => {
      // Auto-play was prevented
      // Show paused UI.
    })
}

audio_player の作成方(*1)

let audio_player = new Audio()
audio_player.src = "@path to file" // サウンドファイルのパス
audio_player.volume = 0.2 // 音声ファイルの音量
<audio id="audio_player"/>

Electron でサウンドファイルを扱うときに遭遇するバグ一覧

Uncaught (in promise) DOMException: Failed to load because no supported source was found.

  • 原因:パブリックフォルダ以外にリソースファイルを配置していることが原因。
  • 解決策:音声ファイルはパブリックフォルダに配置する。

Not allowed to load local resource electron

  • 原因:パブリックフォルダ以外にリソースファイルを配置していることが原因。
  • 解決策:音声ファイルはパブリックフォルダに配置する。

Categories: プログラミングTags: electron, Javascript, react

Promise オブジェクトの中身取得方法。

Miyanogawa Yuya
ゆうや
2024 03/23 · 7 min read

Jacascript+Promise オブジェクトの中身取得方法。

こんにちは。宮野川です。個人でアプリ開発してます。

  • promiseオブジェクトを取り出したい。
  • Object Promiseが表示されて中身が見えない。
  • Promiseのデータを取得したい。

この問題の解決策はこちらです。

結論

Promise.resolve('Success').then( function(value) {
  // ここでプロミスオブジェクトの中身をああだこうだする。
  console.log(value)
})

Promiseの後ろにthenを繋げて必要な処理をします。

実際のコード

実際のアプリで使用しているコードはこちらです。

ボタンをクリックすると、インストール先を指定するダイアログを表示する関数群です。

ipcRenderer

const select_folder = () => {
    ipcRenderer.invoke('request_playlists_select_folder')
    .then(function(return_path) {
    console.log(return_path)
    })
}

console.log( return_path ) には、ipcMain で取得したインストール指定先パスの文字列が配列で表示されます。

ipcMain

  ipcMain.handle('request_playlists_select_folder', async ( event ) => {
    const path = dialog.showOpenDialogSync( {
      properties: ['createDirectory', 'openDirectory']
    })
    // console.log(path)
    return path
  })

“dialog.showOpenDialogSync” の戻り値を 変数に代入し、ipcRender に返しています。

ここでは、ユーザーが指定したインストール先フォルダのパスを文字列として返却しています。

実行結果

["/Volumes/Audio"]

参考文献

  • Promise.resolve()

Categories: プログラミングTags: Javascript, ipcMain, ipcRender, electron

【2021年】Electron のipcMainでフォルダを開く方法

Miyanogawa Yuya
ゆうや
2024 03/23 · 14 min read

Electron のipcMainでフォルダを開く方法

こんにちは。宮野川です。個人でアプリ開発してます。

現在販売中の『PBR Media Player』でプレイリスト機能を実装中に調べたことを、忘備録としてここに残しておきます。

開発環境

  • macOS Big Sur
  • electron 13.1.7
  • react 17.0.2
  • nextron 7.0.0

結論 Renderer

// electron
import { ipcRenderer } from 'electron';
//マテリアルUI 
import { Button } from '@material-ui/core';

function open_folder() {
    const file_path = "/Volumes/Samsung_T5/audio/audio_1.mp3"
    ipcRenderer.send('request_playlists_folder_open', file_path)
}

const Playlists = () => {
    return (
        <>
            <Button
                color="primary"
                onClick={open_folder}
            >TEST</Button>
        </>
    )
}

export default Playlists

結論 Main

import { app , Menu ,dialog , nativeTheme, ipcMain, shell } from 'electron';

//------------------------------------
// IPC Main
//------------------------------------

  ipcMain.on('request_playlists_folder_open',  (event, file_path) => {
    console.log(file_path)
    shell.showItemInFolder(file_path)
  })

//------------------------------------

要点

shell.showItemInFolder(file_path)

フォルダを開く関数。ファイルパスは出来るだけファイル名も含めて欲しいらしい。

ipcRenderer.send(‘request_playlists_folder_open’, file_path)

ipcMain に処理を送る関数。
request_playlists_folder_open はipcMain で使うチャンネル名を書く。
file_path は任意の変数や文字列。

ipcMain.on(‘request_playlists_folder_open’, function() )

ipcMain.on でチャンネルを作成。function() に任意の処理を書く。

経緯

公式ドキュメントに”Note: While the shell module can be used in the renderer process, it will not function in a sandboxed renderer.”とある。アプリはサンドボックス化するので、レンダラー側で実装しても実用に耐えない。そこでipcMain通信を用いたファイル操作の必要が出てきた。

感想

Electron の学習を始めた6ヶ月前は、ipc通信の難易度が高くて実装出来なかった。今改めて公式ドキュメントを見てみると、要点がシンプルで分かり易かった。

参考ドキュメント

  • 公式Electron ipcMain // https://www.electronjs.org/docs/latest/api/ipc-main/
  • 公式Electron shell // https://www.electronjs.org/docs/latest/api/shell/

Categories: プログラミングTags: electron, ipc, Javascript

Footer

最近書きました。

  • 自己肯定感について
  • YouTubeの文字起こしを人間が見やすい形に一発で編集するアプリをつくった。ダウンロードはこちら。クリップボードテキスト整形ツール: AppleScriptで簡単にYouTubeや記事の要約を編集
  • IQは遺伝するのか?双子研究と遺伝子研究から考える
  • 傾向を分析する。平均的なIQは時代とともにどう変化してきたか?
  • IQテストに関する神話を否定する。事実と虚構を区別する
  • IQテストの攻略法:認知のパターンと問題解決の見極め方
  • IQテストの長所と短所を探るIQテストの長所と短所を探る
  • Electron + React でサウンドファイルを再生する方法。
  • 【解決済み】さくらVPS kusanagi9でwordpressのプラグイン更新が出来ない。
  • 【解決】ERROR ITMS-90237: “The product archive package’s signature is invalid. Ensure that it is signed with your “3rd Party Mac Developer Installer” certificate.”

興味と関心のリスト

  • IQテストの答えと解説 (16)
  • IQについて (18)
  • Cambridge Brain Sciences (4)
  • 雑記 (7)
  • プログラミング (6)

より細かい分類

A Real Me (6) Brain Wars (1) Brain Workshop (1) Cambridge Brain Sciences (3) electron (3) Fit Brains (1) Hampshire Tree Task (1) ipc (1) ipcMain (1) ipcRender (1) IQ CERTIFICATE (1) IQTEST (2) IQtest.dk (4) IQについて (1) Javascript (3) kusanagi (1) Lumosity (1) MacAppStore (1) mas (1) MensaIQTest (2) react (1) testiq.dk (1) Transpoter (1) VONVON (4) wordpress (1) Xcode13 (1) さくらVPS (1) プログラミング (1) ヴィーガン (1) 思考 (1) 意識と感情 (1) 感情論 (2) 自己否定 (1) 自己肯定感 (1) 読書 (1)

このブログの歴史

最近のコメントです。

  • とおりすがり on 2020年版 ノルウェーメンサの答えと解説 Exercise 1〜35: “35問目を皆さん複雑に考えるのですね 私は左上から斜めにグルーピングしました …” Nov 14, 03:49
  • abu on 2020年版 ノルウェーメンサの答えと解説 Exercise 1〜35: “35番目は横のくくりで考える物と思っていました。 上中下の各段で横長の長方形の…” Nov 7, 21:08
  • ば on 【VONVON】簡単に診断できるIQテスト の答えと解説【図解あり】: “10問目の解説がバツ→黒三角→丸で変換されるとあるが 正しくはバツ→丸→三角で…” Oct 28, 15:22
  • k on 2020年版 ノルウェーメンサの答えと解説 Exercise 1〜35: “33問目はDとEの2通り見つかりました。 Dの場合もEの場合も縦で。上中下で。…” Sep 18, 05:39
  • やねうらお on 2020年版 ノルウェーメンサの答えと解説 Exercise 1〜35: “別解としては、斜めグルーピングして、1行目2行目のANDが3行目となります。(同…” Aug 14, 14:41
  • やねうらお on 2020年版 ノルウェーメンサの答えと解説 Exercise 1〜35: “問35は、解説が間違っています。 各パーツが、各列、各行でk回出現すると解釈す…” Aug 14, 10:20
  • 名無し on 2020年版 ノルウェーメンサの答えと解説 Exercise 1〜35: “Aで合ってました、申し訳ないです。” Aug 3, 11:29

© 2025inspirationlife. All rights reserved.

  • About
  • Products
  • Contact
  • プライバシーポリシー
  • 免責事項