簡體   English   中英

無法在AWS Lambda上使用Moviepy調整視頻大小

[英]Cannot resize videos using moviepy on aws lambda

我部分創建了aws lambda函數,該函數利用moviepy將單個視頻文件中的圖像和視頻連接起來。

例如,我有“ img1.jpeg”,“ img2.jpeg”,“ video1.mp4”和“ video2.mp4”。 處理完上述文件后,最終的片段(“ mp4”文件)將是一個單獨的mp4文件:“ img1.jpeg + video1.mp4 + img2.jpeg + video2.mp4”。 修剪后的剪輯分辨率為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日志。 有趣的是,當我在本地運行它時,它可以工作。

有沒有人遇到過類似的問題,或者有人可以給我一些如何解決這個問題的指示?

使用lambda文件權限可能很有趣。 對任何臨時文件,工作文件等使用/ 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)
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位靜態文件並解壓縮,然后將2個文件添加到lambda zip文件中https://www.johnvansickle.com/ffmpeg/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM