(python3.6) Как проверить аудиоданные из видеофайла и эффективно их переместить

У меня есть папка с видео. Некоторые из них имеют звук, а другие - без звука (буквально без аудиопотока). Моя цель с помощью следующей небольшой программы - переместить видео без звука в папку с именем 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)

* Я новичок в stackru, не стесняйтесь сказать мне, если я делаю что-то не так.

1 ответ

Решение

Если я правильно понимаю, ваша программа уже работает правильно, и вы ищете способы сократить время выполнения.

Вы можете использовать многопроцессорный пакет для распараллеливания вашей программы в подпроцессы для каждого файла.

Для этого поместите код в свой for цикл в функцию (давайте назовем это process_file), а потом:

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

Это создаст столько подпроцессов, сколько имеется процессоров / ядер, и распределит работу по ним. Это должно привести к значительному сокращению времени работы, конечно, в зависимости от количества доступных ядер на вашем компьютере.

Однако отслеживание количества перемещенных файлов больше не работает напрямую, поскольку переменная GifMoved не доступен для дочерних процессов. Ваша функция может вернуть 1 если файл был перемещен и 0 если нет, то вы можете подвести итоги всех звонков process_file как это:

GifMoved = sum(pool.map(process_file, listdir(src))) # instead of last line above
Другие вопросы по тегам