2017-04-27 17 views
13

私はまた私のように最終的にはPILを使って画像をトリミングしていMP4ビデオにHTML5のビデオを変換しようとしていると時間パイプPIL画像 - Pythonの

上PhantomJSて撮影画面でそうやっていますコードはおおよそ次のとおりです。

while time() < end_time: 
    screenshot_list.append(phantom.get_screenshot_as_base64()) 
. 
. 
for screenshot in screenshot_list: 
    im = Image.open(BytesIO(base64.b64decode(screenshot))) 
    im = im.crop((left, top, right, bottom)) 

今私は、ディスクにすべてのそれらの画像を保存し、保存されたファイルからffmpegのを使用しています:

os.system('ffmpeg -r {fps} -f image2 -s {width}x{height} -i {screenshots_dir}%04d.png -vf scale={width}:-2 ' 
     '-vcodec libx264 -crf 25 -vb 20M -pix_fmt yuv420p {output}'.format(fps=fps, width=width, 
                    screenshots_dir=screenshots_dir, 
                    height=height, output=output)) 

しかし、私が代わりにそれらの保存されたファイルを使用するので欲しい、できるようにするにはPIL.Imagesディレクティブをffmpegにパイプするにはどうしたらいいですか?

+0

ffmpegの部分は 'ffmpeg -f image2pipe -vcodec png -i - -vf ....'のように開始する必要があります。 PILが適切なPNG構文を出力する場合は、入力イメージのサイズを指定する必要はありません。 – Mulvya

+0

いつか2で割り切れないし、それで問題が発生するので扱い、それを指定するので、私は指定します – bluesummers

+0

スケールフィルタの引数はmod 2要件を処理します。画像を取り込むことには関係ありません。 – Mulvya

答えて

6

バウンシーはなくなりましたが、解決策が見つかりました。

実行時間が問題になる場合は、次のコード

import subprocess as sp 

# Generating all of the screenshots as base64 
# in a variable called screenshot_list 

cmd_out = ['ffmpeg', 
      '-f', 'image2pipe', 
      '-vcodec', 'png', 
      '-r', '30', # FPS 
      '-i', '-', # Indicated input comes from pipe 
      '-vcodec', 'png', 
      '-qscale', '0', 
      '/home/user1/output_dir/video.mp4'] 

pipe = sp.Popen(cmd_out, stdin=sp.PIPE) 

for screenshot in screenshot_list: 
    im = Image.open(BytesIO(base64.b64decode(screenshot))) 
    im.save(pipe.stdin, 'PNG') 

pipe.stdin.close() 
pipe.wait() 

# Make sure all went well 
if pipe.returncode != 0: 
    raise sp.CalledProcessError(pipe.returncode, cmd_out) 

とサブプロセスの中に、私はそれらを書くbase64で文字列としてスクリーンショットの全てを取得した後、あなたの代わりにJPEGファイルとして画像を保存し、適切なコーデックを使用することができますそのために私が達成できた最高の品質は、これらの設定であった

関連する問題