2010-12-04 4 views
1

J'ai le code pour vérifier STDERR avec « DRM flux protégé détecté »:comment lire stderr en char [] dans c

const static char* DRM_TOKEN = "DRM protected stream detected"; 

const char* source = argv[1]; 
char tempfile[80]; 
memset(tempfile, 0, 80); 
snprintf(tempfile, 80, "stderr_%lld.log", av_gettime()); 
freopen(tempfile, "w", stderr); 

fflush(stderr); 
FILE *fp = fopen(tempfile, "r"); 
if(fp) 
{ 
    char STDERR[256]; 
    while(!feof(fp)) 
    { 
    memset(STDERR, 0, sizeof(char) * 256); 
    fgets(STDERR, 256, fp); 
    if(strstr(STDERR, DRM_TOKEN) != NULL) 
    { 
     drm = 1; 
     break ; 
    } 
    } 
    fclose(fp); 
} 

Il fonctionne, mais je veux savoir un moyen de lire directement STDERR en carboniser[]. PS. mon code fonctionnera sous linux ou macos.

+0

Enfin, j'ai trouvé le bon moyen d'obtenir des messages de ffmpeg. Il fournit la fonction av_log_set_callback. Je peux l'utiliser pour obtenir tous les messages directement. http://ffmpeg.org/doxygen/trunk/log_8c.html – qrtt1

Répondre

1

stderr a été rouvert en mode "w", qui est en écriture seule. A en juger par votre fonction av_gettime, il semble que vous utilisiez libavcodec/libavutil, donc au lieu d'écrire des hacks hideux comme ça pour obtenir les messages d'erreur, vous devriez lire sur le système av_log et enregistrer votre propre fonction de journalisation pour remplacer le comportement par défaut d'écriture des messages de diagnostic à stderr.