2010-01-14 14 views
24

मैं एफएफएमपीईजी प्रक्रियाओं को लॉग इन करने में सक्षम होना चाहता हूं क्योंकि मैं काम करने की कोशिश कर रहा हूं कि मेरे वीडियो एन्कोडिंग सर्वर की क्षमता योजना के साथ वीडियो में कितना समय लगता है। मैं लॉगिंग कैसे सक्षम करूं और लॉग फ़ाइल कहां सहेजी गई है। मेरे पास एक CentOS LAMP मशीन पर FFMPEG स्थापित है।मैं एफएफएमपीईजी लॉगिंग कैसे सक्षम करूं और मुझे एफएफएमपीईजी लॉग फ़ाइल कहां मिल सकती है?

उत्तर

23

FFmpeg एक विशिष्ट लॉग फ़ाइल पर नहीं लिखता है, बल्कि इसके आउटपुट को standard error पर भेजता है। कि कब्जा करने के लिए, आप के लिए या तो

  • कब्जा की जरूरत है और यह पार्स के रूप में यह उत्पन्न होता है
  • एक फाइल करने के लिए मानक त्रुटि अनुप्रेषित और पढ़ा है कि बाद में प्रक्रिया समाप्त होने

मानक त्रुटि पुनर्निर्देशन के लिए उदाहरण :

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

+1

@Stu थॉम्पसन, समस्या यह है कि ffmpeg stderr करने के लिए जब ffmpeg एक कंसोल से नहीं चला है, लेकिन प्रोग्राम के मार डाला (यह जाँच करता है कि क्या यह एक TTY है) सामान्य डिबग आउटपुट का उत्पादन नहीं करता है। – Tom

+0

@ टॉम: मुझे यह समस्या नहीं है, मेरा जावा कोड प्रोग्रामिंग रूप से एफएफएमपीईजी को बिना किसी समस्या के कहते हैं। और मैं अकेला नहीं हूँ। –

0

यदि आप सिर्फ यह जानना चाहते हैं कि आदेश को निष्पादित करने में कितना समय लगता है, तो आप time का उपयोग करने पर विचार कर सकते हैं आदेश। उदाहरण के लिए आप time ffmpeg -i myvideoofoneminute.aformat out.anotherformat

6

का उपयोग करें मुझे उत्तर मिल गया। 1/प्रथम प्रीसेट में डाल दिया, मैं इस उदाहरण "आउटपुट प्रारूप MPEG2 डीवीडी मुख्यालय"

-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 

है यदि आप चाहते हैं एक रिपोर्ट MFRfile.txt -vstats_file आदेशों के उदाहरण की तरह प्रीसेट में भी शामिल है। यह एक रिपोर्ट कर सकता है जो आपकी फाइल स्रोत के फ़ोल्डर स्रोत में यूबिकैडेट है। यदि आप चाहें तो आप कोई भी नाम डाल सकते हैं, मैंने अपनी समस्या हल की "मैं इस मंच में कई बार लिखता हूं" एमपीईजी गुणों के बारे में एक पूर्ण .docx पढ़ना। आखिर में मैं अपनी प्रगति पट्टी जेनरेट कर इस txt फ़ाइल को पढ़ सकता हूं।

सम्मान।

+0

+1 प्रगति पट्टी –

15

मुझे नीचे दिए गए सामान ffmpeg डॉक्स में मिला। उम्मीद है की यह मदद करेगा! :)

संदर्भ: http://ffmpeg.org/ffmpeg.html#toc-Generic-options

'-report' मौजूदा निर्देशिका में कार्यक्रम-YYYYMMDD-HHMMSS.log नाम की एक फ़ाइल के लिए पूर्ण आदेश पंक्ति और सांत्वना उत्पादन डंप। यह फ़ाइल बग रिपोर्ट के लिए उपयोगी हो सकती है। यह भी इंगित करता है -लोगेलवेल वर्बोज़।

नोट: किसी भी मान पर पर्यावरण चर FFREPORT को सेट करना समान प्रभाव है।

+2

इन दिनों प्रकट होता है FFREPORT एक आउटपुट फ़ाइल नाम भी निर्दिष्ट कर सकता है, http://stackoverflow.com/questions/11241878/ffmpeg-report-generation/14417386#14417386 भी एनबी निर्दिष्ट करता है जो "रिपोर्ट" स्वचालित रूप से लॉगिंग सेट करता है वर्बोज़ मोड के लिए, मुझे विश्वास है। – rogerdpack

+0

क्या आप डीगल करने के लिए loglevel को रिपोर्ट और बदल सकते हैं? – MarcusJ

+0

@MarcusJ: हां, 'of = out.mkv का उपयोग करें; FFREPORT = "level = 32: file = $ of.log" ffmpeg -v verbose ... "$" का "stderr" के लिए लॉग स्तर सेट करने के लिए "verbose", और 'out.mkv.log' के लिए लॉग स्तर सेट करें "स्थिति" के लिए। ('AV_LOG_WARNING = 24',' AV_LOG_INFO = 32', 'AV_LOG_VERBOSE = 40')। इसके लिए समर्थन [2 साल पहले जोड़ा गया था] (https: //trac.ffmpeg।संगठन/टिकट/3057 # टिप्पणी: 5), तो आपको ffmpeg का एक गैर-प्राचीन संस्करण चाहिए। –

3

प्रतीत होता है कि अगर आप कमांड लाइन से जोड़ें:

-loglevel debug 

या

-loglevel verbose 

आप कमांड लाइन के लिए और अधिक वर्बोज़ डिबगिंग आउटपुट मिलता है।

0

आपको रिपोर्टफाइल को कंसोल के लिए चर के रूप में घोषित करना होगा।

