我有一个功能,可以在临时文件夹中找到mp4视频,将其转换为单独文件夹中的mp3,称为音乐,然后从临时文件夹中删除mp4。它看起来像这样:
import imageio
imageio.plugins.ffmpeg.download()
import moviepy.editor as mp
def convert_mp4_to_mp3():
video_file = os.listdir(os.getcwd() + '//temp')[0]
audio_file = video_file.replace('mp4','mp3')
clip = mp.VideoFileClip(os.getcwd() + '//temp//' + video_file)
clip.audio.write_audiofile(os.getcwd() + '//music//' + audio_file)
os.system("taskkill /f /im ffmpeg.win32.exe*32")
os.remove(os.getcwd() + '//temp//' + video_file)
该函数成功完成了mp4到mp3的转换,但是当我尝试删除该文件时,出现以下错误:
PermissionError: [WinError 32] The process cannot access the file because it
is being used by another process
在尝试手动删除文件时,我发现这是因为" ffmpeg.win32.exe"仍然在文件打开的情况下运行。在我杀死这个过程之前,我无法手动删除它。
我尝试实现倒数第二行(os.system(" taskkill / f / im ffmpeg.win32.exe * 32")来终止进程,但我仍然遇到同样的错误。
所以我的问题是,有一种简单的方法可以在我知道我已经完成它之后杀死ffmpeg,或者是否有某种解决方法以某种方式通过另一个进程杀死它?我在Windows 7的PC上使用python3.6。在此先感谢您的帮助!
答案 0 :(得分:0)
我认为这会做你想要的。在此代码中,clip
是一个“挂起”到视频文件的对象实例,直到实例本身被释放。与任何其他对象一样,通过为clip
分配其他内容,可以释放分配给clip
的任何内容,在此代码中,值为None
。
当我第一次尝试删除文件时,尝试失败。在clip = None
删除请求成功后。
>>> import moviepy.editor as mp
>>> clip = mp.VideoFileClip('Tokens - The Lion Sleeps Tonight.mp4')
>>> clip.audio.write_audiofile('Tokens - The Lion Sleeps Tonight.mp3')
[MoviePy] Writing audio in Tokens - The Lion Sleeps Tonight.mp3
0%| | 0/4081 [00:00<?, ?it/s]
0%| | 2/4081 [00:00<03:38, 18.69it/s]
1%| | 28/4081 [00:00<02:39, 25.44it/s]
3%|▎ | 121/4081 [00:00<01:50, 35.92it/s]
....
99%|█████████▉| 4034/4081 [00:04<00:00, 993.74it/s]
100%|██████████| 4081/4081 [00:04<00:00, 833.74it/s]
[MoviePy] Done.
>>> os.remove('Tokens - The Lion Sleeps Tonight.mp4')
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'Tokens - The Lion Sleeps Tonight.mp4'
>>> clip = None
>>> os.remove('Tokens - The Lion Sleeps Tonight.mp4')
编辑:这就是我应该建议的内容!
是的,您需要放弃clip
,但因为moviepy
使用ffmpeg来完成大部分工作,您需要有时间让ffmpeg释放其资源。因此,需要time.sleep(2)
或一些更复杂的方法来暂停函数,直到ffmpeg从执行中消失。
import imageio
imageio.plugins.ffmpeg.download()
import moviepy.editor as mp
import os
import time
def convert_mp4_to_mp3():
video_file = os.listdir(os.getcwd() + '/temp')[0]
print(video_file)
audio_file = video_file.replace('mp4','mp3')
clip = mp.VideoFileClip(os.getcwd() + '/temp/' + video_file)
clip.audio.write_audiofile(os.getcwd() + '/music/' + audio_file)
clip = None
time.sleep(2)
os.remove(os.getcwd() + '/temp/' + video_file)
convert_mp4_to_mp3()