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

出力ファイルを作成できるように、一時ディレクトリを作成することをお勧めします。ファイル名だけでなくファイルを作成するため、動作に失敗している可能性があります。ffmpegmkstemp

次のコンテキストマネージャーを使用します。完了したらクリーンアップします。

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)

このようにして、シェルは引数locationtemp_filename引数の特殊文字を誤って解釈することはできません。コンテキストマネージャは、ファイル名を作成せずに提供しますが、それ自体の後でクリーンアップします。

于 2012-09-26T19:36:20.247 に答える
1

mkstempファイル名だけでなく、ファイル自体を作成します。ffmpegしたがって、ファイルに書き込もうとすると、ファイルはすでに存在します。ffmpeg -yしたがって、オプションが使用されていない限り、ファイルを上書きするか、エラーメッセージを生成するかを尋ねられます。

于 2012-09-26T19:28:54.923 に答える