समस्या है सभी Dokumentations आप ऐसा नहीं चल रहे हैं पा सकते हैं .. मैं 1 दिन देना था मेरी सही तरीके से ....

उदाहरण खोजने के लिए लाइव: बैच के लिए/कंसोल

cmd.exe/K सेट FFREPORT = file = 'c: \ ffmpeg \ proto \ test.log': स्तर = 32 & & सी: \ ffmpeg \ bin \ ffmpeg.exe -loglevel चेतावनी-रिपोर्ट -i इनपुटफाइल f outputfile

उदाहरण जावास्क्रिप्ट:

var reortlogfile = "cmd.exe/k सेट FFREPORT = file = 'C: \ ffmpeg \ proto \" + filename + ".log': level = 32 & & सी: \ ffmpeg \ bin \ ffmpeg.exe" .. .....;

आप डीआईआर और फ़ाइल नाम बदल सकते हैं जो आप चाहते हैं।

फ्रैंक बर्लिन

से
2

ffmpeg लॉग stderr करने के लिए, और stderr से एक अलग लॉग-स्तर के साथ एक फाइल करने के लिए लॉग इन कर सकते। -report कमांड लाइन विकल्प आपको लॉग फ़ाइल नाम या लॉग स्तर का नियंत्रण नहीं देता है, इसलिए पर्यावरण चर सेट करना बेहतर है।

(-v-loglevel के लिए पर्याय है। भागो ffmpeg -v help स्तर देखने के लिए। भागो ffmpeg -h full | less सब कुछ देखने के लिए। या online docs या 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" 

कि x264 के साथ src.mp4 trancode जाएगा, और stderr करने के लिए "वर्बोज़" लिए लॉग स्तर सेट, और out.mkv.log लिए "स्थिति" के लिए लॉग स्तर।

(AV_LOG_WARNING=24, AV_LOG_INFO=32, AV_LOG_VERBOSE=40, आदि)। इसके लिए समर्थन added 2 years ago था, इसलिए आपको ffmpeg का एक गैर-प्राचीन संस्करण चाहिए। (हमेशा एक अच्छा विचार वैसे भी, सुरक्षा/bugfixes और speedups के लिए)


कुछ कोडेक्स, -c:v libx265 की तरह, सीधे ffmpeg की लॉगिंग बुनियादी सुविधाओं का उपयोग कर के बजाय stderr लिखें। तो उनके लॉग संदेश रिपोर्ट फ़ाइल में समाप्त नहीं होते हैं। मुझे लगता है कि यह एक बग/TODO- सूची आइटम है।

stderr को लॉग करने के लिए, जबकि इसे टर्मिनल में देखते हुए, आप tee(1) का उपयोग कर सकते हैं।


आपको लगता है कि स्थिति रेखा को अद्यतन करता (डिफ़ॉल्ट -v info, या अधिक) शामिल हैं एक लॉग स्तर का उपयोग करते हैं, वे लॉग फ़ाइल में, ^M (\r उर्फ ​​गाड़ी वापसी) द्वारा अलग-अलग शामिल किया जाएगा। इसमें कोई लॉग स्तर नहीं है जिसमें एन्कोडर आंकड़े (जैसे एसएसआईएम) शामिल हैं लेकिन स्थिति-रेखा अपडेट नहीं हैं, इसलिए संभवतः उस स्ट्रीम को फ़िल्टर करने का सबसे अच्छा विकल्प है।

यदि फ़िल्टर नहीं करना चाहते हैं (उदा।इसलिए प्रत्येक स्थिति-अद्यतन अंतराल पर fps/bitrate फ़ाइल में है), आप सीधे अपने टर्मिनल पर उन्हें पास करने के लिए less -r का उपयोग कर सकते हैं ताकि आप फ़ाइलों को साफ़ रूप से देख सकें। यदि आपके पास .enc कई एन्कोड से लॉग हैं जिन्हें आप फ़्लिप करना चाहते हैं, less -r ++G *.enc बहुत अच्छा काम करता है। (++ जी का मतलब फाइल के अंत में सभी फाइलों के लिए शुरू होता है)। . तरह single-key key bindings और , अगले फ़ाइल और पिछले फ़ाइल के लिए के साथ, आप बहुत अच्छी तरह से कुछ लॉग फाइल के माध्यम से फ्लिप कर सकते हैं। (डिफ़ॉल्ट बाइंडिंग :n और :p हैं)।

आप फ़िल्टर करना चाहते है, तो sed 's/.*\r//' ffmpeg उत्पादन के लिए पूरी तरह से काम करता है। (सामान्य स्थिति में, आपको like vt100.py कुछ चाहिए, लेकिन केवल कैरिज रिटर्न के लिए नहीं)। Tee + sed: tee से/dev/tty और पाइप टी के आउटपुट के साथ ऐसा करने के लिए कम से कम दो तरीके हैं, या एक पाइप में एक पाइप में टी करने के लिए प्रक्रिया प्रतिस्थापन का उपयोग करें।

# 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 
    [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 

ध्यान दें कि यह उत्पादन वीडियो फ़ाइल लॉग फ़ाइल में अतिरिक्त कचरा उगल अगर यह पहले से मौजूद है से बचने के लिए के अस्तित्व के लिए परीक्षण करती है। फिर भी, मैंने उपयोग किया और संलग्न किया (>>) पुनर्निर्देशित करें।

यह एक खोल समारोह है कि बजाय खोल चर को देखने का आर्ग ले लिया लिखने के लिए "स्वच्छ" होगा, लेकिन यह सुविधाजनक और अपने खुद के इस्तेमाल के लिए लिखने के लिए आसान था। यही कारण है कि मैंने अपने सभी परिवर्तनीय विस्तारों को उचित रूप से उद्धृत न करके अंतरिक्ष को बचाया। ($v"$v" के बजाय)