将重叠的音频文件流式传输到Chromecast Audio

Pat*_*oos 6 https http audio-streaming google-cast

我想流式传输多个重叠的音频文件(某些随机时间播放的声音效果).所以一种生成的音频流永远不会以完全相同的方式重复.有些音频文件在循环播放,有些则在特定时间.我想可能有点实时的流插入.

编写这样的服务器软件的最佳方法是什么?应该使用哪些协议进行流式传输(我更喜欢使用HTTP).我可能想要为每个配置(声音效果的轨道和时间)公开一个url.

任何指向代码/库的指针?最好是在任何语言,如java/kotlin/go/rust/ruby​​/python/node/...

网址: https://server.org/audio?file1=loop&file2=every30s&file2_volume=0.5

响应:( Audio stream在演员设备上播放)

Stream循环file1.每30秒播放一次50%音量的file2(叠加在file1上,播放率为100%).文件1就像10m9s长.所以组合永远不会重复.所以我们不能只提供一个预生成的mp3文件.

一些背景

我目前有一个Android应用程序随机播放不同的音频文件.有些是循环,有些是每x秒播放一次.有时多达10个同时.

现在我想添加对chromecast/chromecast audio/google home/...的支持.我想最好的是拥有一个流式传输的服务器.每个用户在玩游戏时都会有他/她自己的流.不需要让多个用户收听同一个流(即使它也可能受支持).

服务器基本上会读取url,获取配置,然后使用音频流进行响应.服务器打开一个(或多个音频文件),然后将其组合/叠加到单个流中.在某些时候,这些音频文件是循环的.其他一些音频文件在特定时间打开并添加/重叠到流中.播放的每个音频文件以不同的音量级别播放(一些声音更大,一些声音更安静).问题是如何制作这样的音频流以及如何实时添加不同的文件.

Tar*_*ani 1

所以你的问题有两个部分

  • 使用不同的选项混合音频
  • 从网络服务器流式传输混合响应

我可以帮助你完成后面的部分,你需要自己弄清楚第一部分

下面是一个示例 Nodejs 脚本。运行它创建一个目录并运行

npm init
npm install fluent-ffmpeg express
Run Code Online (Sandbox Code Playgroud)

然后保存以下文件

服务器.js

var ff = require('fluent-ffmpeg');
var express = require('express')
var app = express()

app.get('/merged', (req, res) => {
    res.contentType('mp3');
    // res.header("Transfer-Encoding", "chunked")
    command = ff()
        .input("1.mp3")
        .input("2.mp3")
        .input("3.mp3")
        .input("4.mp3")
        .complexFilter(`[1]adelay=2|5[b];
        [2]adelay=10|12[c];
        [3]adelay=4|6[d];
        [0][b][c][d]amix=4`)
        .outputOptions(["-f", "flv"])
    ;

    command.on('end', () => {
        console.log('Processed finished')
        // res.end()
    })
    command.pipe(res, {end: true});
    command.on('error', function(err, stdout, stderr) {
        console.log('ffmpeg stdout: ' + stdout);
        console.log('ffmpeg stderr: ' + stderr);
    });

})

app.listen(9090)
Run Code Online (Sandbox Code Playgroud)

使用以下命令运行它

node server.js
Run Code Online (Sandbox Code Playgroud)

现已VLC开放http://localhost:9090/merged

在 VLC 中打开

现在根据您的要求,以下部分将发生变化

        .complexFilter(`[1]adelay=2|5[b];
        [2]adelay=10|12[c];
        [3]adelay=4|6[d];
        [0][b][c][d]amix=4`)
Run Code Online (Sandbox Code Playgroud)

但我不是ffmpeg指导您了解该领域的专家。也许这需要另一个问题或从许多现有的 SO 线程中获取线索

ffmpeg - 如何将具有时间偏移的多个音频合并到视频中?

如何使用 ffmpeg 合并两个音频文件,同时保留正确的时序

ffmpeg在特定时间混合音频

https://superuser.com/questions/850527/combine- Three-videos- Between-specific-time-using-ffmpeg