【问题标题】:How to stop ffmpeg after it has finished pythonpython完成后如何停止ffmpeg
【发布时间】:2017-08-23 15:42:28
【问题描述】:

我有一个函数可以在临时文件夹中查找 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.close()而不是杀死ffmpeg。
  • 我得到一个错误“'VideoFileClip'对象没有属性'close'”
  • 这可以是您的代码的真实副本,其中包含双斜杠('//')吗?
  • 是的,上面是我写的确切代码。我需要使用双斜杠,否则 python 会因为某种原因而感到困惑......

标签: python video ffmpeg python-3.6


【解决方案1】:

我认为这会满足您的需求。在此代码中,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()

【讨论】:

  • 不幸的是,这并没有成功。我在编写音频后设置了 clip = None 但文件仍然在 ffmpeg.exe 中打开
  • [微笑] 这就是程序员使用版本控制系统的原因。从有效的代码开始。对其进行修改,使其更接近您想要的。如果可行,请制作另一个模组。如果没有,请了解如何更正修改。或者回去尝试完全不同的修改方式。简而言之,循序渐进。
  • @JoeyB:道歉:我说的是真的,但很不恰当。请参阅编辑。
猜你喜欢
  • 2021-12-25
  • 2019-10-08
  • 1970-01-01
  • 1970-01-01
  • 2017-02-14
  • 2021-02-08
  • 1970-01-01
  • 2018-04-24
  • 1970-01-01
相关资源
最近更新 更多