Fffmpeg while 循环在处理完所有文件之前停止

Fffmpeg while 循环在处理完所有文件之前停止

我在一个名为“downloadmp3.txt”的文本文件中列出了 3k 个 URL,其格式如下:

url1,filename1
url2,filename2
...
url3000,filename3000

我使用在这里找到的代码片段编写了以下代码:

while read p; do

a=$( echo $p | cut -d',' -f1 )
b=$( echo $p | cut -d',' -f2 )

ffmpeg -nostdin -loglevel quiet -stats -i ${a} ${b}.mp3 &

done <downloadmp3.txt

我遇到的问题是,我的脚本下载了 3000 个 mp3 中的大约 500 个(有些是全部下载,有些是部分下载),然后就停止了。如果您能提供任何有关需要进行哪些更改的建议,我将不胜感激。

谢谢!

答案1

您没有显示任何可以提示潜在问题的日志,但您实际上是同时启动了 3000 个进程,这可能会产生意想不到的后果(例如,远程服务器终止连接)。由于将作业放在后台,因此一旦所有进程都启动起来,&循环应该会很快退出,但此时您有 3000 个作业正在运行……ffmpeg

我建议使用GNUparallel去下载n一次处理一个文件。

parallel --dry-run --colsep ',' ffmpeg -nostdin -loglevel error -stats -i {1} -c copy {2}.mp3 :::: downloadmp3.txt

这将读取文本文件并处理每一行,按 拆分列,。然后,您可以将列值用作{1}{2}等等。

它将并行运行以下命令,最多n每次运行多个作业。默认情况下n等于 CPU 核心数:

ffmpeg -nostdin -loglevel error -stats -i url1 -c copy filename1.mp3
ffmpeg -nostdin -loglevel error -stats -i url2 -c copy filename2.mp3
ffmpeg -nostdin -loglevel error -stats -i url3000 -c copy filename3000.mp3

--dry-run当打印出您想要的内容时删除。

您可以添加--joblog jobs.txt以使其创建日志文件,还可以添加--eta--progress打印出一些关于作业何时完成的估计值。可以使用来设置并行作业的数量-j

请注意,我添加了,-c copy因为如果 URL 已经指向现有的 MP3 文件,您通常不想重新编码音频流。如果您的输入不是 MP3,您可能想再次省略-c copy。我将其更改quieterror,因为您可能希望显示错误。

相关内容