There is no need to download a file and put it inside your lambda’s /tmp folder to process it with FFMPEG. I will show you how to do it “on the fly”. Just stream a damn file directly into ffmpeg!
def execute_ffmpeg_command(input_file: str): """ Execute the given ffmpeg command against the input file. Args: input_file (str): Path to the input video file (e.g. file.mp4). """ # Define the ffmpeg command as a list of arguments s3_stream = None ffmpeg_process = None try: output_path = "/tmp" s3_client = boto3.client("s3") # Get the S3 object as a stream s3_object = s3_client.get_object(Bucket="bucket_name", Key=input_file) #key is the name of a file in your S3 bucket s3_stream = s3_object["Body"] # Prepare ffmpeg process with input from the S3 object stream # s3_object_buffer = io.BytesIO(s3_object.read()) <- can try with this as well ffmpeg_process = subprocess.Popen( [ f"{bin_path}/bin/ffmpeg", "-i", "-", # '-' for stdin #rest of yours ffmpeg command ], stdin=subprocess.PIPE, # Actually, here you can try to use S3 object stream as stdin for ffmpeg stdout=subprocess.PIPE, stderr=subprocess.PIPE, bufsize=-1, ) # Read from S3 stream and write to FFmpeg stdin chunk_size = 1024 * 1024 # Define chunk size (1 MB) while True: chunk = s3_stream.read(chunk_size) if not chunk: # Break if no more data to read break ffmpeg_process.stdin.write(chunk) # Close FFmpeg stdin ffmpeg_process.stdin.close() # Collect process output and error output, error = ffmpeg_process.communicate() # Return the FFmpeg output and error return output, error except Exception as e: print(f"Error accessing S3 object: {e}") return None, str(e) finally: # Ensure proper cleanup of resources if s3_stream and not s3_stream.closed: s3_stream.close() if hasattr(ffmpeg_process, "stdin"): ffmpeg_process.stdin.close() # Example usage: if __name__ == "__main__": file_name = "new.MOV" execute_ffmpeg_command(file_name, is_local=False)
Leave a Reply