想听的音乐没有版权?没关系,ffmpeg帮你解决🐒🐒🐒

听音乐你喜欢听吧?一些喜欢的歌曲突然就没有版权了或者被下架的情况屡见不鲜。

例如我要听一首天梯,我从酷狗和网易云上面都搜不到:

搜到的都是翻唱的,不过还好我云盘上存有,还可以勉强听一下。

遇到这种情况,我们也就只有去 b 站或者 YouTube 上听了,但是麻烦呀,总不会要每次一首一首地搜吧?

别担心,我们可以使用 ffmpeg 来解决这个问题。

ffmpeg 是什么

FFmpeg 是领先的多媒体框架,能够解码、编码、转码、复用、分离、流式传输、过滤和播放几乎所有人类和机器创造的内容。它支持从最古老的格式到最前沿的技术。无论这些格式是由某些标准委员会、社区还是公司设计的。它还具有极高的可移植性:FFmpeg 能够在 Linux、Mac OS X、Microsoft Windows、BSDs、Solaris 等操作系统上编译、运行,并在我们的测试基础设施 FATE 上通过测试,适应各种构建环境、机器架构和配置。

ffmpeg 实现音视频编码

首先我们先来一个简答的案例来实现这个破需求,这个时候我们需要一个 MP4 文件,你可以从 b 站和 YouTube 上下载下来,至于你会不会下载那就是另一回事了。

初始化一个 node 项目并且终端安装 fluent-ffmpeg:

bash 复制代码
pnpm add fluent-ffmpeg

安装完成之后,并编写一下代码:

js 复制代码
const ffmpeg = require("fluent-ffmpeg");

function convertMp4ToMp3(inputPath, outputPath) {
  return new Promise((resolve, reject) => {
    ffmpeg(inputPath)
      .output(outputPath)
      .audioCodec("libmp3lame") // 使用 MP3 编解码器
      .on("end", () => {
        console.log("转换完成");
        resolve();
      })
      .on("error", (err) => {
        console.error("转换错误:", err);
        reject(err);
      })
      .run();
  });
}

const inputVideoPath = "./source/天梯.mp4"; // MP4 文件路径
const outputAudioPath = "./output/天梯.mp3"; // 输出 MP3 文件路径

convertMp4ToMp3(inputVideoPath, outputAudioPath)
  .then(() => console.log("MP4 转 MP3 成功"))
  .catch((err) => console.error("MP4 转 MP3 失败:", err));

在上面的这段代码中,主要使用了 fluent-ffmpeg 库将 MP4 文件转换为 MP3 文件。通过使用 libmp3lame 编码器编解码转换音频,然后将结果保存为 MP3 文件。

如上图所示,最终转换成功。

总结

通过 ffmpeg 将视频转换为音频的方式我们得到了 MP3 文件,我们可以把这些文件存放于固定的播放位置或者自己写一个软件的 app,这样就可以听到所有的已经被下架了的歌,甚至还可以把冲会员的钱都省下来了。

吐槽两句,要想 ffmpeg 还是要学 Python 或者 c/c 艹,不然很多功能单纯用 node 都无法实现。

相关推荐
前端一课11 小时前
【前端每天一题】🔥 第 12 题:== 与 === 的区别?为什么 [] == ![] 是 true?
前端·面试
前端一课11 小时前
【前端每天一题】🔥 第 13 题:原型链查找规则是什么?为什么对象能访问到方法?
前端·面试
前端一课11 小时前
【前端每天一题】🔥 第 11 题:this 的指向规则(前端高频必考题)
前端·面试
小蒜学长11 小时前
基于spring boot的汽车4s店管理系统(代码+数据库+LW)
java·数据库·spring boot·后端·汽车
q***420511 小时前
Spring Data 什么是Spring Data 理解
java·后端·spring
一 乐11 小时前
餐厅管理智能点餐系统|基于java+ Springboot的餐厅管理系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·后端
北极糊的狐11 小时前
父组件向子组件传参时,传递数组和对象类型的参数的方法
前端·javascript·vue.js
前端一课11 小时前
【前端每天一题】🔥 第 9 题:防抖(debounce)与节流(throttle)的区别?如何实现?
前端·面试
前端一课11 小时前
【前端每天一题】🔥 第 10 题:浅拷贝 vs 深拷贝?如何手写深拷贝?
前端·面试
前端一课11 小时前
【前端每天一题】🔥 第 8 题:什么是事件委托?它的原理是什么?有哪些优点和常见坑? - 前端高频面试题
前端·面试