AWS Lambda中FFmpeg前置seek参数执行失败求助
在带有FFmpeg层的AWS Lambda上执行以下FFmpeg命令时触发SIGSEGV错误:
/opt/ffmpeglib/ffmpeg -ss 00:02:00 -t 30 -i https://cdn.bitmovin.com/content/assets/art-of-motion-dash-hls-progressive/m3u8s/f08e80da-bf1d-4e3d-8899-f0f6155f6efa-audio-only.m3u8 /tmp/out.aac -y
该命令用于跳转到HLS流的2分钟位置,截取后续30秒音频保存为out.aac。本地运行正常,但在Lambda上读取目标时间段分片时突然终止,日志仅输出到[hls @ 0x72faa80] Opening 'https://cdn.bitmovin.com/content/assets/art-of-motion-dash-hls-progressive/audio/1_stereo_128000/hls/segment_0.ts' for reading后无后续内容。
将-ss 00:02:00 -t 30放在-i之后时命令可正常运行,但处理速度较慢:
/opt/ffmpeglib/ffmpeg -i https://cdn.bitmovin.com/content/assets/art-of-motion-dash-hls-progressive/m3u8s/f08e80da-bf1d-4e3d-8899-f0f6155f6efa-audio-only.m3u8 -ss 00:02:00 -t 30 /tmp/out.aac -y
已尝试Python、JavaScript运行环境,添加-nostdin等参数,均未解决问题。
1. 检查FFmpeg层的编译配置
Lambda的运行环境(Amazon Linux 2或Amazon Linux 2023)与本地环境存在差异,可能导致FFmpeg的HLS demuxer在处理seek操作时出现内存错误:
- 确保FFmpeg层是针对Lambda目标架构(x86_64或arm64)编译的,且编译时启用HLS支持、禁用不必要的特性。
- 尝试使用官方维护的FFmpeg Lambda层,或重新编译FFmpeg时添加
--disable-debug、--enable-small等参数,减少内存占用和潜在的内存泄漏风险。
2. 调整FFmpeg的HLS相关参数
针对HLS流的seek操作,添加参数优化行为:
/opt/ffmpeglib/ffmpeg -ss 00:02:00 -t 30 -i https://cdn.bitmovin.com/content/assets/art-of-motion-dash-hls-progressive/m3u8s/f08e80da-bf1d-4e3d-8899-f0f6155f6efa-audio-only.m3u8 -hls_time 10 -hls_list_size 0 /tmp/out.aac -y
-hls_time:强制指定分片时长,帮助FFmpeg更准确定位目标分片。-hls_list_size 0:读取完整的HLS播放列表,避免因列表截断导致的seek错误。
另外,添加-avioflags direct参数减少IO操作的内存开销:
/opt/ffmpeglib/ffmpeg -avioflags direct -ss 00:02:00 -t 30 -i https://cdn.bitmovin.com/content/assets/art-of-motion-dash-hls-progressive/m3u8s/f08e80da-bf1d-4e3d-8899-f0f6155f6efa-audio-only.m3u8 /tmp/out.aac -y
3. 增加Lambda的内存分配
SIGSEGV错误可能源于内存不足。Lambda的内存与CPU、网络带宽正相关,尝试将内存配置从默认的128MB提升到512MB或更高,观察是否解决问题。
4. 手动定位目标分片后再处理
既然-ss在-i之后可以正常运行,可先通过FFmpeg获取HLS流的分片信息,手动计算目标时间段对应的分片URL,直接下载该分片并截取内容:
- 获取HLS播放列表的分片信息:
/opt/ffmpeglib/ffmpeg -i https://cdn.bitmovin.com/content/assets/art-of-motion-dash-hls-progressive/m3u8s/f08e80da-bf1d-4e3d-8899-f0f6155f6efa-audio-only.m3u8 -f hls -list_devices true 2>&1 | grep segment_
- 根据分片时长(比如10秒/片),计算2分钟对应的分片索引(第12片),直接下载该分片并截取:
/opt/ffmpeglib/ffmpeg -i https://cdn.bitmovin.com/content/assets/art-of-motion-dash-hls-progressive/audio/1_stereo_128000/hls/segment_12.ts -t 30 /tmp/out.aac -y
5. 启用FFmpeg的调试日志
添加-v debug参数获取更详细的错误信息,帮助定位SIGSEGV的触发点:
/opt/ffmpeglib/ffmpeg -v debug -ss 00:02:00 -t 30 -i https://cdn.bitmovin.com/content/assets/art-of-motion-dash-hls-progressive/m3u8s/f08e80da-bf1d-4e3d-8899-f0f6155f6efa-audio-only.m3u8 /tmp/out.aac -y
通过调试日志可以查看FFmpeg在处理分片时的内存分配、网络请求等细节,进一步排查问题。
内容的提问来源于stack exchange,提问作者Rashid Goshtasbi

