(python3.6)如何检查视频文件中的音频数据并有效地移动它

时间:2017-12-01 18:01:21

标签: python performance audio file-manipulation

我有一个充满视频的文件夹。其中一些有音频而另一些是静音(字面上没有音频流)。 我完成的以下小程序的目标是将没有音频的视频移动到名为gifs的文件夹中。

我的问题是:我如何优化?

这是编程:

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)

*我是stackoverflow的新手随时告诉我,如果我做错了什么。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您的程序已经正常工作,并且您正在寻找减少运行时间的方法。

您可以使用multiprocessing package将程序并行化为每个文件的子进程。

为此,请将for循环中的代码放入函数中(让我们称之为process_file),然后:

import multiprocessing
pool = multiprocessing.Pool(multiprocessing.cpu_count())
pool.map(process_file, listdir(src))

这将创建与cpus / cores一样多的子进程,并将工作分配到这些子进程。这样可以显着缩短运行时间,具体取决于机器中可用内核的数量。

跟踪已移动文件的数量不再直接有效,因为子进程无法访问变量GifMoved。如果文件已移动,您的函数可能会返回1,如果没有,则返回0,那么您可以将所有调用的结果总结为process_file,如下所示:

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