python - python完成后如何停止ffmpeg

标签 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 电脑上使用 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/

相关文章:

python - 转换为列表理解

python - 将属性与类对象关联

python - python 意外的文件行为

android - 在 HW 模式下创建 OMXCodec 编码器

iOS 将 AVI 转换为 MP4

python - 根据 Pandas Python 中的分组列值执行条件过滤

java - 如何在 Java 中编辑视频 ID3v2 标签

android - 如何在 Android 上使用 ffmpeg 命令

ffmpeg - ffserver 有哪些替代方案?

c++ - FFMPEG 设置网络摄像头编码器 C++