Willkommen in der Webstatt Zum Webstatt Blog und Stories
Snake am 22.01.08 19:07

Hallo :)

Ich versuche gerade bischen aus Spaß automatisch 2 Lieder ineinander zu mischen bzw. einen einfachen überganz zwischen zweien zu schaffen.
Das ganze soll danach noch zu nem Radioserver gestreamt werden.
Dies funktioniert auch schon sehr gut, problematisch ist nur, dass die Daten ja in Echtzeit in Relation zur Abspielgeschwindigkeit verarbeitet werden sollte, um den Prozessor möglichst gleichmäßig zu belasten und natürlich um die Daten in richiger Geschwindigkeit an den Radioserver zu senden.

Am einfachsten wäre ja:
geeigneten Buffer wählen, diesen x mal die Sekunde vom Decoder füllen lassen, bearbeiten, Encoden und zum Radioserver senden.
Problematisch ist dabei die Größe des Buffers: Es sind nur 1k Schritte nötig. Es ist also nicht ohne weiteres Möglich, mit konstanter Pause zwischen 2 Lesevorgängen zu arbeiten.

Meine Lösung:
Ich hab einen Thread am laufen, der andauernd die Datendurchflussmänge misst und anhand von der bestimmt, ob die Pause größer oder Kleiner werden muss. Sobald also zu viele Bytes angefallen sind die hätten gesendet werden sollen, wird die Pause verkleinert und die Durchfussmenge steigt.
Problem bei der Idee ist, dass die Pausendauer schneller geändert wird als dass der Arbeitsthread darauf reagieren könnte. Ziel ist natürlich, eine möglichst kleine (und kleiner werdende) kurve um die Optimaldurchflussmenge zu machen. Doch meine umsetzung vergrößert die Kurve immer mehr, da wie gesagt der Arbeitsthread nicht schnell genug Reagieren kann und somit die Pause (z.B.) immer länger wird, bis sie viel zu lang ist und sie schlagartig wieder unheimlich klein gemacht wird.

Eine einfache vergrößerung der Pausen zwischen 2x Durchflussmenge messen geht nicht, da dann Schwankungen (z.b. wenn etwas stark auf der cpu liegt) nichtmehr schnell genug abgefangen werden können. (es wird natürlich die dauer der Zeit, die für Berechnungen gebraucht wird, von der SleepTime abgezogen!)

Hat jemand ne Gute Idee zu dem Thema?

Meine Umsetzung:
private void CThread() {
const int BYTES_PER_LOOP = BYTES_PER_SECOND / 10;
int Bytes = 0;
while (true) {
Thread.Sleep(100);
Bytes += m_ReadBytes - BYTES_PER_LOOP;
m_ReadBytes = 0;

if (Bytes > 2048) {
m_SleepTime++;
} else if (Bytes < -2048) {
m_SleepTime--;
}
}
}

netcup.de Warum gibt es hier Werbung?
Morit2 Morit2 am 24.01.08 10:07

Scheint so als könnte dir keiner weiter helfen xD
Hast du denn schon eine Lösung gefunden?

Snake am 24.01.08 13:05

naja, hab die SleepTime auf ein Bereich von dem errechneten +-5 eingesperrt. So geht die richtige Datenmenge durch und die Schwankungen bleiben in einem akzeptablen Rahmen.
Aber innerhalb dieses Ramens ist es sehr "hektisch"...also keine Optimallösung

Creative Commons Lizenzvertrag
Alle Inhalte des Webstatt-Archivs stehen unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.

Impressum & Kontakt