2011-10-16 11 views
8

Por defecto, libavformat escribe mensajes de error stderr, igual:¿Cómo puedo activar los mensajes de error libavformat fuera

Estimating duration from bitrate, this may be inaccurate

¿Cómo puedo desactivarlo? o mejor aún, conectarlo a mi propia función de registro limpio?

Editar: redireccionante stderr a otro lugar no es aceptable ya que lo necesito para otros propósitos de registro, sólo quiero libavformat a no escribir en él.

+0

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

+0

No quiero redirigir toda la salida de stderr del programa, tengo mis funciones de registro escritas de forma ordenada. Me gustaría simplemente libavformat para no escribir en él. – amrhassan

+0

¿Qué escribe exactamente en stderr? Esta es la primera vez que escucho que la biblioteca libavcodec envía errores a stderr (mi experiencia con esa biblioteca no es grande). –

Respuesta

7

Mirando el código, parece que puede cambiar el comportamiento escribiendo su propia función de devolución de llamada para la función av_log.

partir de la descripción de esta función en libavutil/log.h:

Envía el mensaje especificado en el registro si el nivel es menor o igual a la av_log_level actual. De forma predeterminada, todos los mensajes de registro se envían a stderr. Este comportamiento se puede modificar estableciendo una función de devolución de llamada av_vlog diferente.

La API proporciona una función que le permitirá definir su propia devolución de llamada:

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

En su caso, se podría escribir una función de devolución de llamada simple que descarta los mensajes en total (o los redirige a un registro dedicado, etc.) sin contaminar su secuencia stderr.

+6

Pegúenme a eso.También puede usar 'av_log_set_level (AV_LOG_QUIET)' para silenciar todo el registro. –

1

Puede redirigir a un archivo personalizado, volverá a dirigir todas las entradas 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; 
} 

Editar: Después de editar la pregunta, advierten sobre el código de seguridad que va a redirigir todo cerr entrada corriente a file.txt

No estoy familiarizado con libavformat, pero si su código no se puede cambiar, puede redirigir temporalmente cerr a un archivo antes de llamar a la API de la biblioteca y redirigirla al original cerr otra vez. (Sin embargo, esta es la manera fea)

+0

... y todos los demás mensajes 'cerr'. No creo que eso sea lo que OP quería. –

+0

Actualicé mi respuesta y me di cuenta al respecto. gracias. –

5

Give av_log_set_level(level) un intento!

Cuestiones relacionadas