2017-01-19 17 views
0

moviepyを利用して1つのビデオファイルで画像とビデオを連結するawsラムダ関数を部分的に作成しました。awsラムダでmoviepyを使用してビデオのサイズを変更できません

たとえば、「img1.jpeg」、「img2.jpeg」、「video1.mp4」、「video2.mp4」があります。上記のファイルを処理した後、最終クリップ( "mp4"ファイル)は、 "img1.jpeg + video1.mp4 + img2.jpeg + video2.mp4"という単一のmp4ファイルになります。 fresultedクリップ解像度は640x480です。

私は、上記の解像度よりも大きい場合、ビデオと画像(moviepy.video.fx.all.resize - ビデオに変換した後に画像のサイズを変更する)のサイズを変更します。メディアファイルが上記のサイズであれば、私は連結プロセスに移ります。

メディアファイルが640x480の場合、すべての処理が正常に行われます。問題は、メディアが640x480より大きい場合です。エラーが発生します。

[Errno 32] Broken pipe 

MoviePy error: FFMPEG encountered the following error while writing file 1_img_transTEMP_MPY_wvf_snd.mp3: 

1_img_transTEMP_MPY_wvf_snd.mp3: Permission denied 


The audio export failed, possily because the bitrate you specified was two high or too low for the video codec.: IOError 
Traceback (most recent call last): 
File "/var/task/media_merge.py", line 70, in handler 
s.do_merge() 
File "/var/task/mediamerge/stitch_video_and_images.py", line 320, in do_merge 
self.convert_crop_media() 
File "/var/task/mediamerge/stitch_video_and_images.py", line 310, in convert_crop_media 
res_path = resize.resize_media() 
File "/var/task/mediamerge/stitch_video_and_images.py", line 229, in resize_media 
self.final_media_file, verbose=False) 
File "<decorator-gen-51>", line 2, in write_videofile 
File "/var/task/moviepy/decorators.py", line 54, in requires_duration 
return f(clip, *a, **k) 
File "<decorator-gen-50>", line 2, in write_videofile 
File "/var/task/moviepy/decorators.py", line 137, in use_clip_fps_by_default 
return f(clip, *new_a, **new_kw) 
File "<decorator-gen-49>", line 2, in write_videofile 
File "/var/task/moviepy/decorators.py", line 22, in convert_masks_to_RGB 
return f(clip, *a, **k) 
File "/var/task/moviepy/video/VideoClip.py", line 331, in write_videofile 
verbose=verbose) 
File "<decorator-gen-73>", line 2, in write_audiofile 
File "/var/task/moviepy/decorators.py", line 54, in requires_duration 
return f(clip, *a, **k) 
File "/var/task/moviepy/audio/AudioClip.py", line 204, in write_audiofile 
verbose=verbose, ffmpeg_params=ffmpeg_params) 
File "<decorator-gen-70>", line 2, in ffmpeg_audiowrite 
File "/var/task/moviepy/decorators.py", line 54, in requires_duration 
return f(clip, *a, **k) 
File "/var/task/moviepy/audio/io/ffmpeg_audiowriter.py", line 162, in ffmpeg_audiowrite 
writer.write_frames(chunk) 
File "/var/task/moviepy/audio/io/ffmpeg_audiowriter.py", line 122, in write_frames 
raise IOError(error) 
IOError: [Errno 32] Broken pipe 

MoviePy error: FFMPEG encountered the following error while writing file 1_img_transTEMP_MPY_wvf_snd.mp3: 

1_img_transTEMP_MPY_wvf_snd.mp3: Permission denied 


The audio export failed, possily because the bitrate you specified was two high or too low for the video codec. 

上記はaws lambda logsのものです。面白いのは、それをローカルで実行したときに動作することです。

誰もこのような問題に直面したことがありますか、誰かが私にこの問題に取り組む方法のいくつかの示唆を与えることができますか?

+0

に2つのファイルを追加し、オーディオのビットレートについての最後の行を無視します。それは単なる一般的なコメントです。 – tburrows13

答えて

0

ラムダファイルのパーミッションは面白いかもしれません。任意の一時ファイル、ワーキングファイルなどには/ tmpを使用してください。

