RTMP转HLS音频爆音的问题

早在SRS1.0支持HLS的时候,就剽窃nginx-rtmp的HLS生成方式,对音频重新计算时间戳,代码在这里。

当时还搞清楚了为什么不直接使用RTMP的时间戳,而要根据音频的个数、采样率和采样大小重新进行计算,大致说是精度不一样导致累计误差。

在SRS2的时候,重新写了HLS部分,主要是把TS封装这块搞得比较清楚了,后来想到其实音频不必打时间戳,就累计在那里就好了,时间戳都打在视频上面的。

SRS2发现纯音频还是绕不过去这个问题,但没有重新计算时间戳,而是使用RTMP的时间戳,因此HLS纯音频就会间隔一定时间就杂音,“噗噗噗”这种。

再到后来,使劲想都想不起来到底误差在哪里,因为RTMP是1/1000的精度,TS是1/90000的精度,低精度转高精度咋会有误差呢!?后来终于想起来了,是两次变换导致的误差:

  1. 一般两个音频包的间隔是10毫秒左右,假设音频是13.3333333毫秒。
  2. 高精度的源,譬如编码器是1/90000精度(或更高),表示上面的音频就是13.3333333 * 90000 = 1199999
  3. 源发送到服务器前,得变换(第一次变换)成RTMP,精度是1/1000,也就是13333
  4. 服务器将时间戳变换(第二次变换)成TS,精度是1/90000,也就是13333 * 90=1199970
  5. 两次变换的误差是:1199999-1199970=29,每个音频包就有这个误差,如果播放器以每个包的时间累计,就会有累计误差了。

一般RTMP的播放器不会有这个问题,本身就需要考虑到这个误差,而TS的播放器譬如苹果的HLS播放器,估计就会有问题了。

你可能感兴趣的:(RTMP转HLS音频爆音的问题)