2011-10-16 11 views
8

Domyślnie muxera zapisuje komunikaty o błędach stderr, jak:Jak mogę wyłączyć komunikaty o błędach libavformat off

Estimating duration from bitrate, this may be inaccurate

Jak mogę to wyłączyć? a może jeszcze lepiej, przeprowadź to do mojej własnej zgrabnej funkcji logowania?

Edit: Przekierowywanie stderr gdzieś indziej jest nie do przyjęcia, ponieważ muszę go do innych celów rejestrowania, po prostu chcę muxera aby nie pisać do niego.

+0

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

+0

Nie chcę przekierowywać całego wyjścia stderr programu, mam swoje funkcje zapisu zapisujące do niego w schludnie sformatowany sposób. Po prostu lubię libavformat, aby do niego nie pisać. – amrhassan

+0

Co dokładnie pisze na stderr? Jest to pierwszy raz, kiedy słyszę, że biblioteka libavcodec wysyła błędy na stderr (moje doświadczenie z tą biblioteką nie jest duże). –

Odpowiedz

7

Przeglądając kod, wydaje się, że można zmienić zachowanie, pisząc własną funkcję zwrotną dla funkcji av_log.

Z opisu tej funkcji w libavutil/log.h:

Wyślij określony komunikat w dzienniku, jeśli poziom jest mniejszy lub równy do bieżącego av_log_level. Domyślnie wszystkie komunikaty rejestrowania są wysyłane do stderr. To zachowanie można zmienić, ustawiając inną funkcję oddzwonienia av_vlog .

API oferuje funkcję, która pozwoli Ci zdefiniować własną callback:

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

W Twoim przypadku można napisać prostą funkcję wywołania zwrotnego, która odrzuca Łącznie wiadomości (lub przekierowuje je do dedykowany dziennik itd.) bez zanieczyszczania strumienia stderr.

+6

Pokonaj mnie.Możesz także użyć 'av_log_set_level (AV_LOG_QUIET)', aby wyciszyć całe rejestrowanie. –

1

można przekierować je do pliku niestandardowego będzie przekierować cały wpis 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: Po edycji pytanie, i ostrzec o powyższym kodem, który będzie przekierować wszystkie wejścia cerr strumień do file.txt

nie jestem zaznajomiony z libavformat, ale jeżeli jej kod jest niezmienny, można tymczasowe przekierowanie cerr do pliku przed wywołaniem API biblioteki i przekierować go do oryginalnej cerr ponownie. (To jest brzydki sposób)

+0

... i wszystkie inne komunikaty 'cerr'. Nie sądzę, że tego właśnie chciał OP. –

+0

Zaktualizowałem moją odpowiedź i zauważyłem o tym. Dziękuję Ci. –

5

Wypróbuj av_log_set_level(level) spróbuj!

Powiązane problemy