2010-01-14 1452 views

回答

23

FFmpeg不寫入特定的日誌文件,而是將其輸出發送到standard error。爲了捕捉這一點,你需要或者

  • 捕獲並分析它,因爲它會產生
  • 標準錯誤重定向到文件和讀取STD錯誤重定向這樣以後過程結束

例:

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

一旦這個過程完成後,你可以檢查out.txt

做第一個選項有點麻煩,但這是可能的。 (我已經做到了我自己。所以有別人。有一個走一走,看一看,淨瞭解詳情。)

+0

儘管ffmpeg可能不提供寫日誌文件的選項,但根據您的編解碼器和選項,編碼器將創建日誌。這可能是非常具有破壞性的,因爲它被寫入執行的地方,這可能導致許可問題。在我的例子中,這是** PHP **和使用'-pass 1/2'的問題。 – cregox 2010-04-08 16:22:56

+1

@Stu Thompson,這裏的問題是當ffmpeg沒有從控制檯運行,但以編程方式執行(它檢查它是否是TTY)時,ffmpeg不會生成正常的調試輸出到stderr。 – Tom 2011-07-15 13:11:55

+0

@Tom:我沒有這個問題,我的Java代碼以編程方式調用FFmpeg沒有問題。我不是唯一的。 – 2012-05-19 06:52:06

0

如果你只是想知道需要多長時間要執行的命令,你可以考慮使用time命令。你例如使用time ffmpeg -i myvideoofoneminute.aformat out.anotherformat

6

我找到答案。 1 /首先放在預設,如果你想有一個報告包括-vstats_file MFRfile.txt命令到像例子中的預置我有這樣的例子「輸出格式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 

。這可以生成一個報告,它是您的文件源的文件夾源中的ubicadet。 如果你願意,你可以放任何名字,我解決了我的問題「我在這個論壇上多次寫道」閱讀關於mpeg屬性的完整的.docx。最後,我可以做我的進度條讀取生成的這個txt文件。

問候。

+0

+1進度條 – 2012-06-17 19:28:32

15

我在ffmpeg Docs中找到了下面的東西。希望這可以幫助! :)

參考:http://ffmpeg.org/ffmpeg.html#toc-Generic-options

「-report」完整的命令行和控制檯輸出轉儲到一個名爲 程序YYYYMMDD-HHMMSS.log在當前目錄下的文件。這個文件可以是 用於錯誤報告。它也意味着-loglevel冗長。

注意:將環境變量FFREPORT設置爲任何值都具有 相同的效果。

+2

這些天出現FFREPORT也可以指定一個輸出文件名,參見http://stackoverflow.com/questions/11241878/ffmpeg-report-generation/14417386#14417386也注意指定「-report」自動設置日誌記錄我相信,詳細模式。 – rogerdpack 2013-01-19 18:26:20

+0

您可以使用-report並更改日誌級別進行調試嗎? – MarcusJ 2014-10-30 10:27:39

+0

@MarcusJ:是的,使用'of = out.mkv; FFREPORT =「level = 32:file = $ of.log」ffmpeg -v verbose ...「$ of」'將stderr的日誌級別設置爲「詳細」,以及「out.mkv.log」的日誌級別到「地位」。 ('AV_LOG_WARNING = 24','AV_LOG_INFO = 32','AV_LOG_VERBOSE = 40')。對此的支持[在2年前添加](https://trac.ffmpeg。org/ticket/3057#comment:5),所以你需要一個非古老版本的ffmpeg。 – 2016-07-18 06:12:56

3

看來,如果你將其添加到命令行:

-loglevel debug 

-loglevel verbose 

你得到更詳細的調試輸出到命令行。

0

您必須將reportfile聲明爲控制檯的變量。

問題是所有的Dokumentations你可以找到不運行,所以.. 我給1天我的生活,找到正確的方式....

示例:批/控制檯

cmd.exe/K set FFREPORT = file ='C:\ ffmpeg \ proto \ test.log':level = 32 & & C:\ ffmpeg \ bin \ ffmpeg.exe -loglevel警告-report -i輸入文件f輸出文件

示例Javascript:

var reortlogfile =「cmd.exe/K set FFREPORT = file ='C:\ ffmpeg \ proto \」+ filename +「.log」:level = 32 & & C:\ ffmpeg \ bin \ ffmpeg.exe「.. .....;

你可以改變目錄和文件名你想要的。

弗蘭克從柏林

2

ffmpeg的日誌標準錯誤,並能記錄到文件與標準錯誤一個不同的日誌級別。 -report命令行選項不支持您控制日誌文件名或日誌級別,因此設置環境變量是可取的。

-v-loglevel的代名詞。運行ffmpeg -v help看到的水平。運行ffmpeg -h full | less看到的一切,或者諮詢online docs,或它們的wiki頁面一樣the h.264 encode guide)。

#!/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" 

這將TRANCODE src.mp4與X264,並設置日誌級別爲標準錯誤,以「詳細」,併爲out.mkv.log到「地位」的日誌級別。

AV_LOG_WARNING=24,AV_LOG_INFO=32AV_LOG_VERBOSE=40等)。對此的支持是added 2 years ago,所以你需要一個非古老版本的ffmpeg。 (總是一個好主意,無論如何,安全/錯誤修正和加速比)


一些編解碼器,像-c:v libx265,直接寫而不是標準錯誤使用FFmpeg的日誌基礎設施。所以他們的日誌消息不會在報告文件中結束。我認爲這是一個bug/TODO列表項。

要記錄stderr,但仍然在終端中看到它,可以使用tee(1)


如果使用包括狀態更新行(默認-v info,或更高)的日誌級別,它們將被包括在日誌文件中,^M(回車又名\r)分離。沒有包含編碼器統計信息(如SSIM)的日誌級別,但沒有狀態行更新,因此最佳選擇可能是過濾該流。

如果不想過濾(例如,因此每個狀態更新間隔的fps/bitrate位於文件中),您可以使用less -r將它們直接傳遞到您的終端,以便您可以乾淨地查看文件。如果您有幾個要翻轉的編碼的.enc日誌,less -r ++G *.enc效果很好。 (++ G表示從文件末尾開始,對於所有文件)。使用single-key key bindings(如.,)可以很好地翻閱一些日誌文件。 (默認綁定爲:n:p)。

如果你想過濾,sed 's/.*\r//'完美適用於ffmpeg輸出。 (在一般情況下,您需要like vt100.py,但不能用於回車)。至少有兩種方法可以通過tee + sed執行:tee到/ dev/tty,以及將tee的輸出轉換爲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") 

爲了測試幾個不同的編碼參數,你可以像這樣的,我用最近測試一些東西的功能。我把它全部放在一行中,這樣我就可以輕鬆地向上箭頭並編輯它,但我會在這裏解開它。 (這就是爲什麼有每行的末尾是; S)

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 
    [email protected]${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 

注意,它會檢測輸出的視頻文件,以避免額外噴涌垃圾到日誌文件,如果它已經存在的存在。即使如此,我使用並追加(>>)重定向。

編寫一個帶參數而不是查看shell變量的shell函數會更「乾淨」,但這很方便且容易編寫,供我自己使用。這也是爲什麼我通過沒有正確引用所有變量擴展來節省空間的原因。 ($v而不是"$v"

相關問題