2010-08-06 27 views
1

Je veux écrire MJPEG image visionneuse de flux Internet. Je pense que l'obtention d'images jpeg en utilisant des sockets n'est pas un problème très difficile. Mais je veux savoir comment faire du streaming précis.MJPEG Internet streaming - précis fps

while (1) 
{ 
    get_image() 
    show_image() 
    sleep (SOME_TIME) // how to make it accurate? 
} 

Toutes les suggestions seraient grandes.

+0

Sur quelle plate-forme travaillez-vous? – torak

+0

J'écris sur Windows avec des langages de programmation c/C++. Je pense que je vais utiliser opengl pour la sortie d'images. – kesrut

Répondre

2

Afin de le rendre précis, il y a deux possibilités:

Utilisation framerate à partir du serveur de streaming. Dans ce cas, le client doit garder le même taux de framerate (calculer chaque fois que vous obtenez frame, puis afficher et dormir pendant une durée variable en utilisant le feedback: si le framerate calculé est plus élevé que sur le serveur -> dormir plus; -> dormez moins, puis, le framerate du côté du client dérivera autour de la valeur d'origine du serveur). Il peut être reçu du serveur lors de l'initialisation de la connexion en streaming (lorsque vous obtenez la taille de l'image et d'autres paramètres) ou il peut être configuré. En fait, l'approche la plus précise consiste à utiliser des horodatages du serveur pour chaque image (qui est soit extraite du fichier par démultiplexeur, soit générée dans le pilote du capteur d'image dans le cas d'un appareil photo). Si MJPEG est empaqueté dans le flux RTP, ces horodatages sont déjà dans l'en-tête RTP. Ainsi, la tâche du client est triviale: montrer l'image en utilisant le calcul du temps à partir du décalage temporel, de l'horodatage actuel et de la base de temps.

Update Pour la première solution:

time_to_sleep = time_to_sleep_base = 1/framerate; 
number_of_frames = 0; 
time = current_time(); 
while (1) 
{ 
    get_image(); 
    show_image(); 
    sleep (time_to_sleep); 

    /* update time to sleep */ 
    number_of_frames++; 
    cur_time = current_time(); 
    cur_framerate = number_of_frames/(cur_time - time); 
    if (cur_framerate > framerate)   
     time_to_sleep += alpha*time_to_sleep; 
    else 
     time_to_sleep -= alpha*time_to_sleep; 
    time = cur_time; 
} 

, où alpha est un paramètre constant de réactivité de la réaction (0.1..0.5) pour jouer.

Toutefois, il est préférable d'organiser la file d'attente pour les images d'entrée afin de rendre le processus d'affichage plus fluide. La taille de la file d'attente peut être paramétrée et pourrait se situer quelque part autour de 1 seconde de temps d'affichage, c'est-à-dire numériquement égal au framerate.

+0

Pmod, Pouvez-vous montrer comment le faire en pseudocode? – kesrut