我有一个代码,我下载一个youtube视频作为3gpp并将其转换为mp3,我需要使用FFmpeg来做到这一点,当使用cmd和powershell时它工作得很好,但是,当我试图在Python中运行相同的命令时,它根本不起作用。
这是我的命令
ffmpeg -i C:YTDownloadsCurrentAudio.3gpp C:YTDownloadsCurrentAudio.mp3
我试着:
subprocess.call(r'%SystemRoot%system32WindowsPowerShellv1.0powershell.exe ffmpeg -i C:YTDownloadsCurrentAudio.3gpp C:YTDownloadsCurrentAudio.mp3', shell=True)
subprocess.run(["ffmpeg","-i","C:YTDownloadsCurrentAudio.3gpp","C:YTDownloadsCurrentAudio.mp3]")
os.system('powershell ffmpeg -i C:YTDownloadsCurrentAudio.3gpp C:YTDownloadsCurrentAudio.mp3')
subprocess.run([
'ffmpeg',
'-i', os.path.join(parent_dir, f"{newname}.3gpp"),
os.path.join(parent_dir, f"{newname}.mp3")
])
subprocess.call('C:WindowsSystem32powershell.exe ffmpeg -i C:YTDownloadsCurrentAudio.3gpp C:YTDownloadsCurrentAudio.mp3', shell=True)
它们都返回某种类型的错误,其中一些返回ffmpeg不是公认的内部命令,在其他情况下,它说系统找不到指定的路径,但它们都不工作,甚至认为当我在cmd/powershell上使用完全相同的命令时它工作得很好。
sorry for my English:3
所有的命令应该工作(一些修复)…
您可以尝试以下操作:
-
添加
-y
参数,无需询问即可覆盖输出文件。
从Python执行时,您可能看不到以下问题:File 'C:YTDownloadsCurrentAudio.mp3' already exists. Overwrite ? [y/N]
添加-y
的示例:subprocess.call(r'%SystemRoot%system32WindowsPowerShellv1.0powershell.exe ffmpeg -y -i C:YTDownloadsCurrentAudio.3gpp C:YTDownloadsCurrentAudio.mp3', shell=True)
-
确保
ffmpeg.exe
在系统路径中。
如果您不确定ffmpeg.exe
是否在系统路径中,请尝试使用全路径。
假设ffmpeg.exe
在c:FFmpegbin
中,使用完整路径:subprocess.call(r'%SystemRoot%system32WindowsPowerShellv1.0powershell.exe c:FFmpegbinffmpeg -y -i C:YTDownloadsCurrentAudio.3gpp C:YTDownloadsCurrentAudio.mp3', shell=True)
-
使用
r""
前缀,或使用双反斜杠:
将os.system('powershell c:FFmpegbinffmpeg -y -i C:YTDownloadsCurrentAudio.3gpp C:YTDownloadsCurrentAudio.mp3')
替换为:os.system(r'powershell c:FFmpegbinffmpeg -y -i C:YTDownloadsCurrentAudio.3gpp C:YTDownloadsCurrentAudio.mp3') #or: os.system('powershell c:\FFmpeg\bin\ffmpeg -y -i C:\YTDownloads\CurrentAudio.3gpp C:\YTDownloads\CurrentAudio.mp3')
将subprocess.run(['ffmpeg', '-i', os.path.join(parent_dir, f"{newname}.3gpp"), os.path.join(parent_dir, f"{newname}.mp3")])
替换为:
parent_dir = r'C:YTDownloads'
newname = 'CurrentAudio'
subprocess.run([
r'c:FFmpegbinffmpeg', '-y',
'-i', os.path.join(parent_dir, f"{newname}.3gpp"),
os.path.join(parent_dir, f"{newname}.mp3")
])
将subprocess.call('C:WindowsSystem32powershell.exe ffmpeg -i C:YTDownloadsCurrentAudio.3gpp C:YTDownloadsCurrentAudio.mp3', shell=True)
替换为:
subprocess.call(r'c:FFmpegbinffmpeg -y -i C:YTDownloadsCurrentAudio.3gpp C:YTDownloadsCurrentAudio.mp3')
不需要使用powershell
,也不需要使用shell=True
。
指出:
- 以
ffmpeg.exe
在c:FFmpegbin
文件夹下为例。
您可以将ffmpeg.exe
复制到c:FFmpegbin
,或者使用ffmpeg.exe
的实际文件夹。 - 您也可以按照以下指南将包含
ffmpeg.exe
的文件夹添加到系统路径。