0

我正在将文件发送到 MP3 播放器,并且该播放器需要知道文件长度才能正确显示进度条。问题是这个 MP3 来自一个即时转换结果的文件,所以我不知道最终文件的大小。只是一个估计值(比特率 * 持续时间)。因此,当为文件设置错误的 Content-Length 时,无法提供文件,下载在最后挂起并出现网络错误。

有没有办法强制浏览器接受最终和原样的数据?对于玩家来说,这不是问题,因为如果它比应有的更早到达终点,它可能会停止。

[编辑]

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

4

1 回答 1

0

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

  1. 使用 ffprobe.exe 之类的工具来获取持续时间

  2. 删除 2 秒以确保在发送内容长度标头中指定的字节数之前不会到达大小未知的真实 MP3 文件的末尾。

  3. 然后乘以比特率,得到未知大小的 MP3 的估计大小,然后删除一些 kb。

    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
    
于 2012-11-01T18:18:14.837 回答