使用不精确的Content-Length标头发送响应,然后手动结束它

时间:2012-09-28 03:30:21

标签: httpresponse http-content-length

我正处于向MP3播放器发送文件的情况下,此播放器需要知道文件长度才能正确显示进度条。问题是这个MP3来自一个文件,它是即时转换的结果,所以我不知道最终的文件大小。只是估计(比特率*持续时间)。因此,当为文件设置错误的内容长度时,无法提供文件,下载最后会出现网络错误。

有没有办法强制浏览器接受最终和原样的数据?对于玩家来说,这不是一个问题,因为它可能会在它到达尽头时停止。

[编辑]

现在,我会尝试添加“00”字节,直到达到合适的大小并看看它是如何播放的。

1 个答案:

答案 0 :(得分:0)

由于我不需要任何ID3标签信息,因此针对此特定MP3问题的解决方案是:

  1. 使用ffprobe.exe等工具获取持续时间

  2. 在您发送内容长度标题中指定的字节数之前,请删除2秒以确保无法到达具有未知大小的真实MP3文件的末尾。

  3. 然后乘以比特率,这样你就得到了尺寸未知的MP3的估计大小,然后你删除了一些kbs。

    Function getduration(ByVal url As String, ByVal curqual As Integer) As String            
    Dim path As String = "C:\cmd\"
    Dim app As String = MapPath(".") & "\ffprobe.exe"
    
    Dim myProcess As New System.Diagnostics.Process()
    Dim AppPath As String = Request.PhysicalApplicationPath 
    myProcess.StartInfo.FileName = app
    myProcess.StartInfo.Arguments = url
    myProcess.StartInfo.UseShellExecute = False
    myProcess.StartInfo.RedirectStandardOutput = True
    myProcess.StartInfo.RedirectStandardError = True
    myProcess.Start()
    
    Dim mystreamreader As StreamReader = myProcess.StandardError
    Dim str As String = mystreamreader.ReadToEnd
    Dim loca As Integer = str.IndexOf("Duration:") + 10
    Dim locb As Integer = str.IndexOf(",", loca)
    Dim tm As String = str.Substring(loca, locb - loca)
    Dim tim As Integer = TimeSpan.Parse(tm).TotalMilliseconds
    Dim siz As Long = (((tim - 2000) * curqual) / 8)
    Return siz
    End Function