You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用FFmpeg循环推流文件夹内MP4文件至RTMP流时遭遇覆盖提示错误的求助

使用FFmpeg循环推流文件夹内MP4文件至RTMP流时遭遇覆盖提示错误的求助

看起来你想把原来手动逐个指定文件的循环推流逻辑,改成自动遍历文件夹里的所有MP4文件,但当前的写法出了问题——FFmpeg弹出了文件覆盖的提示,对吧?我来帮你分析下问题根源,再给出正确的实现方式。

问题原因分析

你当前的代码里,stream1=/myfolder/*.mp4这行在执行时,Shell会把*.mp4展开成所有匹配的文件名,比如变成/myfolder/10.mp4 /myfolder/11.mp4 /myfolder/12.mp4 /myfolder/13.mp4。当你把这个变量传给FFmpeg时,命令就变成了:

ffmpeg -re -i /myfolder/10.mp4 /myfolder/11.mp4 /myfolder/12.mp4 /myfolder/13.mp4 -vcodec copy -acodec copy -r 30 -s 1280x720 -f flv rtmp://localhost/live/output

FFmpeg会把第一个文件当成输入源,后面的所有文件都被误识别成输出文件,所以它才会询问你是否要覆盖/myfolder/11.mp4,这完全不是你想要的推流逻辑。

正确解决方案:逐个遍历文件推流

我们需要用循环逐个处理文件夹里的每个MP4文件,确保每次只给FFmpeg传入一个输入文件。这里用for循环结合Shell的文件匹配就能实现,同时还能处理文件夹为空的边界情况:

#!/bin/bash

while true; do
    # 按顺序遍历/myfolder下所有MP4文件
    for file in /myfolder/*.mp4; do
        # 避免文件夹为空时,*.mp4被当作字符串执行无效命令
        if [[ -f "$file" ]]; then
            echo "正在推流文件: $file"
            # -y 参数自动确认所有交互提示,确保脚本全自动运行
            ffmpeg -y -re -i "$file" -vcodec copy -acodec copy -r 30 -s 1280x720 -f flv rtmp://localhost/live/output
        fi
    done
done

关键细节说明

  • for file in /myfolder/*.mp4:每次循环将单个MP4文件路径赋值给$file变量,确保FFmpeg每次只处理一个输入源。
  • [[ -f "$file" ]]:做一个存在性检查,如果文件夹里没有MP4文件,*.mp4会被当作普通字符串,这个判断能避免执行无效的FFmpeg命令。
  • 用双引号包裹$file:如果你的文件名包含空格或特殊字符,双引号能避免Shell解析出错。
  • -y参数:自动确认所有FFmpeg的交互提示(比如可能的编码覆盖提示),保证脚本在无人值守时也能正常运行。

如果需要保持文件的推流顺序(比如10.mp4→11.mp4→12.mp4这样的顺序),当前的文件匹配逻辑已经能满足,因为数字开头的文件名会按字典序被遍历。

备注:内容来源于stack exchange,提问作者Allan Tori

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 09:39:39