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

标签 http https audio-streaming google-cast

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

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

有指向代码/库的指针吗?最好使用任何语言,例如 java/kotlin/go/rust/ruby/python/node/...

例子

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

响应:音频流(在转换设备上播放)

流循环文件 1。每 30 秒播放一次 file2,音量为 50%(覆盖在以 100% 播放的 file1 上)。文件 1 长 10 米 9 秒。所以组合永远不会真正重复。所以我们不能只提供一个预生成的 mp3 文件。

一些背景

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

现在我想添加对 chromecast/chromecast audio/google home/... 的支持。我想最好的办法是拥有一个流式传输的服务器。每个用户在播放时都会有自己的流。无需让多个用户收听同一个流(即使它可能也会受到支持)。

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

最佳答案

所以你的问题有两个部分

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

后半部分我可以帮你,前半部分你需要自己搞清楚

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

npm init
npm install fluent-ffmpeg express

然后保存下面的文件

server.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)

使用下面的命令运行它

node server.js

现在在 VLC 中打开 http://localhost:9090/merged

Open in VLC

现在根据您的要求,以下部分将更改

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

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

ffmpeg - how to merge multiple audio with time offset into a video?

How to merge two audio files while retaining correct timings with ffmpeg

ffmpeg mix audio at specific time

https://superuser.com/questions/850527/combine-three-videos-between-specific-time-using-ffmpeg

关于http - 将重叠的音频文件流式传输到 Chromecast Audio,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49483191/

相关文章:

java - 在 Java Web 服务器中使用 letsencrypt 证书

audio-streaming - 从远程服务器设置音频流

java - java sound 流音频的奇怪问题

iOS SDK AVPlayer - 如何检测音频流是否可搜索?

android - 在文件上传过程中显示进度条

http - 422 状态代码是否适用于无法删除对象?

android - HttpsURL 连接 : SSL resumption not working

http - 在 IE9 中下载指向 RDP 文件的链接

HTTP 推送超过 100,000 个连接

ssl - 根据 RFC 2817 在 Nginx 中将 HTTP 升级到 TLS