FFMPEG 로깅을 활성화하려면 어떻게하고 FFMPEG 로그 파일을 어디서 찾을 수 있습니까?

StackOverflow https://stackoverflow.com/questions/2066076

문제

비디오 인코딩 서버의 용량 계획에 도움이되기 위해 1 분의 비디오가 얼마나 오래 걸리는지 알아 내려고하기 때문에 FFMPEG 프로세스를 기록하고 싶습니다. 로깅을 활성화하는 방법과 로그 파일은 어디에 저장됩니까? Centos 램프 머신에 FFMPEG가 설치되어 있습니다.

도움이 되었습니까?

해결책

FFMPEG는 특정 로그 파일에 쓰지 않고 출력을 다음으로 보냅니다. 표준 에러. 그것을 포착하려면, 당신도 필요합니다

  • 생성 될 때 캡처하고 구문 분석하십시오
  • 표준 오류를 파일로 리디렉션하고 나중에 프로세스가 완료되었음을 읽었습니다.

STD 오류 리디렉션의 예 :

ffmpeg -i myinput.avi {a-bunch-of-important-params} out.flv 2> /path/to/out.txt

프로세스가 완료되면 검사 할 수 있습니다 out.txt.

첫 번째 옵션을 수행하는 것은 약간 까다 롭지 만 가능합니다. (나는 직접 해냈습니다. 그래서 다른 사람들이 있습니다. 주변을 둘러보고 세부 사항을 찾으십시오.)

다른 팁

FFMPEG 문서에서 아래의 내용을 찾았습니다. 도움이 되었기를 바랍니다! :)

참조: http://ffmpeg.org/ffmpeg.html#toc-generic-options

'-보고서'덤프 전체 명령 줄 및 콘솔 출력은 현재 디렉토리의 program-yyyymmdd-hhmmss.log라는 파일에 대한 콘솔 출력입니다. 이 파일은 버그 보고서에 유용 할 수 있습니다. 또한 -loglevel verbose를 의미합니다.

참고 : 환경 변수 ffreport를 값으로 설정하면 동일한 효과가 있습니다.

답을 찾습니다. 1/먼저 사전 설정을 넣으 면서이 예제 "출력 형식 MPEG2 DVD HQ"가 있습니다.

-vcodec mpeg2video -vstats_file MFRfile.txt -r 29.97 -s 352x480 -aspect 4:3 -b 4000k -mbd rd -trellis -mv0 -cmp 2 -subcmp 2 -acodec mp2 -ab 192k -ar 48000 -ac 2

보고서를 원하는 경우 예제와 같은 사전 설정에 -vstats_file mfrfile.txt 명령이 포함되어 있습니다. 이렇게하면 파일 소스의 폴더 소스에서 Ubicadet 인 보고서를 작성할 수 있습니다. 원한다면 이름을 넣을 수 있습니다. "이 포럼에서 여러 번 쓴다"는 MPEG 속성에 대한 완전한 .docx를 읽었습니다. 마지막 으로이 txt 파일을 읽는 진전 바를 수행 할 수 있습니다.

문안 인사.

명령 줄에 이것을 추가하면 다음과 같이 나타납니다.

 -loglevel debug

또는

 -loglevel verbose

명령 줄에 더 많은 장황 디버깅 출력을 얻을 수 있습니다.

FFMPEG는 STDERR에 로그인하고 STDERR과 다른 로그 레벨을 가진 파일에 로그인 할 수 있습니다. 그만큼 -report 명령 줄 옵션은 로그 파일 이름 또는 로그 레벨을 제어하지 않으므로 환경 변수를 설정하는 것이 바람직합니다.

(-v 동의어입니다 -loglevel. 운영 ffmpeg -v help 레벨을보기 위해. 운영 ffmpeg -h full | less 모든 것을보기 위해. 또는 상담하십시오 온라인 문서, 또는 그들의 위키 페이지와 같은 H.264 엔코드 가이드).

#!/bin/bash

of=out.mkv
FFREPORT="level=32:file=$of.log" ffmpeg -v verbose   -i src.mp4 -c:a copy -preset slower -c:v libx264 -crf 21 "$of"

그것은 트랜스 코드입니다 src.mp4 x264를 사용하고 Stderr의 로그 레벨을 "Verbose"로 설정하고 로그 레벨을 설정했습니다. out.mkv.log "상태"로.

(AV_LOG_WARNING=24, AV_LOG_INFO=32, AV_LOG_VERBOSE=40, 등.). 이것에 대한 지원이었다 2 년 전에 추가되었습니다, 당신은 ffmpeg의 비 항목 버전이 필요합니다. (어쨌든 항상 좋은 아이디어, 보안 / 버그 픽스 및 속도를 높이기 위해)


몇 가지 코덱과 같습니다 -c:v libx265, FFMPEG의 로깅 인프라를 사용하는 대신 stderr에 직접 작성하십시오. 따라서 로그 메시지는 보고서 파일에서 끝나지 않습니다. 나는 이것이 버그 / TODO-LIST 항목이라고 가정합니다.

Stderr를 로그인하려면 여전히 터미널에서 볼 수 있지만 사용할 수 있습니다. tee(1).


