当前位置:   article > 正文

Electron+vue打造一个本地播放器(附项目代码)_electron播放本地视频

electron播放本地视频

streamToBlob(stream)

.then(res => {

fileUrl = res;

// console.log(fileUrl);

//将blob对象转成blob链接

let filePath = window.URL.createObjectURL(fileUrl);

// console.log(filePath);

this.wavesurfer.load(filePath);

// 自动播放

this.wavesurfer.play();

this.playing = true;

})

.catch(err => {

console.log(err);

});

这样就实现了加载本地文件播放了

上一首下一首功能

这里的上一首下一首的功能是基于上面获取到的文件的绝对路径,通过node的path模块,path.dirname获取到文件的父级目录。

const dirPath = path.dirname(diskPath);

然后通过fs.readdir读取目录下所有文件,会返回一个文件名数组,找到该目录下正在播放的文件的下标,通过数组下标判断前一首和后一首歌曲的名称,然后再组装成绝对路径,读取资源播放

playFileList(diskPath, pos) {

let isInFiles;

let fileIndex;

let preIndex;

let nextIndex;

let fullPath;

let dirPath = path.dirname(diskPath);

let basename = path.basename(diskPath);

fs.readdir(dirPath, (err, files) => {

isInFiles = files.includes(basename);

if (isInFiles && pos === “pre”) {

fileIndex = files.indexOf(basename);

preIndex = fileIndex - 1;

fullPath = path.resolve(dirPath, files[preIndex]);

this.loadMusic(fullPath);

}

if (isInFiles && pos === “next”) {

fileIndex = files.indexOf(basename);

nextIndex = fileIndex + 1;

fullPath = path.resolve(dirPath, files[nextIndex]);

this.loadMusic(fullPath);

}

});

},

声音音量控制

音量控制需要通过监听input的键入事件,获取到range的值,然后通过设置样式background-image,动态计算百分比,然后调用wavesurfer的setVolume方法调节音量

:style=“background-image:linear-gradient( to right, ${fillColor}, ${fillColor} ${percent}, ${emptyColor} ${percent})

改变音量changeVol事件

changeVol(e) {

let val = e.target.value;

let min = e.target.min;

let max = e.target.max;

let rate = (val - min) / (max - min);

this.percent = 100 * rate + “%”;

console.log(this.percent, rate);

this.wavesurfer.setVolume(Number(rate));

},

自定义标题栏

个人觉得系统自带的菜单栏太丑了,就给设置了无边框再自己加上最小化,关闭的功能。最小化,关闭是通过ipc通信,渲染进程监听到有点击操作后,通知主进程进行相应的操作。

渲染进程

close() {

ipcRenderer.send(“close”);

},

minimize() {

ipcRenderer.send(“minimize”);

}

主进程

ipcMain.on(“close”, () => {

win.close();

app.quit();

});

ipcMain.on(“minimize”, () => {

win.minimize();

});

打开多个实例的问题

在实际测试的过程中发现会出现,打开一首新的音乐播放,就会出现重新开一个实例的现象,不能实现覆盖播放,后面查阅资料发现electron有一个second-instance事件,可以监听是否打开了第二个实例。当第二个实例被执行并且调用 app.requestSingleInstanceLock()") 时,这个事件将在应用程序的首个实例中触发,并且会返回第二个实例的相关信息,然后通过主进程通知渲染进程,告知渲染进程第二个实例的本地绝对路径,渲染进程接收到信息后,立马加载第二个实例的资源。app.requestSingleInstanceLock(),表示应用程序实例是否成功取得了锁。如果它取得锁失败,可以假设另一个应用实例已经取得了锁并且仍旧在运行,所以可以直接关闭掉,这样就避免了打开多个实例的问题

主进程

const gotTheLock = app.requestSingleInstanceLock();

if (gotTheLock) {

app.on(“second-instance”, (event, commandLine, workingDirectory) => {

// 监听是否有第二个实例,向渲染进程发送第二个实例的本地路径

win.webContents.send(“path”, ${commandLine[commandLine.length - 1]});

if (win) {

if (win.isMinimized()) win.restore();

win.focus();

}

});

app.on(“ready”, async () => {

createWindow();

});

} else {

app.quit();

}

渲染进程

ipcRenderer.on(“path”, (event, arg) => {

const newOriginPath = arg;

// console.log(newOriginPath);

this.loadMusic(newOriginPath);

});

自动更新

需求的起因是,在很兴奋的给女朋友成品的时候,尴尬的被女朋友试出很多bug(捂脸ing),然后频繁的修改打包,然后通过私发传给她。特别麻烦,所以这个需求很急迫。最后查了资料,通过electron-updater实现了这个需求.

安装electron-updater

yarn add electron-updater

发布设置

electronBuilder: {

builderOptions: {

publish: [‘github’]

}

}

主进程监听

autoUpdater.on(“checking-for-update”, () => {});

autoUpdater.on(“update-available”, info => {

dialog.showMessageBox({

title: “新版本发布”,

message: “有新内容更新,稍后将重新为您安装”,

buttons: [“确定”],

type: “info”,

noLink: true

});

});

autoUpdater.on(“update-downloaded”, info => {

autoUpdater.quitAndInstall();

});

生成Github Access Token 因为是用github作为更新站,所以本地需要相应的操作权限,去这里生成token,戳这,生成后,在powershell中设置

# 例如 Environment::SetEnvironmentVariable(“GH_TOKEN”,“sdfdsfgsdg14463232”,“User”)

打包上传Github

yarn electron:build -p always

完成上面步骤后软件会自动上传打包后的文件到release,然后编辑下release就可以直接发布了,软件是基于版本号更新的,所以记得一定要改版本号

从零开始-结束


作为程序猿最开心的事莫过于得到女朋友的夸奖,虽然这是一个小程序,实现难度也不高,但是最后做出最小可用的版本呈现在女朋友面前的时候,看到女盆友感动的眼神,我想,这应该是我作为程序猿唯一感到欣慰的时候。软件还有很多可以改进的地方。

源码在此,戳这里Github :https://github.com/Kerinlin/localMusicPlayer

相关文章

  1. 手写简易版vue-router

  2. 13个优秀的 Vue 开源项目及合集推荐

  3. 10个实用技巧让你的 Vue 代码更优雅

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

刷面试题

刷题的重要性,不用多说。对于应届生或工作年限不长的人来说,刷面试题一方面能够尽可能地快速自己对某个技术点的理解,另一方面在面试时,有一定几率被问到相同或相似题,另外或多或少也能够为自己面试增加一些自信心,可见适当的刷题是很有必要的。

CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

  • 前端字节跳动真题解析

  • 【269页】前端大厂面试题宝典

果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)**
[外链图片转存中…(img-6nUj75Aa-1711903340890)]

刷面试题

刷题的重要性,不用多说。对于应届生或工作年限不长的人来说,刷面试题一方面能够尽可能地快速自己对某个技术点的理解,另一方面在面试时,有一定几率被问到相同或相似题,另外或多或少也能够为自己面试增加一些自信心,可见适当的刷题是很有必要的。

CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

  • 前端字节跳动真题解析

  • 【269页】前端大厂面试题宝典

最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。大厂面试远没有我们想的那么困难,摆好心态,做好准备,你也可以的。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/998971
推荐阅读
相关标签
  

闽ICP备14008679号