我想运行这个命令
for /R %f IN (/*.mp4) DO ffmpeg -i "%f" -f wav -bitexact -acodec pcm_s16le -ar 22050 -ac 1 %~nf.wav
在这个脚本中,如下所示:
import os
from datetime import date
today = date.today()
today = today.strftime('%m-%d-%Y')
dir_name = f"C:/Users/lucan/Automatically/{today}/"
def extract(user):
test = os.listdir(dir_name)
command = "for /R %f IN (/*.mp4) DO ffmpeg -i "%f" -f wav -bitexact -acodec pcm_s16le -ar 22050 -ac 1 %~nf.wav"
os.system(command)
for item in test:
if item.endswith(".wav"):
os.remove(os.path.join(dir_name, item))
extract("businessbarista")
当我这样做时,这是我得到的错误消息:
命令=";对于/R%f IN(/*.mp4(DO ffmpeg-i"%f"-f wav-位精确-acodec pcm_s16le-ar2250-ac1%~nf.wav";TypeError:必须是实数,而不是str
命令在命令提示符下运行良好,但在powershell中运行不好。你能帮我弄清楚出了什么问题吗?
为什么要混合Python&批处理脚本?
如果我理解循环语法的批处理脚本,那么以下内容在Python中应该是等效的:
from glob import glob
import subprocess as sp
from os import path
# FFmpeg command (missing input & output)
cmd = ['ffmpeg','-i',None,'-f','wav','-bitexact','-acodec','pcm_s16le','-ar','22050','-ac','1']
# likely equivalent to 'for /R %f IN (/*.mp4) DO '
for input in glob("**/*.mp4",recursive=True):
cmd[3] = input
output = path.splitext(input)[0] + '.wav'
sp.run([*cmd,output])
此片段扫描当前文件夹及其所有子文件夹,列出其中的所有mp4文件并返回相对路径。例如CCD_ 1。然后os.path.splitext()
删除文件扩展名以形成输出文件路径。
您在" "
中有" "
,这会产生问题。
它将其视为两个字符串"first" %f "second"
。
您必须用' '
替换一对" "
,就像' " " '
或" ' ' "
一样。
或者你必须像使用mp4video.mp4
1 一样使用
command = 'for /R %f IN (/*.mp4) DO ffmpeg -i "%f" -f wav -bitexact -acodec pcm_s16le -ar 22050 -ac 1 %~nf.wav'