首页 > 解决方案 > 在 Python 3 脚本的 for 循环中调用 ffmpeg

问题描述

我尝试在 for 循环中的 Python 3 脚本中使用 ffmpeg 将每个 .m4v 文件转换为 .wav 文件(保持相同的名称),然后删除 .m4v 文件。我可以使用以下代码在源目录中执行此操作,它可以工作。

import os
dst="Path\\sourcefolder"
os.chdir(dst)
os.system("ffmpeg -i test.m4v test.wav")
os.remove("test.m4v")

但是,我希望能够对源中具有不同路径的所有 m4v 文件执行此操作,即递归目录。我期待类似以下的内容;

for i in range(0,len(m4v_Paths))         
    infile=m4v_Paths[i]  # example i th file "Path\\source\\folder\\movie.m4v"
    outfile=os.path.join(os.path.splitext(m4v_Path[i])[0]+'.wav')  # remove '.m4v' extension add ' .wav'
    os.system("ffmpeg -i infile outfile")
    os.remove(infile)

我已经阅读了类似标题的问题,但它们没有帮助。我试图将每个路径作为参数传递给命令行,但什么也没发生。

标签: python-3.x

解决方案


最后,我找到了一种方法。它比我喜欢的要慢,但它完全符合我的要求。我相信这个任务有更有效的代码,但把我的代码放在这里以防万一有人遇到类似的问题。

import os

#first create a path list for all the files in the recursive source
src='Path\\sourcefolder'
fpathlist=[]
for path, subdirs, files in os.walk(src):
     for fpath in files:
         fpathlist.append(os.path.join(path, fpath))       
length=len(fpathlist)


mycwd = os.getcwd()
for fpath in range(0,length):
    if (fpath.endswith(".m4v")):
        filename=os.path.basename(fpath)
        dst=os.path.dirname(fpath)
        mycwd = os.getcwd()
        os.chdir(dst)
        os.system("ffmpeg -i {0} temp_name.wav".format(filename))
        org_name=os.path.join(dst, filename)
        no_ext=os.path.splitext(org_name)[0]
        temp_name=os.path.join(dst, "temp_name.wav")
        new_name = os.path.join(no_ext+'.wav')
        os.rename(temp_name,new_name)
        os.remove(org_name)
        os.chdir(mycwd)

推荐阅读