使用FFmpeg循环播放文件夹MP4流时进程被终止的问题求助
解决FFmpeg循环推流MP4文件时被Killed的问题
看起来你遇到的Killed错误大概率是内存不足导致的——你的脚本用了filter_complex的concat滤镜,这个滤镜会把所有输入的MP4文件都加载到内存里,一旦视频数量多或者单文件体积大,系统内存扛不住就会被内核强制杀掉FFmpeg进程。
下面给你两个可行的解决方案,优先推荐第一个,因为它更高效、更稳定:
方案1:使用FFmpeg Concat Demuxer(推荐)
这个方式是通过文本列表指定要播放的文件,FFmpeg会逐个读取处理,不会一次性把所有文件塞进内存,完美解决内存溢出问题,还能轻松实现持续循环推流。
修改后的完整脚本如下:
#!/bin/bash VBR="2500k" FPS="30" QUAL="medium" # 注意:你的推流地址是Twitch的,建议把变量名改成TWITCH_URL更清晰 TWITCH_URL="rtmp://live.twitch.tv/app/" FOLDER="videos" KEY="live_16xxxxxxxxxxx_xxxvO7C" # 持续循环推流逻辑 while true; do # 生成临时文件列表(每次循环重新生成,适配文件夹内文件的变动) rm -f playlist.txt for f in "$FOLDER"/*.mp4; do # 写入绝对路径,配合后续的-safe 0参数避免FFmpeg路径权限问题 echo "file '$PWD/$f'" >> playlist.txt done # 启动FFmpeg推流 ffmpeg \ -f concat -safe 0 -i playlist.txt \ -deinterlace \ -vcodec libx264 -pix_fmt yuv420p -preset "$QUAL" -r "$FPS" -g $((FPS * 2)) -b:v "$VBR" \ -acodec libmp3lame -ar 44100 -threads 6 -b:a 712000 -bufsize 512k \ -f flv "$TWITCH_URL/$KEY" # 如果FFmpeg意外退出,短暂等待后自动重启循环 echo "FFmpeg进程退出,2秒后重新启动推流..." sleep 2 done
脚本关键说明:
while true实现无限循环,即使某段视频播放出错或推流临时中断,也会自动重启推流playlist.txt是临时生成的文件列表,每次循环都会重新生成,如果你在videos文件夹新增/删除MP4,下次循环会自动生效-f concat -safe 0告诉FFmpeg使用concat demuxer模式,-safe 0允许列表使用绝对路径,避免相对路径的访问权限问题- 移除了原脚本里的
qscale 3,因为libmp3lame编码器在指定b:a比特率后,qscale的参数会被覆盖,保留它没有实际作用
方案2:优化原Concat Filter的内存占用(不推荐)
如果你非要坚持使用原脚本的filter_complex concat方式,只能通过扩容系统内存或临时启用swap交换空间来缓解,但本质上还是不如demuxer高效。比如临时创建1GB swap:
# 创建1GB的swap文件 sudo fallocate -l 1G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile
注意:这是临时方案,系统重启后swap会失效,且如果视频数量过多,还是会触发内存溢出被杀掉,因此优先选择方案1。
额外注意事项:
- 原脚本里的
YOUTUBE_URL变量实际指向Twitch的推流地址,建议改成TWITCH_URL,避免后续维护时混淆 - 确保
videos文件夹内的MP4文件编码格式统一(比如都是H.264视频+AAC音频),如果编码不一致,推流可能出现花屏、无声音等问题,遇到这种情况建议先统一转码格式
内容的提问来源于stack exchange,提问作者Tregor
相关产品推荐
相关产品推荐

