سؤال

أحاول إنشاء برنامج نصي ثعبان من شأنه:

  1. ابحث في المجلد "/ الإدخال"
  2. لكل فيديو في هذا المجلد، قم بتشغيل أمر MENCODER (إلى تحويلها إلى شيء قابل للتشغيل على هاتفي)
  3. بمجرد انتهاء Mencoder عن تشغيله، احذف الفيديو الأصلي.

هذا لا يبدو صعبا للغاية، لكنني أمتص في بيثون :)

أي أفكار حول ما يجب أن يبدو البرنامج النصي؟

سؤال المكافأة: يجب أن أستخدم

Os.System.

أو

subprocess.call.

?

يبدو أن Subprocess.call يسمح لكي نصي أكثر قابلية للقراءة، حيث يمكنني كتابة الأمر مثل هذا:

cmdline = ['mencoder'، sourcevideo، '-ovc'، 'نسخ'، '-oac'، 'نسخ'، '-s's'، '00: 02: 54 '،' -endpos '، '00: 00: 54 '،' -O '، DestinationVideo

تحرير: حسنا، يعمل هذا:

import os, subprocess

bitrate = '100'
mencoder = 'C:\\Program Files\\_utilitaires\\MPlayer-1.0rc2\\mencoder.exe'
inputdir = 'C:\\Documents and Settings\\Administrator\\Desktop\\input'
outputdir = 'C:\\Documents and Settings\\Administrator\\Desktop\\output'

for fichier in os.listdir(inputdir):
    print 'fichier :' + fichier
    sourceVideo = inputdir + '\\' + fichier
    destinationVideo = outputdir + '\\' + fichier[:-4] + ".mp4"

    commande = [mencoder,
               '-of',
               'lavf',
               [...]
               '-mc',
               '0',

               sourceVideo,
               '-o',
               destinationVideo]

    subprocess.call(commande)

os.remove(sourceVideo)
raw_input('Press Enter to exit')

لقد قمت بإزالة الأمر MENCODER، من أجل الوضوح ولأنني ما زلت أعمل عليه.

شكرا للجميع على ما ادخلته.

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

المحلول

للعثور على جميع أسماء الملفات os.listdir().

ثم أنت حلقة على أسماء الملفات. مثل ذلك:

import os
for filename in os.listdir('dirname'):
     callthecommandhere(blablahbla, filename, foo)

إذا كنت تفضل الإعالة الفرعية، فاستخدم Subprocess. :-)

نصائح أخرى

يستخدم Os.walk. للتأكيد بشكل متكرر فوق محتوى الدليل:

import os

root_dir = '.'

for directory, subdirectories, files in os.walk(root_dir):
    for file in files:
        print os.path.join(directory, file)

لا يوجد فرق حقيقي بين نظام Os.System و Subprocess.call هنا - ما لم يكن لديك التعامل مع الملفات المسماة بشكل غريب (أسماء الملفات بما في ذلك المسافات، علامات الاقتباس وما إلى ذلك). إذا كان هذا هو الحال، فهناك subprocess.call أفضل بالتأكيد، لأنك لا تحتاج إلى القيام بأي قذيفة نقلا عن أسماء الملفات. نظام Os.System أفضل عندما تحتاج إلى قبول أي أمر شل صالح، على سبيل المثال تلقى من المستخدم في ملف التكوين.

ربما تكون بيثون مبالحة لهذا.

for file in *; do mencoder -some options $file; rm -f $file ; done

AVI ل MPG (اختر ملحقاتك):

files = os.listdir('/input')
for sourceVideo in files:
    if sourceVideo[-4:] != ".avi"
        continue
    destinationVideo = sourceVideo[:-4] + ".mpg"
    cmdLine = ['mencoder', sourceVideo, '-ovc', 'copy', '-oac', 'copy', '-ss',
        '00:02:54', '-endpos', '00:00:54', '-o', destinationVideo]
    output1 = Popen(cmdLine, stdout=PIPE).communicate()[0]
    print output1
    output2 = Popen(['del', sourceVideo], stdout=PIPE).communicate()[0]
    print output2

أو يمكنك استخدام وظيفة OS.Path.walk، والتي تعمل بك أكثر من مجرد OS.Walk:

مثال غبي:

def walk_func(blah_args, dirname,names):
    print ' '.join(('In ',dirname,', called with ',blah_args))
    for name in names:
        print 'Walked on ' + name

if __name__ == '__main__':
    import os.path
    directory = './'
    arguments = '[args go here]'
    os.path.walk(directory,walk_func,arguments)

كان لدي مشكلة مماثلة، مع الكثير من المساعدة من الويب وهذا المنشور الذي قمت به تطبيق صغير، هدفي هو VCD و SVCD وأنا لا أحذف المصدر، لكنني أعتقد أنه سيكون من السهل إلى حد ما التكيف مع خاص بك الاحتياجات.

يمكنه تحويل الفيديو 1 وقطعه أو يمكنك تحويل جميع مقاطع الفيديو في مجلد، وإعادة تسميةها ووضعها في مجلد فرعي / VCD

أنا أيضا إضافة واجهة صغيرة، آمل أن يجد شخص آخر أنه مفيد!

أضع الرمز والملف هنا BTW: http://tequilaphp.wordpress.com/2010/08/27/learning-python-making-a-svcd-gui/

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