i'd like to run this command
for /R %f IN (/*.mp4) DO ffmpeg -i "%f" -f wav -bitexact -acodec pcm_s16le -ar 22050 -ac 1 %~nf.wav
inside this script, like this:
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")
when i do so this is the error message I get:
command = "for /R %f IN (/*.mp4) DO ffmpeg -i "%f" -f wav -bitexact -acodec pcm_s16le -ar 22050 -ac 1 %~nf.wav" TypeError: must be real number, not str
the command runs fine in command prompt, but not in powershell. can you help me figure out what went wrong?
CodePudding user response:
You have " "
inside " "
and this makes problem.
It treats it as two strings "first" %f "second"
.
You have to replace one pair of " "
with ' '
- like ' " " '
or " ' ' "
.
Or you have to use \
like " \" \" "
command = 'for /R %f IN (/*.mp4) DO ffmpeg -i "%f" -f wav -bitexact -acodec pcm_s16le -ar 22050 -ac 1 %~nf.wav'
CodePudding user response:
Why mix Python & batch scripts?
If I understood the batch script for loop syntax, the following should be equivalent in 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])
This snippet scans the current folder and all its subfolders and lists all mp4 files in them and return the relative paths. e.g., mp4\video.mp4
. Then os.path.splitext()
removes the file extension to form the output file path.