在AWS Lambda中使用FFmpeg处理m3u8视频流

大纲

  • [1 部署有FFmpeg功能的Lambda环境](#1 部署有FFmpeg功能的Lambda环境)
    • [1.1 部署层](#1.1 部署层)
    • [1.2 部署代码](#1.2 部署代码)
      • [1.2.1 FFmpeg指令](#1.2.1 FFmpeg指令)
      • [1.2.2 代码](#1.2.2 代码)
  • [2 配置Lambda角色权限](#2 配置Lambda角色权限)
    • [2.1 选择角色类型](#2.1 选择角色类型)
    • [2.2 设置权限](#2.2 设置权限)
    • [2.3 保存角色](#2.3 保存角色)
    • [2.4 绑定角色](#2.4 绑定角色)
  • 参考文献

在直播里领域,我们经常需要对视频流进行处理。FFmpeg则是该领域中处理的利器。这篇文章,我们将以视频流截图为例,讲解如何在AWS Lambda中对m3u8视频流进行截图。因为Lambda是无服务架构,其本地存储是不可靠的,于是最后我们需要将截图文件上传S3桶。

1 部署有FFmpeg功能的Lambda环境

1.1 部署层

这块的方案可以见《在AWS Lambda上部署标准FFmpeg工具------自定义层的方案》《在AWS Lambda上部署EC2编译的FFmpeg工具------自定义层的方案》

《在AWS Lambda上部署标准FFmpeg工具------Docker方案》也是可以参考的。但是这个要求代码在部署时已经完备,而本例会在后面分析代码,所以本文中不参考这套部署方案。

1.2 部署代码

1.2.1 FFmpeg指令

我们使用的指令是:

bash 复制代码
ffmpeg -probesize 32768 -i {m3u8_stream_url} -y -t 0.001 -ss 1 -f image2 -r 1 -

其中*{m3u8_stream_url}*是需要被替换成视频流地址。其参数解析见下:

  • -probesize 32768:以字节为单位设置探测大小,即分析获取流信息的数据大小
  • -i:输入目标
  • -y:无需询问即可覆盖输出目标
  • -t:当用作输入选项(之前-i)时,限制从输入文件读取数据 的持续时间。我这里设置的是0.001秒
  • -ss:开始时间。
  • -f:强制输入或输出文件格式。
  • image2:图像文件解复用器。
  • -r:提取图像的频率
  • -:输出目标。因为FFmpeg截图的图片不能落盘,于是通过这个配置让图片内容进入标准输出。

1.2.2 代码

我们使用Python代码来完成这个功能。

python 复制代码
import json
import subprocess
import shlex
import boto3
import time

S3_DESTINATION_BUCKET = "inplay-video-image"

def lambda_handler(event, context):

    if not event:
        return {
        'statusCode': 200,
        'body': json.dumps('event is null')
    }
		
    # time.sleep(30) # 如果视频流一开始不用,则需要等待下。或者使用FFmpeg做下视频检测再决定当前时机是否可以截屏
    
	# 截屏
    cmd = "/opt/bin/ffmpeg -probesize 32768 -i {m3u8_stream_url} -y -t 0.001 -ss 1 -f image2 -r 1 -".format(m3u8_stream_url = event.get("m3u8_stream_url"))
    ffmpeg_cmd = shlex.split(cmd)
    ffmpeg_result = subprocess.run(ffmpeg_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
	
	# 上S3桶
    s3_client = boto3.client('s3')
	file_name = "{file_path}/covers.jpeg".format(file_path = event.get('user_id')) # 在在event中我们传递了user_id以标识不同的用户,用于将用户的视频截图保存到S3桶下对应其user_id的目录下
    resp = s3_client.put_object(Body=ffmpeg_result.stdout, Bucket=S3_DESTINATION_BUCKET, Key=file_name) # 上传S3桶

    return {
        'statusCode': 200,
        'body': json.dumps('Processing complete successfully')
    }

2 配置Lambda角色权限

2.1 选择角色类型

2.2 设置权限

本案例为了方便,使用了S3桶的全部权限策略。

如果希望严谨,可以按照下图配置一个策略,然后赋予给上述创建的角色。

2.3 保存角色

我们将上述创建的角色命名为:lambda-ffmpeg-role 。

2.4 绑定角色

将拥有对S3桶进行操作的角色绑定到拥有FFmpeg功能的Lambda上,从而确保将图片内容上传S3桶的操作成功。

参考文献

相关推荐
大江东去浪淘尽千古风流人物5 天前
【SLAM】GenRobot / IO-AI / Scale / Appen 能力对比表(机器人数据与闭环视角)
人工智能·机器学习·机器人·大模型·概率论·端侧部署·巨身智能
Elastic 中国社区官方博客6 天前
Elastic 公共 roadmap 在此
大数据·elasticsearch·ai·云原生·serverless·全文检索·aws
活捉一个坏小孩6 天前
Nvidia FFmpeg安装说明
ffmpeg
TG_yunshuguoji6 天前
亚马逊云代理商:AWS 国际站缺卡新用户创建邮箱怎么选择?
安全·云计算·aws
TG_yunshuguoji6 天前
亚马逊云代理商:如何监控AWS RDS使用率并设置报警?
运维·云计算·aws
WF_YL6 天前
如何删除 Oracle 过期 key / 数据,删除目的的key
ffmpeg
翼龙云_cloud7 天前
亚马逊云代理商:如何在 AWS 控制台上手动重启主实例?
服务器·云计算·aws
没有bug.的程序员7 天前
云服务成本优化深度进阶:AWS/Aliyun 资源监控内核、自动伸缩物理建模与 FinOps 降本实战指南
云计算·aws·finops·aliyun·自动伸缩·资源监控·物理建模
浩瀚之水_csdn7 天前
avcodec_find_decoder函数详解
ffmpeg
陆嵩8 天前
GMRES 方法的数学推导及其算法表示
算法·概率论·arnoldi·gmres·minres·givens·hessenberg