我在一个名为“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
。我将其更改quiet
为error
,因为您可能希望显示错误。