服务器音频的iOS Safari问题



因此,目前正在处理一个项目,并在ios版本的Safari中遇到一个奇怪的问题,涉及从服务器播放音频文件。

我目前面临以下问题:

  1. Person出现在页面上,该页面有一个标准的html5音频标签,以及用于下载的音频文件的直接链接
  2. 人员尝试收听音频标签中的音频,内容播放x分钟,然后中断,然后重复(x分钟数不是录制的长度,并且不一致)
  3. Person尝试录制的直接链接,而不是下载录制,Safari似乎转到了一个新页面,并将下载url封装在视频元素中,出现了与步骤2相同的问题

现在,音频文件是通过一个java scriptlet提供的,它为文件提供以下代码片段:

String fn = saveTo + file_name;
f = new File(fn);
String fname = f.getName();
String contentType = "audio/wav";
if(fname.endsWith("mp3")){
    contentType = "audio/mp3";
}
response.setContentType(contentType);
response.setHeader("Content-Transfer-Encoding", "binary");
response.setHeader("Content-disposition", "attachment;filename="+f.getName());
response.setHeader("Content-Length", ""+f.length());
FileInputStream fin = null;
try{
    fin = new FileInputStream(f.getCanonicalFile());
    byte[] data = new byte[1024];
    int x = 0;
    while((x = fin.read(data, 0, 1024))>=0){
        response.getOutputStream().write(data, 0, x);
        Thread.sleep(1);
    }
} finally {
    if(fin != null) {
        try{
            fin.close();
        }catch(Exception ex){}
    }
}

现在我知道,无论如何,这个代码都不是最好的,也不是我的代码,而且我们显然是在假设文件已经找到的情况下工作的。

我发现在mac上以调试模式在iPhone上调试时,它似乎不会显示返回状态代码。它没有显示响应头,但显然它一定在接收什么。服务器日志似乎认为它返回了状态200,这在Chrome和Firefox中显示。

上面的代码似乎可以很好地与Chrome和Firefox配合使用,但不能与Safari配合使用。

我唯一猜测的是,这与文件是如何被推送到Safari不喜欢的输出流有关,或者可能是它变得困惑,应该有不同的状态码。几天来,我一直在思考这个问题,并尽可能多地阅读有关Safari的内容,尽管我发现的大多数文档都是关于它"独特"的网络音频实现,以及似乎与此无关的单个频道的使用。

如有任何帮助,我们将不胜感激。

我在iOS上的Safari也遇到了同样的问题,经过大量调试,我发现这个问题与应用于响应的标头组合有关。

我的应用程序是基于C#的,但这个解决方案应该是独立于平台的(因为如前所述,这是一个响应头问题)。

必要的标头:

  • 内容范围:字节0-[内容长度]/[内容长度]
  • 内容传输编码:二进制
  • 内容长度:[内容长度]
  • 接受范围:字节

我是在检查了通过Akamai内容交付服务交付的MP3的响应后设计的。

最新更新