HowlerJS:音频在 Safari 和 iOS 设备上自行回跳
HowlerJS: Audio skipping back on itself on Safari and iOS devices
我正在开发某种网络播放器,我正在使用 php 框架 Laravel 来处理播放列表的数据。我创建了一个包含所有必要信息的播放列表数组。使用此数组,我在需要播放播放列表对象时制作了一个 howl 实例。
这在 Firefox 和 Chrome 上运行流畅,无论是在桌面上还是在移动设备上。但是,我在 Safari 或 iOS 浏览器上测试时遇到问题。
发生了什么:音频播放正常,但是在歌曲播放大约 1-2 分钟后,它会自行循环回到大约 20-45 秒前。这会产生一首非常烦人的歌曲,它只是重复歌曲的相同部分直到结束。它是做什么的。因为尽管有这种循环,应用程序仍然会继续增加歌曲的秒数。 (sound.seek() 不断上升。)
查看网络选项卡时,我发现有些奇怪,而其他浏览器只获取一次音频源,而 Safari 会多次执行此操作。这是我注意到的唯一明显变化。
因为我没有 10 个代表图片放在这里:https://imgur.com/Y48J52g
最奇怪的是本地托管版本也没有问题。那么这是网络服务器问题吗?浏览器?我很茫然。
onloaderror 和 onplayerror 事件也不会触发,所以据我所知没有问题。
实例化嚎叫:
sound = data.howl = new Howl({
src: ['./get-audio' + data.file],
html5: true,
//After this I instance all onX functions (onplay, onend, etc)
...
sound.play()
然后每当我需要下一首歌曲时,我就会卸载这个嚎叫实例并创建下一首。
我的大部分代码都是根据他们 'player' 的 HowlerJS 示例进行调整的,以防您想深入研究代码本身。
提供音频的方式:
public function getAudio($map, $name)
{
$fileName = $map.'/'.$name;
$file = Storage::disk('local')->get($fileName);
$filesize = Storage::disk('local')->size($fileName);
$size = $filesize;
$length = $size;
$start = 0;
$end = $size - 1;
return response($file)
->withHeaders([
'Accept-Ranges' => "bytes",
'Accept-Encoding' => "gzip, deflate",
'Pragma' => 'public',
'Expires' => '0',
'Cache-Control' => 'must-revalidate',
'Content-Transfer-Encoding' => 'binary',
'Content-Disposition' => ' inline; filename='.$name,
'Content-Length' => $filesize,
'Content-Type' => "audio/mpeg",
'Connection' => "Keep-Alive",
'Content-Range' => 'bytes 0-'.$end .'/'.$size,
'X-Pad' => 'avoid browser bug',
'Etag' => $name,
]);
}
所以我不确定为什么 Safari/iOS 托管版本有问题,而在本地它确实有效。
这是我在本网站上的第一个问题,如果您想了解更多信息,请告诉我。
我发现了问题。
即 Safari 认为我提供的是音频流而不仅仅是 mp3 文件,导致它不断发送请求。我通过像这样提供音频解决了这个问题:
$path = storage_path().DIRECTORY_SEPARATOR."app".DIRECTORY_SEPARATOR."songs".DIRECTORY_SEPARATOR.$name;
$response = new BinaryFileResponse($path);
BinaryFileResponse::trustXSendfileTypeHeader();
return $response;
我正在开发某种网络播放器,我正在使用 php 框架 Laravel 来处理播放列表的数据。我创建了一个包含所有必要信息的播放列表数组。使用此数组,我在需要播放播放列表对象时制作了一个 howl 实例。
这在 Firefox 和 Chrome 上运行流畅,无论是在桌面上还是在移动设备上。但是,我在 Safari 或 iOS 浏览器上测试时遇到问题。
发生了什么:音频播放正常,但是在歌曲播放大约 1-2 分钟后,它会自行循环回到大约 20-45 秒前。这会产生一首非常烦人的歌曲,它只是重复歌曲的相同部分直到结束。它是做什么的。因为尽管有这种循环,应用程序仍然会继续增加歌曲的秒数。 (sound.seek() 不断上升。)
查看网络选项卡时,我发现有些奇怪,而其他浏览器只获取一次音频源,而 Safari 会多次执行此操作。这是我注意到的唯一明显变化。
因为我没有 10 个代表图片放在这里:https://imgur.com/Y48J52g
最奇怪的是本地托管版本也没有问题。那么这是网络服务器问题吗?浏览器?我很茫然。
onloaderror 和 onplayerror 事件也不会触发,所以据我所知没有问题。
实例化嚎叫:
sound = data.howl = new Howl({
src: ['./get-audio' + data.file],
html5: true,
//After this I instance all onX functions (onplay, onend, etc)
...
sound.play()
然后每当我需要下一首歌曲时,我就会卸载这个嚎叫实例并创建下一首。 我的大部分代码都是根据他们 'player' 的 HowlerJS 示例进行调整的,以防您想深入研究代码本身。
提供音频的方式:
public function getAudio($map, $name)
{
$fileName = $map.'/'.$name;
$file = Storage::disk('local')->get($fileName);
$filesize = Storage::disk('local')->size($fileName);
$size = $filesize;
$length = $size;
$start = 0;
$end = $size - 1;
return response($file)
->withHeaders([
'Accept-Ranges' => "bytes",
'Accept-Encoding' => "gzip, deflate",
'Pragma' => 'public',
'Expires' => '0',
'Cache-Control' => 'must-revalidate',
'Content-Transfer-Encoding' => 'binary',
'Content-Disposition' => ' inline; filename='.$name,
'Content-Length' => $filesize,
'Content-Type' => "audio/mpeg",
'Connection' => "Keep-Alive",
'Content-Range' => 'bytes 0-'.$end .'/'.$size,
'X-Pad' => 'avoid browser bug',
'Etag' => $name,
]);
}
所以我不确定为什么 Safari/iOS 托管版本有问题,而在本地它确实有效。
这是我在本网站上的第一个问题,如果您想了解更多信息,请告诉我。
我发现了问题。
即 Safari 认为我提供的是音频流而不仅仅是 mp3 文件,导致它不断发送请求。我通过像这样提供音频解决了这个问题:
$path = storage_path().DIRECTORY_SEPARATOR."app".DIRECTORY_SEPARATOR."songs".DIRECTORY_SEPARATOR.$name;
$response = new BinaryFileResponse($path);
BinaryFileResponse::trustXSendfileTypeHeader();
return $response;