كيف يمكنني تمكين تسجيل FFMPEG وأين يمكنني العثور على ملف سجل FFMPEG؟

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

سؤال

أريد أن أكون قادرًا على تسجيل عمليات FFMPEG لأنني أحاول تحديد المدة التي تستغرقها دقيقة من الفيديو لتحويلها للمساعدة في تخطيط السعة لخادم تشفير الفيديو الخاص بي. كيف يمكنني تمكين التسجيل وأين يتم حفظ ملف السجل. لدي FFMPEG مثبتة على آلة مصباح CentOS.

هل كانت مفيدة؟

المحلول

لا تكتب 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

"-report" سطر الأوامر الكامل وإخراج وحدة التحكم إلى ملف يسمى برنامج yyyymmdd-hhmmss.log في الدليل الحالي. يمكن أن يكون هذا الملف مفيدًا لتقارير الأخطاء. كما أنه يشير إلى -مطوّلة.

ملاحظة: تعيين متغير البيئة 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 في مصدر المجلد لمصدر الملف الخاص بك. يمكنك وضع أي اسم إذا أردت ، لقد قمت بحل مشكلتي "أكتب عدة مرات في هذا المنتدى" قراءة. docx حول خصائص MPEG. أخيرًا ، يمكنني إجراء شريط التقدم الخاص بي الذي تم إنشاؤه هذا الملف 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"

سوف trancode src.mp4 مع X264 ، وضبط مستوى السجل لـ STDERR على "مطول" ، ومستوى السجل لـ out.mkv.log إلى "الحالة".

(AV_LOG_WARNING=24, AV_LOG_INFO=32, AV_LOG_VERBOSE=40, ، إلخ.). كان دعم هذا أضيف منذ عامين, ، لذلك تحتاج إلى نسخة غير مختصرة من FFMPEG. (دائمًا فكرة جيدة على أي حال ، للأمان / الإثارات والسرعة)


عدد قليل من برامج الترميز ، مثل -c:v libx265, ، اكتب مباشرة إلى STDERR بدلاً من استخدام البنية التحتية لقطع الأشجار في FFMPEG. لذلك لا ينتهي رسائل السجل الخاصة بهم في ملف التقرير. أفترض أن هذا عنصر قائم على خطأ / todo.

لتسجيل السجل ، بينما لا تزال مشاهدته في محطة ، يمكنك استخدامه tee(1).


إذا كنت تستخدم مستوى السجل الذي يتضمن تحديثات سطر الحالة (الافتراضي -v info, ، أو أعلى) ، سيتم تضمينها في ملف السجل ، مفصولة مع ^M (عودة العربة الملقب \r). لا يوجد مستوى سجل يتضمن إحصائيات التشفير (مثل SSIM) ولكن ليس تحديثات خط الحالة ، وبالتالي فإن الخيار الأفضل هو تصفية هذا الدفق.

إذا كنت لا ترغب في التصفية (على سبيل المثال ، فإن FPS / bitrate في كل فاصل محدث للحالة موجود في الملف) ، يمكنك استخدامه less -r لتمريرها مباشرة إلى المحطة الخاصة بك حتى تتمكن من عرض الملفات بشكل نظيف. اذا كنت تمتلك .enc سجلات من العديد من الترميزات التي تريد أن تقلبها ، less -r ++G *.enc يعمل بشكل رائع. (++ G يعني البدء في نهاية الملف ، لجميع الملفات). مع روابط مفتاح مفتاح واحد مثل . و , بالنسبة للملف التالي والملف السابق ، يمكنك الوجه من خلال بعض ملفات السجل بشكل جيد للغاية. (الروابط الافتراضية :n و :p).

إذا كنت تريد التصفية ، sed 's/.*\r//' يعمل بشكل مثالي لإخراج FFMPEG. (في الحالة العامة ، تحتاج إلى شيء ما مثل vt100.py, ، ولكن ليس لعودة العربة فقط). هناك (على الأقل) طريقتان للقيام بذلك باستخدام tee + sed: tee to /dev /tty و tee pipe في SED ، أو استخدم استبدال العملية لتوتر في أنبوب إلى 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
  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 بدلاً من النظر إلى متغيرات Shell ، ولكن هذا كان مناسبًا وسهل الكتابة لاستخدامي الخاص. لهذا السبب قمت بحفظ المساحة من خلال عدم اقتباس جميع التوسعات المتغيرة بشكل صحيح. (($v بدلاً من "$v")

يجب أن تعلن عن التقرير كمتغير لوحدة التحكم.

المشكلة هي أن جميع الحوادث التي يمكنك العثور عليها لا تعمل على ذلك .. كنت أعطي يوم واحد من LIVE للعثور على الطريق الصحيح ....

مثال: للحصول على دفعة/وحدة تحكم

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

exemple JavaScript:

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

يمكنك تغيير DIR واسم الملف كيف تريد.

فرانك من برلين

إذا كنت تريد فقط معرفة المدة التي يستغرق تنفيذ الأمر ، فيمكنك التفكير في استخدام الوقت أمر. على سبيل المثال استخدام time ffmpeg -i myvideoofoneminute.aformat out.anotherformat

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top