我是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。为什么呢?
答案 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就不会误解location
和temp_filename
参数中的特殊字符。上下文管理器提供文件名而不创建文件名,但仍会自行清理。
答案 1 :(得分:1)
mkstemp
创建文件本身,而不仅仅是文件名。因此,当ffmpeg
尝试写入文件时,该文件已存在。因此,除非使用ffmpeg -y
选项,否则它将询问您是要覆盖该文件还是生成错误消息。