Отправьте ответ с неточным заголовком Content-Length, а затем завершите его вручную.

Я нахожусь в ситуации, когда я отправляю файл на MP3-плеер, и этот плеер должен знать длину файла, чтобы правильно отображать индикатор выполнения. Проблема в том, что этот MP3 исходит из файла, который является результатом преобразования на лету, поэтому я не могу знать окончательный размер файла. Просто оценка (битрейт * продолжительность). Итак, при установке ошибочной Content-Length для файла файл не может быть обслужен, загрузка зависает в конце с сетевой ошибкой.

Есть ли способ заставить браузеры принимать данные как окончательные и как есть? Для игрока это не проблема, так как он, вероятно, просто остановится, если дойдет до конца раньше, чем должен.

[Редактировать]

Сейчас я попытаюсь добавить «00» байт, пока не достигну хорошего размера и не посмотрю, как он воспроизводится.


person Léon Pelletier    schedule 28.09.2012    source источник


Ответы (1)


Поскольку мне не нужна была какая-либо информация о тегах ID3, решение этой конкретной проблемы с MP3 заключалось в следующем:

  1. Используйте такой инструмент, как ffprobe.exe, чтобы получить продолжительность

  2. Удалите 2 секунды, чтобы быть уверенным, что не достигнете конца реального файла MP3 неизвестного размера, прежде чем вы отправите количество байтов, указанное в заголовке длины содержимого.

  3. Затем умножьте на битрейт, чтобы получить приблизительный размер для MP3 с неизвестным размером, затем удалите несколько килобайт.

    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
    
person Léon Pelletier    schedule 01.11.2012