2011-10-16 3 views
8

Par défaut, libavformat écrit des messages d'erreur à stderr, comme:Comment puis-je transformer libavformat messages d'erreur hors

Estimating duration from bitrate, this may be inaccurate

Comment puis-je désactiver? ou mieux encore, l'acheminer vers ma propre fonction de journalisation?

Modifier: La redirection de stderr vers un autre emplacement n'est pas acceptable car j'en ai besoin à d'autres fins de journalisation, je veux juste que libavformat ne s'y écrive pas.

+0

Voir soit http://stackoverflow.com/questions/5095839/redirect-from-stderr-to-another-file-descriptor soit http://stackoverflow.com/questions/573724/how-can-i-redirect -stdout-to-some-visible-display-in-a-windows-application –

+0

Je ne veux pas rediriger toute la sortie de stderr du programme, j'ai mes fonctions de journalisation en y écrivant d'une manière soignée. Je voudrais juste que libavformat ne m'écrit pas. – amrhassan

+0

Qu'est-ce qui écrit exactement sur stderr? C'est la 1ère fois que j'entends la bibliothèque libavcodec envoyer des erreurs à stderr (mon expérience avec cette bibliothèque n'est pas grande). –

Répondre

7

En regardant à travers le code, il semble que vous pouvez changer le comportement en écrivant votre propre fonction de rappel pour la fonction av_log.

De la description de cette fonction dans libavutil/log.h:

Envoyer le message spécifié dans le journal si le niveau est inférieur ou égal à la av_log_level actuelle. Par défaut, tous les messages de journalisation sont envoyés à stderr. Ce comportement peut être modifié en définissant une autre fonction de rappel av_vlog .

L'API fournit une fonction qui vous permettra de définir votre propre rappel:

void av_log_set_callback(void (*)(void*, int, const char*, va_list)); 

Dans votre cas, vous pourriez écrire une simple fonction de rappel qui supprime les messages au total (ou les redirige vers un journal dédié, etc.) sans souiller votre flux stderr.

+6

Battez-moi.Vous pouvez également utiliser 'av_log_set_level (AV_LOG_QUIET)' pour désactiver toute la journalisation. –

1

Vous pouvez les rediriger vers un fichier personnalisé, il redirigera toutes les entrées de cerr:

#include <iostream> 
#include <fstream> 

using namespace std; 

int main() 
{ 
    ofstream file("file.txt"); 

    streambuf *old_cerr = cerr.rdbuf(); 

    cerr.rdbuf (file.rdbuf()); 

    cerr << "test test test" << endl; // writes to file.txt 

    // ... 

    cerr.rdbuf (old_cerr); // restore orginal cerr 

    return 0; 
} 

Edit: Après avoir modifié la question, je mets en garde sur le code ci-dessus qu'il va rediriger toutes les entrées cerr Je ne connais pas libavformat, mais si son code n'est pas modifiable, vous pouvez rediriger temporairement cerr vers un fichier avant d'appeler l'API de la bibliothèque et le rediriger vers l'original à nouveau. (Cependant, c'est une façon laide)

+0

... et tous les autres messages 'cerr'. Je ne pense pas que c'est ce que l'OP voulait. –

+0

J'ai mis à jour ma réponse, et j'ai remarqué à ce sujet. Je vous remercie. –

5

Donner av_log_set_level(level) un essai!

Questions connexes