2011-10-16 25 views
8

kapalı libavformat hata iletileri açabilirsiniz, libavformat gibi, stderr için hata mesajları yazıyor? ya da daha iyisi, kendi düzgün kayıt fonksiyonuna yolladım mı?nasıl Varsayılan olarak

Düzenleme: Stderr'i başka bir yere yeniden yönlendirmek, diğer günlüğe kaydetme amaçları için gerektiğinden kabul edilemez, sadece libavformat'ın yazmasını istemiyorum.

#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; 
} 

Düzenleme:: soruyu düzenlemeye i yukarıdaki kodu hakkında uyarmak sonra tüm cerr girişi yönlendirir Özel bir dosyaya yönlendirebilirsiniz

+0

http://stackoverflow.com/questions/5095839/redirect-from-stderr-to-another-file-descriptor veya http://stackoverflow.com/questions/573724/how-can-i-redirect adresine bakın. -görünüm-için-ekran-in-bir-pencere-uygulama- –

+0

Ben programın stderr tüm çıktı yeniden yönlendirmek istemiyorum, benim günlük fonksiyonları yazma düzgün biçimlendirilmiş bir şekilde var. Sadece libavformat’ın yazmamasını isterim. – amrhassan

+0

Stderr'e tam olarak ne yazıyor? Bu libavcodec kütüphanesi hatalarını stderr'e gönderdiğimi ilk defa duyduğum (bu kitaplıktaki deneyimim büyük değil). –

cevap

7

Kodu incelediğinizde, davranışı av_log işlevi için kendi geriçağırım işlevinizi yazarak değiştirebilirsiniz. Bu fonksiyonun açıklamasından

libavutil/log.h yılında: seviyeli akım av_log_level için eşit veya daha az olması durumunda

günlüğüne belirtilen mesaj gönder. Varsayılan olarak, tüm günlük iletileri stderr'e gönderilir. Bu davranış, farklı bir av_vlog geri arama işlevini ayarlayarak değiştirilebilir.

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

, tümüyle mesajlar atar (ya bunları yönlendiren basit geri çağırma işlevi yazabilirsiniz:

API kendi geri arama tanımlamak sağlayacak bir işlev sağlar stderr akışınızı kaydetmeden özel bir günlük vb.

+6

Bana onu yendi.Tüm oturumları kapatmak için 'av_log_set_level (AV_LOG_QUIET)' özelliğini de kullanabilirsiniz. –

1

, tüm CERR girişini yönlendirir akış için file.txt

Libavformat'a aşina değilim, ancak kodu değiştirilemezse, kitaplığın api'sini aramadan ve orijinal 012'ye yeniden yönlendirmeden önce bir dosyaya cerr'u geçici olarak yeniden yönlendirebilirsiniztekrar. (Ancak bu çirkin bir yöntemdir)

+0

... ve diğer tüm "cerr" iletilerini. OP'nin istediği bu sanmıyorum. –

+0

Cevabımı güncelledim ve fark ettim. teşekkür ederim. –

5

av_log_set_level(level)'u deneyin!

İlgili konular