是否可以通过标准 GET 请求将广告或消息动态拼接成 MP3 文件?

Is it possible to splice advertisements or messages dynamically into an MP3 file via a standard GET request?

假设您有一个 60,000,000 字节的 MP3 文件,还有一个 500,000 字节的 MP3 广告,两者都以相同的比特率编码。

是否可以使用 nginx 或 apache 模块将 MP3 "Content-Length" header 值更改为 60,500,000,然后控制传入的 "Content-Range" 请求,以便前 500,000 字节 return 广告音频,任何大于 500,000 的范围请求开始 return 以 500,000 字节偏移量处理常规音频文件?

或者是否只能使用 FFmpeg 等应用程序将广告(或消息)拼接到 MP3 文件以 re-render 整个文件?

抱歉,如果这是一个愚蠢的问题,我只是想跳出框框思考。

你不能随意拼接 MP3 而没有伪影和解码器错误。

由于 Bit Reservoir,您通常也不能 cut/splice 帧边界上的 MP3。基本上,一个特定的 MP3 帧可能包含来自另一个帧的数据,以便在需要时更有效地使用可用带宽。忽略位库也会导致工件 and/or 解码器错误。

可以做的是重新编码您的广告并最终重新加入流。也就是说,在广告插入点,将流解码为 PCM,为您的广告混合(或替换音频),并将此并行流重新编码为 PCM。如果编码参数相同,最终(在几个额外的 MP3 帧之后),您将拥有相同的比特流,并且您可以返回从同一缓冲区读取流。

如果您这样做是为了在互联网广播(直播)流中插入广告,请记住,您必须在服务器上为每个客户端(或至少,对于每个广告变体和时序变量)。如果这是用于播客或其他预先录制的内容,我会推荐 FFmpeg 路线。您不必构建任何东西,您可以在输出被编码时流式传输和缓存输出,并且您将与其他编解码器兼容,而无需为每个 codec/container.

构建一次性代码