MP3 streamen => Timing



  • Hey,

    ich bin gerade dabei, mir einen kleinen Server zu programmieren, der MP3s streamt. Die MP3s haben dabei eine fixe Bitrate und alle zu Streamenden die gleiche. Ich streame einfach ganz simpel über HTTP.
    Ein wenig kann ich mit VLC und Windows Media Player den Stream ansprechen, die Buffern erst ein paar Sekunden, spielen dann eine halbe Minute ab und hören dann auf. WMP ohne Angabe von Gründen; VLC loggt, dass das Timing vom Stream nicht korrekt ist [1].

    Unabhängig davon, ob ich zu schnell oder zu langsam sende, scheint mein Ansatz nicht ganz hinzuhauen. Bisher hab ich es so:

    // Am Anfang:
    FirstTime = getTime()
    TotalSent = 0
    
    // In ~100ms-Intervallen, durch Timer ausgelöst:
    Elapsed = getTime() - FirstTime                  // Vergangene Zeit
    Target = Bitrate/8 * Elapsed / 1000              // Wieviel jetzt gesendet sein sollte
    ToSend = Target - TotalSent                      // Wieviel also zu senden ist
    send( Socket, Mp3File.getChunk( ToSend ) )       // Senden
    TotalSent += ToSend                              // Aktualisieren
    

    mit Bitrate z.B. 320000 für 320kBit/s; getTime() löst in Millisekunden auf. Sowohl der Timer als auch getTime() sind etwa +/- 20 ms ungenau.

    Sieht jemand das Problem im Code oder kennt eine funktionierende Herangehensweise? Auch ein paar wahlfreie Gedanken könnten helfen.

    [1] VLC-Output:
    ...
    main debug: Buffering 97%
    main debug: Stream buffering done (1201 ms in 1088 ms)
    main debug: Decoder buffering done in 0 ms
    main warning: PTS is out of range (-9927), dropping buffer
    main warning: PTS is out of range (-36024), dropping buffer
    mpgatofixed32 debug: libmad error: bad main_data_begin pointer
    main warning: output date isn't PTS date, requesting resampling (61412)
    main warning: buffer is 61411 late, triggering upsampling
    main warning: resampling stopped after 11937575 usec (drift: 449)


Anmelden zum Antworten