在下面的音频跳转演示中,可以正常点击
1MnxnMOPlkOJO.mp3
,然后通过请求中正确的范围开始并立即播放。 1MnxnMOPlkOJO.aac
不会,在开始播放之前会继续从缓冲位置下载到跳转后内容位置。
这是为什么呢?求大神解答!
该 html 在 MacBook Pro Chrome 120.0.6099.216 (arm64) 中运行
<body>
<audio id="audio-player" controls>
<source src="https://sjc1.vultrobjects.com/tw-audio/1MnxnMOPlkOJO.mp3" type="audio/mpeg">
</audio>
<div>
<button onclick="jumpToTime(10)">10:00</button>
<button onclick="jumpToTime(20)">20:00</button>
<button onclick="jumpToTime(30)">30:00</button>
</div>
<audio id="audio-player1" controls>
<source src="https://sjc1.vultrobjects.com/tw-audio/1MnxnMOPlkOJO.aac" type="audio/mpeg">
</audio>
<div>
<button onclick="jumpToTime1(10)">10:00</button>
<button onclick="jumpToTime1(20)">20:00</button>
<button onclick="jumpToTime1(70)">1:10:00</button>
</div>
<script>
const audioPlayer = document.getElementById('audio-player');
function jumpToTime(minutes) {
audioPlayer.currentTime = minutes * 60;
}
const audioPlayer1 = document.getElementById('audio-player1');
function jumpToTime1(minutes) {
audioPlayer1.currentTime = minutes * 60;
}
</script>
</body>
'1MnxnMOPlkOJO.aac'是直接从我通过m3u8文件下载的aac合并的,'1MnxnMOPlkOJO.mp3'是用ffmpeg转换为mp3格式的。但我不想让ffmpeg再次转换,如何解决上述问题?
我认为不同行为的原因可能是 MP3 和 AAC 文件的编码方式和内部结构。
MP3 文件的帧头分散在各处,允许播放器索引到文件中的任意位置,而无需从头开始解码。这样可以快速搜索和扫描。
ADTS 格式的 AAC 文件没有相同的帧头和索引点。要解码文件中的特定时间段,播放器通常需要从头开始并继续解码,直到到达该点。
因此,当您尝试切换到 AAC 文件时,浏览器播放器仍然需要缓冲之前到达的点到移动位置的数据,然后才能在那里开始播放。这会导致您看到的滞后。
可能有帮助的解决方案:
但是,由于 ADTS AAC 流固有的寻道限制,避免重新编码为 MP3 很困难。浏览器播放器和网络堆栈必须做额外的工作来解决这个问题。祝你好运