在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桶的操作成功。

参考文献

相关推荐
Lucifer三思而后行13 小时前
亲测有效!OGG 创建抽取进程报错 OGG-08241,如何解决?
ffmpeg
achene_ql13 小时前
基于QT和FFmpeg实现自己的视频播放器FFMediaPlayer(一)——项目总览
开发语言·qt·ffmpeg
Lucifer三思而后行17 小时前
OGG 更新表频繁导致进程中断,见鬼了?非也!
ffmpeg
亚林瓜子1 天前
AWS Elastic Beanstalk部署极简Spring工程(EB CLI失败版)
spring·云计算·aws·cli·eb
在云上(oncloudai)2 天前
AWS SageMaker vs Bedrock:该选哪个?
aws·aws bedrock·aws sagemaker
亚林瓜子2 天前
AWS Elastic Beanstalk控制台部署Spring极简工程(LB版)
spring·云计算·aws·elb·beanstalk·alb·eb
追随远方2 天前
FFmpeg在Android开发中的核心价值是什么?
android·ffmpeg
亚林瓜子2 天前
AWS Elastic Beanstalk控制台部署Spring极简工程
java·spring·云计算·aws·eb
linkingvision2 天前
H5S 视频监控AWS S3 对象存储
linux·运维·aws·视频监控s3对象存储
亚林瓜子2 天前
AWS CloudTrail日志跟踪启用
云计算·aws·log·cloudtrail