2012-09-28 43 views
0

我處於發送文件到MP3播放器的情況,並且此播放器需要知道文件長度以正確顯示進度條。問題是這個MP3來自一個文件,它是一個即時轉換的結果,所以我不知道最終的文件大小。只是一個估計(比特率*持續時間)。因此,在爲文件設置錯誤的Content-Length時,文件無法投放,下載掛在網絡錯誤的末尾。用不精確的內容長度標題發送響應,然後手動結束它

有沒有辦法強制瀏覽器接受數據作爲最終的和原樣?對於玩家來說,這不是問題,因爲如果比預期的結束時間更早結束,它可能會停止。

[編輯]

現在,我會嘗試添加「00」字節,直到我達到良好的大小,看看它是如何發揮。

回答

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 
    
相關問題