0

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

是否可以使用 nginx 或 apache 模块将 MP3“Content-Length”标头值更改为 60,500,000,然后控制传入的“Content-Range”请求,以便前 500,000 个字节返回广告音频,并且任何范围请求大于500,000 开始返回具有 500,000 字节偏移量的常规音频文件?

还是只能使用 FFmpeg 等应用程序将广告(或消息)拼接到 MP3 文件中以重新渲染整个文件?

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

4

1 回答 1

1

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

由于Bit Reservoir,您通常也无法在帧边界上剪切/拼接 MP3 。基本上,一个特定的 MP3 帧可能包含来自另一个帧的数据,以便在需要时更有效地使用可用带宽。忽略比特储存器也可能导致伪影和/或解码器错误。

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

如果您要在互联网广播(直播)流上插入广告,请记住,您必须在服务器上为每个客户端(或至少为每个广告变体和时间变体)执行此操作。如果这是用于播客或其他预先录制的内容,我建议使用 FFmpeg 路线。您不必构建任何东西,您可以在输出被编码时流式传输和缓存输出,并且您将与其他编解码器兼容,而无需为每个编解码器/容器构建一次性代码。

于 2019-08-18T23:27:21.530 回答