如何在完成python后停止ffmpeg

时间:2017-08-23 15:42:28

标签: python video ffmpeg python-3.6

我有一个功能,可以在临时文件夹中找到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。在此先感谢您的帮助!

1 个答案:

答案 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()