79

次のようなPythonスクリプトを作成しようとしています:

  1. フォルダー「/input」を調べます
  2. そのフォルダー内の各ビデオに対して、mencoder コマンドを実行します (携帯電話で再生可能なものにトランスコードするため)。
  3. mencoder が実行を終了したら、元のビデオを削除します。

それはそれほど難しくないように思えますが、私はPythonが苦手です:)

スクリプトがどのように見えるべきかについてのアイデアはありますか?

おまけの質問: 使うべきですか

os.system

また

subprocess.call

?

Subprocess.call は、次のようにコマンドを記述できるため、より読みやすいスクリプトを可能にしているようです。

cmdLine = ['mencoder', sourceVideo, '-ovc', 'copy', '-oac', 'copy', '-ss', '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コマンドを削除しました。

ご意見をお寄せいただきありがとうございます。

4

7 に答える 7

34

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は、有効なシェルコマンドを受け入れる必要がある場合、たとえば構成ファイルでユーザーから受け取った場合に適しています。

于 2009-07-13T17:01:45.360 に答える
8

これにはPythonはやり過ぎかもしれません。

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

rm -f "$file"ファイルを削除します。

于 2009-07-13T18:58:39.290 に答える
3

AVIto 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
于 2009-07-13T17:08:33.240 に答える
1

私も同様の問題を抱えていました。ウェブからの多くの助けを借りて、この投稿で小さなアプリケーションを作成しました。ターゲットはVCDとSVCDであり、ソースを削除しませんが、自分のソースに適応するのはかなり簡単だと思います。ニーズ。

1つのビデオを変換してカットするか、フォルダー内のすべてのビデオを変換して名前を変更し、サブフォルダー/VCDに入れることができます。

また、小さなインターフェースを追加します。他の誰かがそれを役立つことを願っています!

私はここにコードとファイルを入れました:http://tequilaphp.wordpress.com/2010/08/27/learning-python-making-a-svcd-gui/

于 2010-08-27T11:53:07.513 に答える
1

または、単に os.walk よりも多くの作業を行う os.path.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)
于 2009-07-13T18:24:06.397 に答える