(python3.6)如何从视频文件中检测音频数据并有效移动
(python3.6)How to check audio data from video file and move it effectively
我有一个装满视频的文件夹。其中一些有音频,另一些是静音的(实际上没有音频流)。
我制作的以下小程序的目标是将没有音频的视频移动到名为 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)
*我是 Whosebug 的新手,如果我做错了什么,请随时告诉我。
如果我没理解错的话,您的程序已经可以正常工作了,您正在寻找减少 运行 时间的方法。
您可以使用 multiprocessing package 将您的程序并行化为每个文件的子进程。
为此,将 for
循环中的代码放入一个函数中(我们称之为 process_file
),然后:
import multiprocessing
pool = multiprocessing.Pool(multiprocessing.cpu_count())
pool.map(process_file, listdir(src))
这将创建与 cpus/cores 一样多的子流程,并将工作分配给这些子流程。这应该会显着减少 运行 时间,当然这取决于您机器中可用内核的数量。
跟踪已移动文件的数量不再直接起作用,但是,因为子进程无法访问变量 GifMoved
。如果文件被移动,你的函数可以 return 一个 1
,如果没有,你的函数可以 0
,那么你可以像这样总结对 process_file
的所有调用的结果:
GifMoved = sum(pool.map(process_file, listdir(src))) # instead of last line above
我有一个装满视频的文件夹。其中一些有音频,另一些是静音的(实际上没有音频流)。 我制作的以下小程序的目标是将没有音频的视频移动到名为 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)
*我是 Whosebug 的新手,如果我做错了什么,请随时告诉我。
如果我没理解错的话,您的程序已经可以正常工作了,您正在寻找减少 运行 时间的方法。
您可以使用 multiprocessing package 将您的程序并行化为每个文件的子进程。
为此,将 for
循环中的代码放入一个函数中(我们称之为 process_file
),然后:
import multiprocessing
pool = multiprocessing.Pool(multiprocessing.cpu_count())
pool.map(process_file, listdir(src))
这将创建与 cpus/cores 一样多的子流程,并将工作分配给这些子流程。这应该会显着减少 运行 时间,当然这取决于您机器中可用内核的数量。
跟踪已移动文件的数量不再直接起作用,但是,因为子进程无法访问变量 GifMoved
。如果文件被移动,你的函数可以 return 一个 1
,如果没有,你的函数可以 0
,那么你可以像这样总结对 process_file
的所有调用的结果:
GifMoved = sum(pool.map(process_file, listdir(src))) # instead of last line above