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

大纲

  • 1 部署有FFmpeg功能的Lambda环境
    • 1.1 部署层
    • 1.2 部署代码
      • 1.2.1 FFmpeg指令
      • 1.2.2 代码
  • 2 配置Lambda角色权限
    • 2.1 选择角色类型
    • 2.2 设置权限
    • 2.3 保存角色
    • 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指令

我们使用的指令是:

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代码来完成这个功能。

import json
import subprocess
import shlex
import boto3
import timeS3_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桶的操作成功。
在这里插入图片描述

参考文献

  • 在AWS Lambda上部署标准FFmpeg工具——自定义层的方案
  • 在AWS Lambda上部署EC2编译的FFmpeg工具——自定义层的方案
  • 在AWS Lambda上部署标准FFmpeg工具——Docker方案
  • aws ffmpeg+ lambda来完成视频stream的截图 python 版

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/200643.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

根文件系统的开机自启动测试

一. 简介 本文在之前制作的根文件系统可以正常运行的基础上进行的,继上一篇文章地址如下: 完善根文件系统-CSDN博客 在前面测试软件hello 运行时,都是等 Linux 启动进入根文件系统以后手动输入 “./hello” 命令 来完成的。 我们一般做好产…

C++:一个函数返回值的小问题

今天一位同学问了我这样一个问题: int& getDState() { return _dstate; } int getDState() { return _dstate; }这两个函数有什么区别? 这两个返回一个名为 _dstate 的成员变量或变量。函数的返回类型不同,在C中是不允许的,…

Python计算方差

方差可以反应变量的离散程度,是因为它度量了数据点与均值的差异。方差是每个数据点与均值的差的平方和的平均值,它可以反映数据点在均值附近的分布情况。如果方差较小,说明数据点更加集中在均值附近,离散程度较小;如果…

uniapp微信小程序分包,小程序分包

前言,都知道我是一个后端开发、所以今天来写一下uniapp。 起因是美工给我的切图太大,微信小程序不让了,在网上找了一大堆分包的文章,我心思我照着写的啊,怎么就一直报错呢? 错误原因 tabBar的页面被我放在分…

【JSD1209考试】题目与解答

选择题 在Java Applet程序中,如果对发生的事件做出响应和处理的时候,应该使用的语句是? ( C ) (1分) A. import java.awt.*;B. import java.applet.*;C. import java.awt.event.*;D. import java.io.*; 以下返回true的…

【从零开始学习JVM | 第一篇】快速了解JVM

前言: 在探索现代软件开发的丰富生态系统时,我们不可避免地会遇到一个强大而神秘的存在——Java虚拟机(JVM)。作为Java语言最核心的组成之一,JVM已经超越了其最初的设计目标,成为一个多语言的运行平台&…

JavaScript包管理器分类和区别

一、JavaScript包管理器分类 NPMYarnPNPMBun 二、包管理器的区别 1、NPM 是Node.js的默认包管理器,默认随Node.js一起安装,无需额外配置。 npm2 采用简单的递归依赖方法,最后形成高度嵌套的依赖树。然后就会造成如下问题:重复依…

【JavaSE】网络编程(学习笔记)

一、网络编程概述 网络编程:网络互联的计算机实现数据交换 1、网络编程三要素 1)IP IP:网络中设备的唯一标识 cmd -> ipconfig:查看本机ip cmd -> ping ip地址:检查网络是否连通 127.0.0.1:回送地…

Ubuntu环境下使用nginx实现强制下载静态资源

