Python Lambda 函数和 ffmpeg 命令以及从 jpg 到 ts 文件的标准输出

标签 python ffmpeg aws-lambda

我有一个 AWS Lambda Python 函数设置来处理 jpg 并将其转换为 ts 文件。
我遵循了这些说明 https://aws.amazon.com/blogs/media/processing-user-generated-content-using-aws-lambda-and-ffmpeg/但将命令从 vfr 更改为 cfr 转换为 jpg 到 ts 转换。
这是我正在使用的命令ffmpeg_cmd = "/opt/bin/ffmpeg -r 30000/1001 -loop 1 -i \"" + s3_source_signed_url + "\" -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=48000 -t 30 -vcodec libx264 -crf 23 -s 1920x1080 -r 30000/1001 -g 150 -pix_fmt yuv420p -acodec aac -b:a 96k -ar 48000 -"除了在我的 Lambda 中查找 jpeg 和 jpg 后缀的 s3 触发器之外,AWS 文章中的其他所有内容基本相同。
但这会导致 0 字节的 ts 文件。
我有一种预感,我需要在写入标准输出时修改具有可搜索输出格式(例如 mpegts)的命令;目前我的命令可能不适用于标准输出,这就是为什么我得到一个空的 ts 文件。但我无法正确格式化命令。对此的任何帮助将不胜感激!

最佳答案

解决这个问题的关键是使用临时文件夹和使用子进程调用
这是 Lambda 函数代码

import subprocess
import shlex
import boto3
import os


def lambda_handler(event, context):

    s3_client = boto3.client('s3')

    s3_source_bucket = event['Records'][0]['s3']['bucket']['name']
    s3_source_key = event['Records'][0]['s3']['object']['key']


    s3_source_basename = os.path.splitext(os.path.basename(s3_source_key))[0]
    destination_bucket = "destination-bucket"
    destination_bucketfile_name = os.path.dirname(s3_source_key) + "/" + s3_source_basename+".ts"

    l_input = "/tmp/" + os.path.basename(s3_source_key)
    l_output = "/tmp/"+ s3_source_basename + ".ts"


    s3_client.download_file(s3_source_bucket,s3_source_key,l_input)
    subprocess.run(['ls','-l','/tmp'])

    ffmpeg_cmd = "/opt/lib/ffmpeg -y -framerate 30000/1001 -loop 1 -i \"" + l_input + "\"" + " -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=48000 -c:v libx264 -crf 23 -s 1920x1080 -r 30000/1001 -g 150 -pix_fmt yuv420p -c:a aac -b:a 96k -ar 48000 -t 31 -f mpegts " + l_output
    print(ffmpeg_cmd)
    command1 = shlex.split(ffmpeg_cmd)
    p1 = subprocess.call(ffmpeg_cmd, shell=True)

    response="Failed"
    if(p1==0):
        response = s3_client.upload_file(l_output, Bucket=destination_bucket, Key=destination_bucketfile_name)
    else:
        print("Failed Process "+str(p1))

    os.remove(l_input)
    os.remove(l_output)

    return {
        'statusCode': 200,
        'body': json.dumps(response)

    }

关于Python Lambda 函数和 ffmpeg 命令以及从 jpg 到 ts 文件的标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68565819/

相关文章:

aws-lambda - AWS lambda 和 AWS Lambda@EDGE 之间有什么区别?

aws-lambda - AWS lambda 函数在 Amazon Connect 中失败

aws-lambda - AWS Step Function 中的 lambda 能否知道启动它的 Step Function 的 "execution name"?

python - Python 中的 Anagram 检查

python - 使用 numpy 编写 train_test_split 函数

python - 导入 tronweb 显示导入错误 : cannot import name 'hashable' from 'collections'

FFMPEG - 填充图像底部

python - 递归函数中的返回 - Python

video - ffmpeg:在一次调用中混合 concat、apad 和 amerge

python-3.x - 将 pi 的 opencv 视频传输到 ffmpeg 以进行 Youtube 流式传输