2010-06-14 23 views
0

Nous travaillons sur une application en langage C qui est simple client RTSP/RTP pour enregistrer une vidéo Axis plusieurs caméras. Nous lançons un pthread pour chaque caméra qui établit la session RTP et commence à enregistrer les paquets capturés en utilisant l'appel recvfrom(). Une seule caméra pthread unique enregistre bien pendant plus d'une journée sans problèmes.capture de paquets vidéo sur plusieurs caméras IP

Mais des tests avec plus de caméras disponibles, environ 25 (donc 25 pthreads), l'enregistrement dans le fichier va bien pour que 15 à 20 minutes, puis l'enregistrement arrête juste. L'application continue à fonctionner. Cela fait plus d'un mois et demi que nous essayons avec des implémentations variées mais rien ne semble aider. S'il vous plaît fournir des suggestions.

Nous utilisons CentOS 5 plate-forme

+0

cela ressemble à un problème de blocage: 1) la dose, il arrive avec moins alors 25 fils de discussion? 2) quand cela arrive, que font vos fils à la fois? – Alon

+0

Sur quelle plate-forme travaillez-vous? Quelles bibliothèques de capture de paquets utilisez-vous? – pcent

+0

Ce n'est pas beaucoup d'informations pour continuer. Je suggérerais une implémentation alternative où il y a un thread qui traite toutes les caméras en utilisant select() ou poll() pour contrôler le flux. – atlpeg

Répondre

0

Define "record" Est-ce que cela signifie données d'écriture dans un fichier? Comment contrôlez-vous l'accès au fichier?

Vous ne pouvez pas avoir plusieurs threads tous essayer d'écrire exactement au même temps. Le commentaire d'Alon semble donc pertinent. Votre machanisme de contrôle d'accès en écriture a des problèmes.

+0

oui Jim enregistrement-> écrire les données dans un fichier dans le disque dur Chaque caméra écrit dans un fichier séparé – user366520

0
void *IPThread(void *ptr) 
{ 
//Establish RTSP session 
//Bind to RTP ports(video) 
//Increase Socket buffer size to 625KB 

record_fd=open(record_name, O_CREAT|O_RDWR|O_TRUNC, 0777); 
while(1) 
{ 
    if(poll(RTP/RTCP ports)) //a timeout value of 1 
    { 
     if(RTCP event) 
     RTCPhandler(); 
     if(RTP event) 
     { 
      recvfrom(); //the normal socket api recvfrom 
      WritePacketToFile(record_fd) 
      { 
      //Create new record_fd after 100MB 
      } 
     } 
    } 
} 
} 

même si elle est bien de coller à la mise en œuvre seul thread pourquoi l'approche multithread comporte de telle manière (pas après l'enregistrement ~ 15 minutes) ..?

+0

Et nous avons essayé avec la fonction de vidage openRTSP, en commençant à environ 20 instances de openRTSP soit 20 caméras ..openRTSP a également cessé d'enregistrer dans le même façon .. que lorsque nous avons commencé avec 6 instances openRTSP il allait sur l'enregistrement .. – user366520