2011-10-16 7 views
8

떨어져 libavformat 오류 메시지를 설정할 수 있습니다, libavformat 체감, stderr에 오류 메시지를 기록? 또는 더 나은 아직 파이프, 내 자신의 산뜻한 로깅 기능?가 어떻게 기본적으로

편집 : 다른 로깅 목적으로 필요하기 때문에 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를 참조하십시오. -stdout-to-some-visible-in-a-windows-applications –

+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)); 

, 당신은 완전히 메시지를 삭제 (또는로 리디렉션 간단한 콜백 함수를 작성할 수

이 API는 당신이 당신의 자신의 콜백을 정의 할 수있는 기능을 제공한다 전용 로그 등)에 액세스 할 수 있습니다. stderr 스트림.

+6

나를 이길.또한'av_log_set_level (AV_LOG_QUIET)'를 사용하여 모든 로깅을 중지 할 수 있습니다. –

1

, 는 모든 cerr 항목를 리디렉션합니다 stream to file.txt

libavformat에 익숙하지 않지만 코드를 변경할 수없는 경우 cerr을 파일로 리디렉션하여 라이브러리 api를 호출하고 원래 012로 리디렉션 할 수 있습니다.다시.

+0

... 그리고 다른 모든 'cerr'메시지. 나는 그것이 OP가 원했던 것이라고 생각하지 않는다. –

+0

나는 나의 대답을 업데이트하고 그것에 대해 주목했다. 고맙습니다. –

5

av_log_set_level(level) 시도하십시오!