2017-12-01 6 views
0

ビデオがいっぱいのフォルダがあります。それらのうちのいくつかはオーディオを持ち、他はミュートです(文字通りオーディオストリームはありません)。 私が作った小さなプログラムで私の目標は、オーディオなしのビデオをgifsという名前のフォルダに移動することです。(python3.6)ビデオファイルからオーディオデータを確認して効果的に移動する方法

質問:私はどのように最適化できますか?私は私が何か間違ったことをやっているなら、私に教えて気軽にStackOverflowのために新たなんだ*

from subprocess import check_output 
from os.path import join,splitext 
from os import rename,listdir 
from shutil import move 




def noAudio(path): 
    cmd =("ffprobe -i {0} -show_streams -select_streams a -loglevel error".format(path)) 
    output = check_output(cmd,shell=True) 
    boolean = (output == b'') 
    return boolean 

def del_space(file): 
    rename(join(src,file),join(src,file.replace(' ',''))) 
    Newf = file.replace(' ','') 
    return Newf 

def StoreNoAudio(src,dist): 

    target = [".mp4",".MP4",".gif"] 
    GifMoved = 0 
    print("processing...") 

    for file in listdir(src): 
     direction,extension = splitext(file) 

     try: 

      if extension in target: 
       #find space related errors and correct them 
       if ' ' in file: 
        file = del_space(file) 

       path = join(src,file) 
       distination = join(dist,file) 
       #move file without audio streams 
       if(extension == '.gif' or noAudio(path) == True): 
        move(path,distination) 
        GifMoved += 1 
     except Exception as e: 
      print(e) 


    print('Mute videos moved:',GifMoved) 
    print('finished!') 


dist = (r"C:\Users\user\AppData\Roaming\Phyto\G\Gif") 
src = (r"C:\Users\user\AppData\Roaming\Phyto\G\T") 

StoreNoAudio(src,dist) 

は、ここでは、progammです。

答えて

0

正しく理解すれば、プログラムは正しく動作しており、実行時間を短縮する方法を探しています。

multiprocessing packageを使用して、プログラムをファイルごとのサブプロセスに並列化することができます。

これを行うには、その関数(のはprocess_fileそれを呼びましょう)にあなたのforループ内のコードを入れて、そして:

これはCPUを/コアと同数のサブプロセスを作成し、配布します
import multiprocessing 
pool = multiprocessing.Pool(multiprocessing.cpu_count()) 
pool.map(process_file, listdir(src)) 

それらの作業。これにより、マシンの使用可能なコアの数に応じて、実行時間が大幅に短縮されます。

ただし、変数GifMovedには子プロセスからアクセスできないため、移動したファイルの数を把握することはできません。 、その後、あなたは、このようなprocess_fileにすべてのコールの結果をまとめることができない場合は、あなたの関数は、ファイルが移動された場合10を返すことができます:

GifMoved = sum(pool.map(process_file, listdir(src))) # instead of last line above 
+0

本当に素敵な、実行時間が3秒に15秒から行ってきました! – Clayden

+0

移動したファイルを追跡しようとしたとき: GifMoved = sum(pool.map(process_file、listdir(src))) このエラーが発生しました:TypeError:サポートされていないオペランドの型が+: ' int 'と' NoneType ' – Clayden

+0

関数がint(0または1)を返すようにしてください。 – Dietmar

関連する問題