2011-10-16 27 views
8

Theo mặc định, libavformat viết các thông báo lỗi để stderr, Giống như:Làm thế nào tôi có thể biến các thông báo lỗi libavformat tắt

Estimating duration from bitrate, this may be inaccurate

Làm thế nào tôi có thể tắt nó đi? hoặc tốt hơn, ống nó vào chức năng đăng nhập gọn gàng của riêng tôi?

Chỉnh sửa: Chuyển hướng stderr đến một nơi khác không được chấp nhận vì tôi cần nó cho mục đích ghi nhật ký khác, tôi chỉ muốn libavformat không ghi vào đó.

+0

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

+0

Tôi không muốn chuyển hướng toàn bộ đầu ra của stderr của chương trình, tôi có chức năng ghi nhật ký của tôi bằng văn bản cho nó theo cách được định dạng gọn gàng. Tôi chỉ muốn libavformat không viết cho nó. – amrhassan

+0

Chính xác những gì viết cho stderr? Đây là lần đầu tiên tôi nghe thư viện libavcodec gửi lỗi tới stderr (trải nghiệm của tôi với thư viện đó không lớn). –

Trả lời

7

Nhìn qua mã, có vẻ như bạn có thể thay đổi hành vi bằng cách viết hàm gọi lại của riêng bạn cho hàm av_log.

Từ các mô tả về chức năng này trong libavutil/log.h:

Gửi thông điệp cụ thể để đăng nhập nếu mức là nhỏ hơn hoặc bằng đến av_log_level hiện hành. Theo mặc định, tất cả thư đăng nhập được gửi đến stderr. Hành vi này có thể được thay đổi bằng cách đặt chức năng gọi lại khác là av_vlog .

API cung cấp một chức năng mà sẽ cho phép bạn xác định callback của riêng bạn:

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

Trong trường hợp của bạn, bạn có thể viết một hàm callback đơn giản mà loại bỏ những thông điệp hoàn toàn (hoặc chuyển hướng họ nhật ký chuyên dụng, v.v.) mà không làm mờ luồng stderr của bạn.

+6

Đánh tôi với nó.Bạn cũng có thể sử dụng 'av_log_set_level (AV_LOG_QUIET)' để tắt tất cả ghi nhật ký. –

1

Bạn có thể chuyển hướng chúng vào một tập tin tùy chỉnh, nó sẽ chuyển hướng tất cả entry 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: Sau khi chỉnh sửa câu hỏi, tôi cảnh báo về mã trên rằng nó sẽ chuyển hướng tất cả cerr nhập stream to file.txt

Tôi không quen với libavformat, nhưng nếu mã của nó không thể thay đổi, bạn có thể tạm thời chuyển hướng cerr tới tệp trước khi gọi api của thư viện và chuyển hướng nó đến bản gốc cerr một lần nữa. (Tuy nhiên đây là cách xấu xí)

+0

... và tất cả các thư 'cerr' khác. Tôi không nghĩ đó là những gì OP muốn. –

+0

Tôi đã cập nhật câu trả lời của mình và chú ý đến nó. cảm ơn bạn. –

5

Tặng av_log_set_level(level) một lần thử!

Các vấn đề liên quan