当前位置: 首页 > news >正文

nodejs 使用speaker + ffmpeg 实现静默播放MP3

nodejs播放MP3
依赖:
npm i speaker
下载 ffmpeg.exe 文件放到可执行目录

const ffmpeg = require('fluent-ffmpeg');
const Speaker = require('speaker');
const WaveFile = require('wavefile').WaveFile;
const tempDir = require('os').tmpdir();
const fs = require('fs');
const { spawn } = require('child_process');function convertMP3ToWAV(inputPath, outputPath) {return new Promise((resolve, reject) => {ffmpeg(inputPath).toFormat('wav').audioCodec('pcm_s16le') // 16位有符号整数.audioChannels(1)       // 单声道(适合语音).audioFrequency(16000)  // 16kHz 采样率(与 edge-tts 一致).on('end', () => {console.log(`✅ 转换完成: ${outputPath}`);resolve(outputPath);}).on('error', (err) => {console.error('❌ 转换失败:', err);reject(err);}).save(outputPath);});
}async function play() {const mp3Path = './output.mp3'//`${tempDir}/speech_${Date.now()}.mp3`;const wavPath = mp3Path.replace('.mp3', '.wav');// if (!fs.existsSync(wavPath)) {// 2. 转换为 WAV//     await convertMP3ToWAV(mp3Path, wavPath);//     console.log('✅ WAV 已生成:', wavPath);// // }// // 3. 用 speaker 播放// await playWAVSilent(wavPath);playMP3WithFFmpeg(mp3Path)
}async function playWAVSilent(filePath) {return new Promise((resolve, reject) => {const buffer = fs.readFileSync(filePath);// 读取 WAV 文件头获取参数const waveFile = new WaveFile(buffer);const format = waveFile.fmt;const speaker = new Speaker({channels: format.numChannels,bitDepth: format.bitDepth,sampleRate: format.sampleRate,});speaker.write(buffer);speaker.end();speaker.on('close', () => {console.log('✅ 静默播放完成');resolve();});speaker.on('error', (err) => {console.error('❌ 播放错误:', err);reject(err);});});
}function playMP3WithFFmpeg(inputPath) {return new Promise((resolve, reject) => {// 获取 ffmpeg 路径(假设放在项目根目录)const ffmpegPath = './ffmpeg.exe'; // 👈 修改为你自己的路径// 构造 ffmpeg 命令:解码 MP3 → 输出为 PCM(stdout)const args = ['-i', inputPath,           // 输入文件'-f', 's16le',             // 输出格式:16位有符号小端 PCM'-ac', '1',                // 单声道'-ar', '16000',            // 采样率 16kHz'-acodec', 'pcm_s16le',    // 编码器'pipe:1'                   // 输出到 stdout];// 启动 ffmpeg 子进程const ffmpegProc = spawn(ffmpegPath, args);// 创建 Speaker 实例let speaker = null;// 监听 ffmpeg 输出ffmpegProc.stdout.on('data', (chunk) => {if (!speaker) {// 第一次收到数据时初始化 Speakerspeaker = new Speaker({channels: 1,bitDepth: 16,sampleRate: 16000,});// 将 PCM 数据写入扬声器ffmpegProc.stdout.pipe(speaker);// 播放完成回调speaker.on('close', () => {console.log('✅ 静默播放完成');resolve();});speaker.on('error', (err) => {console.error('❌ 播放错误:', err);reject(err);});}});// 监听错误ffmpegProc.stderr.on('data', (data) => {//   console.error('FFmpeg 错误:', data.toString());});ffmpegProc.on('error', (err) => {console.error('❌ ffmpeg 启动失败:', err);reject(err);});ffmpegProc.on('close', (code) => {if (code !== 0) {reject(new Error(`ffmpeg 退出码: ${code}`));}});});
}play()
http://www.dtcms.com/a/533288.html

相关文章:

  • 【大模型应用开发 LangChain模型输出属性速查表】
  • 南京 电子商务网站WordPress实现微信一键登录
  • 豫icp郑州网站建设做视频网站要什么
  • 商丘手机网站制作西安怡佳然网络科技有限公司
  • 开发制作一个网站北京做网站的公司商集客电话
  • 第七章:理解篇 - 对接云端语音识别,让助手“听懂”人话
  • 长春做网站多少钱全屏背景网站
  • 企业做淘宝网站需要多少钱王烨森
  • 课后作业-2025-10-26
  • 外管局网站先支后收怎么做报告企业网站开发需求
  • 网站域名所有权证书网站后台 全局配置
  • python之pydantic使用小结
  • 有什么好的网站建设的书厚街外贸网站建设
  • 从Google Chrome商店下载CRX文件
  • 做微信公众平台的网站欧美设计网站
  • 网站建设介绍ppt模板下载wordpress谷歌字体库
  • 高职护理专业就业指南:医院就业路径与职业发展
  • STM32F103C8T6--ADC
  • 怎么建设公益网站建公司网站的公司
  • shell脚本练习题1.0
  • 网站开发费的会计处理济南市工程建设技术监督局网站
  • 增城网站公司电话做网站在厦门排前5名
  • 在Linux系统中使用Dockerfile创建Docker
  • 软件下载大全网站阿里巴巴网站怎么做推广
  • 购物网站功能详细介绍开发公司工程部职责
  • python安装freethreaded
  • 专业网站建设收费搜索引擎营销的含义
  • 营销型网站建设公司推荐二级域名iis建立网站
  • C++ 链式前向星
  • 构建智能对话系统:Python实现聊天话题管理与摘要生成