Python Subprocess + Mencoder لا يعمل ، نفس الأمر يعمل في المحطة
-
25-09-2019 - |
سؤال
أواجه مشكلة في استخدام Mencoder (SVN-R30531-4.2.1) من خلال عملية ثعبان (2.6.1). أحاول الانضمام إلى ملفين MP4 وهما بنفس الحجم ، وبرنامج الترميز ، وما إلى ذلك ، لا يوجد لدى كلاهما صوت. الرمز الذي أستخدمه للاختبار هو:
import subprocess
mp4merge = [ "mencoder", "in1.mp4", "in2.mp4", "-ovc", "copy", "-oac", "copy", "-of", "lavf", "-o", "out.mp4" ]
try:
pMerge = subprocess.Popen(mp4merge, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
while pMerge.poll() == None:
for l in pMerge.stderr.readlines():
print l
if pMerge.poll() is not None:
print "Complete"
except subprocess.CalledProcessError:
print "fail"
وهو لا يعمل ، إنه معلق إلى أجل غير مسمى. ومع ذلك ، عندما أقوم بتشغيل نفس الأمر بالضبط من خلال Terminal (OS X 10.6.4) فهو يعمل. الأمر هو:
mencoder in1.mp4 in2.mp4 -ovc copy -oac copy -of lavf -o out.mp4
يمكنك تنزيل مقاطع الفيديو من هنا. أنا واثق تمامًا من أن مقاطع الفيديو ليست هي المحتملة بسبب حقيقة أنها تعمل من المحطة.
المحلول
المشكلة هنا هي ذلك pMerge.stderr.readlines()
كتل إلى الأبد حتى تنتهي العملية. تقرأ الكل خطوط قبل المتابعة.
نظرًا لأن Mencoder يكتب كثيرًا إلى stdout ، فإن المخزن المؤقت stdout ممتلئ وينتظر Mencoder فارغه قبل أن يتمكن من المتابعة. لذا فإن العملية لا تنتهي أبدًا.
إليك طريقة لفعل الشيء نفسه ، لن يتم تعليقه:
pMerge = subprocess.Popen(mp4merge, stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
stdout, stderr = pMerge.communicate()
print stdout
print stderr
هناك خيار آخر يسمح لك بقراءة خط الإخراج على حدة هو إعادة توجيه STDERR إلى stdout ، ثم قراءة stdout فقط ، (لا تستخدم الخطوط القراءة () لأنه يتم حظره حتى يتم قراءة جميع الخطوط):
pMerge = subprocess.Popen(mp4merge, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
for line in pMerge.stdout:
print line,
هذا يعيد توجيه Stderr إلى stdout حتى لا تملأ المخزن المؤقت الخاص بك.