상태 라인 업데이트가 포함 된 로그 레벨을 사용하는 경우 (기본값 -v info, 또는 그 이상), 그들은 로그 파일에 포함됩니다. ^M (캐리지 리턴 일명 \r). 인코더 통계 (예 : SSIM)를 포함하는 로그 레벨은 없지만 상태 라인 업데이트는 없으므로 가장 좋은 옵션은 해당 스트림을 필터링하는 것입니다.

필터를 필터하고 싶지 않은 경우 (예 : 각 상태 업데이트 간격의 FPS / 비트 레이트가 파일에 있습니다), 사용할 수 있습니다. less -r 터미널로 직접 전달하려면 파일을 깨끗하게 볼 수 있습니다. 당신이 가지고 있다면 .enc 뒤집을 수있는 여러 인코딩에서 로그를 작성하고 less -r ++G *.enc 잘 작동합니다. (++ g는 모든 파일에 대해 파일 끝에서 시작하는 것을 의미합니다). 와 함께 단일 키 키 바인딩 처럼 . 그리고 , 다음 파일과 이전 파일의 경우 일부 로그 파일을 매우 멋지게 뒤집을 수 있습니다. (기본 바인딩은입니다 :n 그리고 :p).

필터링하고 싶다면 sed 's/.*\r//' FFMPEG 출력에 완벽하게 작동합니다. (일반적인 경우에는 무언가가 필요합니다 처럼 vt100.py, 운송 수익률 만 사용하는 것은 아닙니다). tee + sed로 이것을하는 두 가지 방법이 있습니다. tee /dev /tty 및 파이프 티의 SED 출력 또는 공정 대체를 사용하여 TEE를 파이프로 SED로 사용합니다.

# pass stdout and stderr through to the terminal, 
## and log a filtered version to a file (with only the last status-line update).

of="$1-x265.mkv"
ffmpeg -v info -i "$1" -c:a copy -c:v libx265 ... "$of" |&    # pipe stdout and stderr
   tee /dev/tty | sed 's/.*\r//' >> "$of.enc"

## or with process substitution where tee's arg will be something like /dev/fd/123

ffmpeg -v info -i "$1" -c:a copy -c:v libx265 ... "$of" |&
  tee >(sed 's/.*\r//' >> "$of.enc")

몇 가지 다른 인코딩 매개 변수를 테스트하려면 기능을 수행 할 수 있습니다. 내가 최근에 사용했던 것과 마찬가지로 일부 물건을 테스트했습니다. 나는 한 줄에 모든 것을 가지고 있었기 때문에 쉽게 화를 내고 편집 할 수 있었지만 여기서는 그것을 흡수하지 않을 것입니다. (그래서 그 이유입니다 ;각 줄의 끝에서)

ffenc-testclip(){
  # v should be set by the caller, to a vertical resolution.  We scale to WxH, where W is a multiple of 8 (-vf scale=-8:$v)
  db=0;   # convenient to use shell vars to encode settings that you want to include in the filename and the ffmpeg cmdline
  of=25s@21.15.${v}p.x265$pre.mkv; 
  [[ -e "$of.enc" ]]&&echo "$of.enc exists"&&return;   # early-out if the file exists

  # encode 25 seconds starting at 21m15s (or the keyframe before that)
  nice -14 ffmpeg -ss $((21*60+15))  -i src.mp4 -t 25  -map 0 -metadata title= -color_primaries bt709 -color_trc bt709 -colorspace bt709 -sws_flags lanczos+print_info -c:a copy -c:v libx265 -b:v 1500k -vf scale=-8:$v  -preset $pre -ssim 1 -x265-params ssim=1:cu-stats=1:deblock=$db:aq-mode=1:lookahead-slices=0 "$of" |&
   tee /dev/tty | sed 's/.*\r//' >> "$of.enc";
}

# and use it with nested loops like this.
for pre in fast slow;  do for v in  360 480 648 792;do  ffenc-testclip ;done;done

less -r ++G *.enc       # -r is useful if you didn't use sed

이미 존재하는 경우 로그 파일에 여분의 쓰레기를 분출하지 않도록 출력 비디오 파일의 존재를 테스트합니다. 그럼에도 불구하고 나는 사용하고 추가합니다 (>>) 리디렉션.

쉘 변수를 보는 대신 args를 취한 쉘 함수를 작성하는 것은 "클리너"이지만, 이는 내 자신의 용도로 편리하고 편리하게 작성하기 쉽습니다. 그렇기 때문에 모든 가변 확장을 제대로 인용하여 공간을 절약 한 이유이기도합니다. ($v 대신에 "$v")

reportfile을 콘솔의 변수로 선언해야합니다.

문제는 당신이 찾을 수있는 모든 점검이 실행되지 않는다는 것입니다.

예 : 배치/콘솔 용

cmd.exe /k set ffreport = file = 'c : ffmpeg proto test.log': level = 32 && c : ffmpeg bin ffmpeg.exe -loglevel 경고 -i inputfile f outputfile

예상 자바 스크립트 :

var reortlogfile = "cmd.exe /k set ffreport = file = 'c : ffmpeg proto " + filename + ".log': level = 32 && c : ffmpeg bin ffmpeg.exe".... ...;

당신은 당신이 원하는 방식으로 Dir와 Filename을 변경할 수 있습니다.

베를린의 프랭크

명령이 실행하는 데 걸리는 시간을 알고 싶다면 사용을 고려할 수 있습니다. 시각 명령. 당신은 예를 들어 사용합니다 time ffmpeg -i myvideoofoneminute.aformat out.anotherformat

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top