これは役立つが、わかりやすいかどうかはわかりません。

SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) 
LIB_DIR = os.path.join(SCRIPT_DIR, 'lib') 



lambda_tmp_dir = '/tmp' # Lambda fuction can use this directory. 
image_path = "{0}/{1}".format(lambda_tmp_dir, "images") 
video_path = "{0}/{1}".format(lambda_tmp_dir, "video") 
video_name = "video.mp4" 

# ffmpeg is stored with this script. 
# When executing ffmpeg, execute permission is requierd. 
# But Lambda source directory do not have permission to change it. 
# So move ffmpeg binary to `/tmp` and add permission. 
FFMPEG_BINARY = "{0}/ffmpeg".format(lambda_tmp_dir) 
shutil.copyfile('/var/task/ffmpeg/ffmpeg', FFMPEG_BINARY) 
FFPROBE_BINARY = "{0}/ffprobe".format(lambda_tmp_dir) 
shutil.copyfile('/var/task/ffmpeg/ffprobe', FFPROBE_BINARY) 

os.environ['FFPROBE'] = FFPROBE_BINARY 
os.environ['FFMPEG'] = FFMPEG_BINARY 
os.chmod(FFPROBE_BINARY, os.stat(FFPROBE_BINARY).st_mode | stat.S_IEXEC) 
os.chmod(FFMPEG_BINARY, os.stat(FFMPEG_BINARY).st_mode | stat.S_IEXEC) 
0
from __future__ import print_function 
import uuid 
import boto3 
from botocore.exceptions import ClientError 

from moviepy.config import change_settings 

import os 
from shutil import copyfile 
import stat 

lambda_tmp_dir = '/tmp' 
FFMPEG_BINARY = "{0}/ffmpeg".format(lambda_tmp_dir) 
change_settings({"FFMPEG_BINARY": FFMPEG_BINARY}) 
copyfile('/var/task/ffmpeg', FFMPEG_BINARY) 
FFPROBE_BINARY = "{0}/ffprobe".format(lambda_tmp_dir) 
copyfile('/var/task/ffprobe', FFPROBE_BINARY) 
os.environ['FFPROBE'] = FFPROBE_BINARY 
os.environ['FFMPEG'] = FFMPEG_BINARY 
os.chmod(FFPROBE_BINARY, os.stat(FFPROBE_BINARY).st_mode | stat.S_IEXEC) 
os.chmod(FFMPEG_BINARY, os.stat(FFMPEG_BINARY).st_mode | stat.S_IEXEC) 


def lambda_handler(event, context): 
    from moviepy.video.io.VideoFileClip import VideoFileClip 
    from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip 
    s3_client = boto3.client('s3') 
    for record in event['Records']: 
     bucket = record['s3']['bucket']['name'] 
     key = record['s3']['object']['key'] 
     print('{} - {}'.format(bucket, key)) 
     key_without_path = key.replace('/', '') 
     source_file = '/tmp/{}{}'.format(uuid.uuid4(), key_without_path) 
     try: 
      s3_client.download_file(bucket, key, source_file) 
     except ClientError as e: 
      if e.response['Error']['Code'] == "404": 
       return None 
     try: 
      short_clip_path = '/tmp/resized{}{}'.format(uuid.uuid4(), key_without_path) 
      ffmpeg_extract_subclip(source_file, 2, 5, targetname=short_clip_path) 
      clip = VideoFileClip(source_file) 
      print('clip.duration = {}'.format(clip.duration)) 
      clip.save_frame("{}.jpg".format(short_clip_path), t=4.00) 

      if clip.duration > 5: 
       print('clip bigger then 5') 
     except: 
      return None 
     s3_client.upload_file(short_clip_path, bucket.replace('-', '-thumb-'), key) 
     s3_client.upload_file("{}.jpg".format(short_clip_path), bucket.replace('-', '-thumb-'), "{}.jpg".format(key)) 

ダウンロード64ビットの静的およびそれを解凍し、ところでラムダジップ https://www.johnvansickle.com/ffmpeg/

関連する問題