gpt4 book ai didi

python - python完成后如何停止ffmpeg

转载 作者:行者123 更新时间:2023-12-04 22:50:40 27 4
gpt4 key购买 nike

我有一个函数可以在临时文件夹中查找 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 电脑上使用 python3.6 工作。在此先感谢您的帮助!

最佳答案

我认为这会做你想要的。在此代码 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()

关于python - python完成后如何停止ffmpeg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45844143/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com