如何告诉ffmpeg按顺序遍历目录中的所有文件

Posted

技术标签:

【中文标题】如何告诉ffmpeg按顺序遍历目录中的所有文件【英文标题】:How to tell ffmpeg to loop through all files in directory in order 【发布时间】:2014-10-08 19:42:42 【问题描述】:

ffmpeg 对此有 concat 选项,但经过一天的流式传输后,所有流都开始工作非常糟糕并且声音中断。

我尝试查看循环,但无法弄清楚如何使用 ffmpeg 命令执行循环,以便对 1 个目录中的所有文件进行转码

/lely/ffmpeg -y -re -i /home/ftp/kid1.mp4 -vcodec copy -acodec copy -dts_delta_threshold 1000 -ar 44100 -ab 32k -f flv rtmp://10.0.0.17:1935/live /孩子

在文件夹/home/ftp/ 中有文件kid1、kid2、kid3 - 所有*.mp4 文件

所以基本上我想要一个循环来每次前一个结束时将输入更改为下一个文件。

【问题讨论】:

【参考方案1】:

也许您可以使用findxargs 来帮助您为ffmpeg 提供文件:

find /home/ftp -name "*.mp4" | xargs -I $ /lely/ffmpeg -y -re -i $ -vcodec copy -acodec copy -dts_delta_threshold 1000 -ar 44100 -ab 32k -f flv rtmp://10.0.0.17:1935/live/kid

这里你先让find 查找/home/ftp 中的所有mp3 文件。

然后将结果提供给xargs。对于 xargs,你告诉它用你的 ffmpeg 字符串中的令牌 $ 替换它收到的输入。

【讨论】:

成功了,谢谢。但是由于某种原因它没有从第一个文件开始? 在 find pipe 和 xargs 之后添加一个合适的 sort 命令。像这样find | sort | xargs。您可以检查sort 参数以获得所需的排序类型。如果有帮助,请投票:)【参考方案2】:

您可以将视频文件连接到“命名管道”并将该管道用作 ffmpeg 的源。 例如:

    mkfifo pipeFile            # create a FIFO file (named pipe)
    cat $(find /home/ftp -name "*.mp4") > pipeFile &  # concatenate video files do the pipe (do not forget the "&" for running in background)
    /lely/ffmpeg -y -re -i pipeFile -vcodec copy -acodec copy -dts_delta_threshold 1000 -ar 44100 -ab 32k -f flv rtmp://10.0.0.17:1935/live/kid  # run ffmpeg with the pipe as the input

注意事项:

    输入中文件的顺序将是查找生成的。您可以在查找后添加“排序”命令,以排序方式生成文件。 我没有对此进行测试,因为我没有安装 ffmpeg。但是,它应该可以工作:-)

【讨论】:

以上是关于如何告诉ffmpeg按顺序遍历目录中的所有文件的主要内容,如果未能解决你的问题,请参考以下文章

如何遍历本地(服务器端)文件夹的所有元素?

FFmpeg Batch 同时遍历两个不同文件夹中的文件

PHP脚本循环遍历目录中的所有文件?

6.3 遍历字典

使用node.js按顺序读取目录内所有文件的内容

Android如何遍历特定目录下所有文件