2017-08-23 380 views
0

我有一個功能,可以在臨時文件夾中找到mp4視頻,將其轉換爲單獨文件夾中的mp3(稱爲音樂),然後從temp文件夾中刪除mp4。它看起來像這樣:如何在python完成後停止ffmpeg

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,一旦我知道我已經完成了它,或者有一種解決方法,以某種方式殺死它通過另一個進程?我在python3.6在Windows 7 pc上工作。對於幫助!

+0

嘗試調用'clip.close()'而不是殺死ffmpeg。 –

+0

我得到一個錯誤「'VideoFileClip'對象沒有'close'屬性」 –

+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() 
+0

不幸的是,這並沒有做到這一點。我在寫入音頻後設置了clip = None,但是文件仍然在ffmpeg.exe中打開。 –

+0

您的代碼或我的。 –

+0

我自己的代碼不起作用設置剪輯=無 –

相關問題