安装Nginx sudo apt update sudo apt install nginx关闭防火墙 sudo ufw allow Nginx HTTP修改nginx配置 cd /etc/nginx/conf.d vi nginx.conf在http配置中添加(/your path/为需要下载的文件路径) server {listen 80;server_name localhost;location / {root /your path/…

convert_from_pinhole_camera_parameters 失败

函数convert_from_pinhole_camera_parameters 在0.17版本中有bug。 应该说是,直接使用pip install open3d 的0.17版本有问题,在git code中已经修复,需要下载后用pip安装。希望pip赶紧更新。。。。 参考: Fix the pybind refer…

WPS Office JS宏实现批量处理Word中的标题和正文的样式

该篇讲解下word文档中的标题和正文批量修改样式,如下图: 前面一篇已讲解了WPS Office宏编辑器操作方法,这里不细讲了,如有不清楚可以查看该篇:https://blog.csdn.net/jiciqiang/article/details/134653657?spm1001.20…

Install4J安装界面中如何使用脚本找到依赖程序XShell的安装位置

前言 写了一个工具, 使用Install4j打包, 但因为需要用到XShell, 所以希望在安装界面能够提前让用户配置好XShell的安装位置, 所以对Install4j的安装界面需要自定义, 后期在程序中直接过去安装位置就可以正常使用. 调研 和git-bash不一样, 安装版的XShell没有在注册表里存储安…

Ubuntu系统下使用apt-get安装Redis

记录一下Ubuntu20.04 64位系统下使用apt-get安装Redis 首先检查一下系统是否安装过redis whereis redismywmyw-K84HR:~$ whereis redis redis: mywmyw-K84HR:~$ 更新软件包 sudo apt-get update -y安装redis sudo apt-get install redis-server -ymywmyw-K84HR:~$ sudo apt…

数字ic设计技巧:添加debug信号

数字ic设计技巧:添加debug信号 文章目录 数字ic设计技巧:添加debug信号1. 握手方式读取数据的debug信号o_wait_read2. FIFO的空满信号3. 输入错误4. 多状态机的debug信号5. 使用FIFO记录log 在数字ic设计的过程中,我们常常通过添加一些debug信…

Java常见CodeReview及编码规范

鉴于自己的开发经验,以及常见容易产生bug及性能问题的点做个记录. 1.数据库 如果开发人员的经验不足,Java通过ORM(Mybatis)对数据库的操作的性能问题比较隐蔽.因为不压测或者异常case没发生的时候一般发现不了问题.特别是异常case发生的时候. 除配置表以外的sql都要经过expl…

LINQ【C#】

1LINQ概述: 集成查询,在对象领域和数据领域之间架起了一座桥梁。 LINQ主要由3部分组成:LINQ to ADO.NET、LINQ to Objects和LINQ to XML。其中,LINQ to ADO.NET可以分为两部分:LINQ to SQL 和LINQ to DataSet。 var…

Learning Memory-guided Normality for Anomaly Detection 论文阅读

Learning Memory-guided Normality for Anomaly Detection 摘要1.介绍2.相关工作3.方法3.1网络架构3.1.1 Encoder and decoder3.1.2 Memory 3.2. Training loss3.3. Abnormality score 4.实验5.总结总结&代码复现: 文章信息: 发表于:cvpr…

消息中间件之间的区别

一.单机吞吐量 ActiveMQ:万级,吞吐量比RocketMQ和Kafka要低了一个数量级 RabbitMQ:万级,吞吐量比RocketMQ和Kafka要低了一个数量级 RocketMQ:10万级,RocketMQ也是可以支撑高吞吐的一种MQ Kafka&#xff…

Python的requests库实现HTTPS

嘿,Python程序员们!今天我们要来点刺激的——使用Python的requests库实现HTTPS请求!是的,你没有听错,我们要一起迈入HTTPS的神秘世界! 首先,我们来了解一下HTTPS是什么。HTTPS是HTTP Secure的缩…

BUU SQL COURSE 1

四 发现有登录框,爆破半天也爆破不出来,只能从别的地方下手了 F12一下 发现了一个传参 进去发现id可以传参,sql注入一下试试 前三个都有回显,当id4的时候页面没有回显了,正好验证 了页面 有三个新闻 当order by 3的时…