2017-08-23 27 views
0

私はtempフォルダにあるmp4ビデオを見つけ、musicという別のフォルダにあるmp3に変換し、tempフォルダからmp4を削除する機能を持っています。それは、このような次のようになります。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) 

は、関数が正常にmp3へのMP4の変換を完了したが、私がしようとすると、ファイルを削除すると、私は次のエラーを取得:手動で削除しようとしたら

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」)最後の行に2番目を実装しようとしたが、私はまだ同じエラーを思い付く。

だから私の質問は、ffmpegを殺す簡単な方法は、私はそれをやったと知っているか、または別のプロセスを介して何とかそれを殺すための回避策ですか?私はWindows 7のPC上でpython3.6で働いています。

+0

ffmpegを終了する代わりに 'clip.close()'を呼び出すようにしてください。 –

+0

エラー "'VideoFileClip'オブジェクトに 'close'属性がありません" –

+0

これは二重スラッシュ( '//')付きのコードの真のコピーですか? –

答えて

0

このコードでは、clipは、インスタンス自体が解放されるまでビデオファイルに「ハングする」オブジェクトインスタンスです。他のオブジェクトと同じように割り当てられていますclipclipに何かを割り当てて、このコードに値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') 

EDIT:そして、これは私が提案しているべきです!

はい、あなたは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

私自身のコードが機能しませんでした。clip = None –

関連する問題