ffmpeg结果为临时文件

时间:2012-09-26 19:11:11

标签: python ffmpeg

我是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。为什么呢?

2 个答案:

答案 0 :(得分:2)

您最好创建一个临时目录,以便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就不会误解locationtemp_filename参数中的特殊字符。上下文管理器提供文件名而不创建文件名,但仍会自行清理。

答案 1 :(得分:1)

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