颤振中的插件"音频播放器"未检索音频持续时间



我正在创建一个使用扑动的应用程序,我正在从AWS-s3桶中检索音频。在检索音频之前,我检查用户是否有权访问该文件。然后我将音频添加到插件&;audioplayers&;并且音频播放没有问题,但音频的持续时间永远不会加载。

持续时间的问题只发生在iPhone上,使用flutter、chrome和safari。

这是我的PHP代码来检索音频,我没有添加权限检查,因为如果我删除那部分代码的结果是相同的。我认为问题在于我如何检索音频文件:

function printAudio($audioID)
{
$url = "my_file_url";
header_remove();
print_headers($url);
//header("Content-Length: " . filesize($url));
readfile($url);
}
function print_headers($url)
{
$headers = get_headers($url);
if ($headers != null) {
foreach ($headers as $header) {
print_if_needed($header);
//header($header);
}
}
}
function print_if_needed($header)
{
if (str_contains($header, "Accept-Ranges:")) {
header(strtolower($header));
return;
}
if (str_contains($header, "Content-Length:")) {
header(strtolower($header));
$fileSize = (int)str_replace("Content-Length: ", "", $header);
$rangeTo = $fileSize - 1;
header("Content-Range: bytes 0-$rangeTo/$fileSize");
return;
}
if (str_contains($header, "Content-Range:")) {
header(strtolower($header));
return;
}
if (str_contains($header, "Content-Type:")) {
header(strtolower($header));
return;
}
if (str_contains($header, "ETag:")) {
header(strtolower($header));
return;
}
if (str_contains($header, "Last-Modified:")) {
header(strtolower($header));
return;
}
}

我添加了content-range检查是否可以解决问题,结果是一样的。我也试过用大写的头和小写的头。

我已经尝试使用AWS/s3 PHP API检索对象,结果总是相同的,音频可以播放,但音频的持续时间从未检索。

我已经使用这个代码修复了代码github/pomle

当你移动音频的位置时,我需要为音频范围添加额外的代码。

function print_if_needed($header){
if (str_contains($header, "Content-Length:")) {
$byteOffset = 0;
$fileSize = (int)str_replace("Content-Length: ", "", $header);
$byteLength = $fileSize;
if (isset($_SERVER['HTTP_RANGE']) && preg_match('%bytes=(d+)-(d+)?%i', $_SERVER['HTTP_RANGE'], $match)) {
### Offset signifies where we should begin to read the file
$byteOffset = (int)$match[1];
### Length is for how long we should read the file according to the browser, and can never go beyond the file size
if (isset($match[2])) {
$finishBytes = (int)$match[2];
$byteLength = $finishBytes + 1;
} else {
$finishBytes = $fileSize - 1;
}
$cr_header = sprintf('Content-Range: bytes %d-%d/%d', $byteOffset, $finishBytes, $fileSize); 
header("HTTP/1.1 206 Partial content");
header($cr_header);  ### Decrease by 1 on byte-length since this definition is zero-based index of bytes being sent
$byteRange = $byteLength - $byteOffset;
header(sprintf('Content-Length: %d', $byteRange));
}
else{
header("HTTP/1.1 200 OK");
header($header);
$rangeTo = $fileSize - 1;
header("Content-Range: bytes 0-$rangeTo/$fileSize");
$byteRange = $byteLength - $byteOffset;
header(sprintf('Content-Length: %d', $fileSize));
}
return;
}
if (str_contains($header, "Content-Type:")) {
header(strtolower($header));
return;
}
if (str_contains($header, "ETag:")) {
header(strtolower($header));
return;
}
if (str_contains($header, "Last-Modified:")) {
header(strtolower($header));
return;
}
}

function printAudio($audioID){
$url = "my_file_url";
header_remove();
//I HAVE MOVED THESE HEADERS HERE FOR CODE VISIBILITY, IT IS NOT NEEDED TO SOLVE THE PROBLEM.
header_remove('Cache-Control');
header_remove('Pragma');
header('Accept-Ranges: bytes', true);
header(sprintf('Expires: %s', date('D, d M Y H:i:s', time() + 60 * 60 * 24 * 90) . ' GMT'));
print_headers($url);
readfile($url);
}

我需要控制何时使用音频范围。当我修复了这一点,它停止在android,我不得不添加else添加标题时,没有范围的音频。

最新更新