来自服务器的音频的iOS Safari问题

时间:2015-12-09 22:56:15

标签: ios html5 audio safari mobile-safari

所以目前正在开发一个项目并遇到一个奇怪的问题,即ios版本的Safari涉及从服务器回放音频文件。

我目前面临以下问题:

  1. Person进入具有标准html5音频标签的页面,以及指向音频文件的直接链接以供下载。
  2. 人试图从音频标签收听音频,内容播放x分钟,切断然后重复(x分钟不是录音的长度,并且不一致)。
  3. 人尝试直接链接记录,而不是下载记录,Safari似乎转到新页面并将下载URL包装在视频元素中,并出现与步骤2相同的问题。
  4. 现在,音频文件通过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,尽管我发现的大多数文档都是关于它的“独特”的网络音频实现,以及使用单通道似乎与此无关。

    任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

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

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

必要的标题:

  • 内容范围:字节0- [内容长度] / [内容长度]
  • Content-Transfer-Encoding:binary
  • 内容长度:[内容长度]
  • Accept-Ranges:bytes

我在检查了通过Akamai的内容分发服务提供的MP3响应后设计了这个。