0

我是 python 和 ffmpeg 的新手。我有以下问题要问。

如果我从命令行运行以下命令并且它可以工作。

ffmpeg -i  1.flv  temp_filename

如果我把它放在一个程序中

   temp_file_handle, temp_filename = tempfile.mkstemp('.flv')

   command = "ffmpeg -i " + newvideo.location + " "+ temp_filename

   out = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
   res = out.communicate()

生成的视频没有写入 tem_filename。为什么?

4

2 回答 2

3

您最好创建一个临时目录,以便为ffmpeg创建输出文件。它可能无法操作,因为mkstemp创建了文件,而不仅仅是文件名。

使用以下上下文管理器,它会在你完成后清理:

import os
import shutil
import tempfile
from contextlib import contextmanager

@contextmanager
def tempfilename(extension):
    dir = tempfile.mkdtemp()
    yield os.path.join(dir, 'tempoutput' + extension)
    shutil.rmtree(dir)

此外,您可以更容易地在没有开关的情况下将参数shell=True和命令作为列表传递。这是上面的上下文管理器,命令拆分为列表:

with tempfilename('.flv') as temp_filename:
    command = ["ffmpeg", "-i", newvideo.location, temp_filename]
    out = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

这样,shell 就不会误解locationandtemp_filename参数中的特殊字符。上下文管理器提供文件名而不创建它,但仍会自行清理。

于 2012-09-26T19:36:20.247 回答
1

mkstemp创建文件本身,而不仅仅是文件名。ffmpeg因此,当尝试写入该文件时,该文件将已经存在。因此它将询问您是否要覆盖文件,或产生错误消息,除非ffmpeg -y使用该选项。

于 2012-09-26T19:28:54.923 回答