2011-10-16 15 views
8

डिफ़ॉल्ट रूप से बंद libavformat त्रुटि संदेश बदल सकते हैं, libavformat, stderr को त्रुटि संदेश लिखते हैं जैसा:मैं कैसे

Estimating duration from bitrate, this may be inaccurate

मैं इसे कैसे बंद कर सकते हैं? या बेहतर अभी तक, इसे अपने स्वयं के साफ लॉगिंग समारोह में पाइप करें?

संपादित करें: किसी अन्य जगह पर stderr को पुनर्निर्देशित करना स्वीकार्य नहीं है क्योंकि मुझे अन्य लॉगिंग उद्देश्यों के लिए इसकी आवश्यकता है, मैं सिर्फ libavformat को लिखने के लिए नहीं चाहता हूं।

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

संपादित करें:: के बाद सवाल संपादन, मैं ऊपर कोड के बारे में चेतावनी दी है कि यह सब cerr प्रविष्टि रीडायरेक्ट करेगा

+0

या तो http://stackoverflow.com/questions/5095839/redirect-from-stderr-to-another-file-descriptor या http://stackoverflow.com/questions/573724/how-can-i-redirect देखें -स्ट-आउट-टू-कुछ-दृश्य-डिस्प्ले-इन-ए-विंडोज-एप्लिकेशन –

+0

मैं प्रोग्राम के stderr के पूरे आउटपुट को रीडायरेक्ट नहीं करना चाहता हूं, मेरे पास लॉगिंग फ़ंक्शंस इसे एक साफ स्वरूपित तरीके से लिख रहा है। मैं libavformat बस इसे लिखने के लिए पसंद करेंगे। – amrhassan

+0

क्या वास्तव में stderr लिखता है? यह पहली बार है जब मैंने सुना है कि libavcodec लाइब्रेरी stderr में त्रुटियां भेजती है (उस लाइब्रेरी के साथ मेरा अनुभव बड़ा नहीं है)। –

उत्तर

7

कोड के माध्यम से देखकर, ऐसा लगता है कि आप av_log फ़ंक्शन के लिए अपना स्वयं का कॉलबैक फ़ंक्शन लिखकर व्यवहार बदल सकते हैं।

इस समारोह का वर्णन से libavutil/log.h में:

लॉग करने के लिए निर्दिष्ट संदेश भेजें अगर स्तर से कम या बराबर वर्तमान av_log_level है। डिफ़ॉल्ट रूप से, सभी लॉगिंग संदेश stderr पर भेजे जाते हैं। इस व्यवहार को एक अलग av_vlog कॉलबैक फ़ंक्शन सेट करके बदला जा सकता है।

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

आपके मामले में, आप एक सरल कॉलबैक समारोह है कि संदेशों को पूरी तरह से (को छोड़ देता है या करने के लिए उन्हें पुनर्निर्देश लिख सकते हैं:

एपीआई एक समारोह है कि आप अपने खुद के कॉलबैक को परिभाषित करने की अनुमति देगा प्रदान करता है एक समर्पित लॉग, इत्यादि) आपके stderr स्ट्रीम को बिना टैन किए।

+6

मुझे इसे मारो।आप सभी लॉगिंग को शांत करने के लिए 'av_log_set_level (AV_LOG_QUIET) 'का भी उपयोग कर सकते हैं। –

1

आप एक कस्टम फाइल करने के लिए उन्हें अनुप्रेषित कर सकते हैं, यह सब cerr प्रविष्टि रीडायरेक्ट करेगा file.txt

को धारा मैं libavformat से परिचित नहीं हूँ, लेकिन अगर इसके कोड अपरिवर्तनीय है, तो आप एक फाइल करने के लिए अस्थायी रीडायरेक्ट cerr पुस्तकालय के एपीआई कॉल करने से पहले और यह मूल 012 रीडायरेक्ट कर सकते हैंफिर से। (हालांकि यह बदसूरत तरीका है)

+0

... और अन्य सभी 'cerr' संदेश। मुझे नहीं लगता कि ओपी क्या चाहता था। –

+0

मैंने अपना जवाब अपडेट किया, और इसके बारे में देखा। धन्यवाद। –

5

av_log_set_level(level) एक कोशिश करें!