如何配置FFmpeg实现m3u8文件中ts分片的多线程下载?
如何让FFmpeg多线程下载m3u8提升速度
刚好碰到过类似的问题,FFmpeg默认处理HLS(m3u8)时是单线程下载分片的,这就导致带宽利用率上不去,下载速度慢得让人着急。给你两个实用的优化方案,亲测有效:
1. 直接用FFmpeg内置参数开启多线程
不需要额外工具,在你原来的命令基础上添加几个参数就能开启多线程下载:
ffmpeg -threads 8 -http_persistent 1 -hls_flags multi_threaded_demux -i <source m3u8 file> -c copy target.mp4
这里的参数解释下:
-threads 8:指定FFmpeg使用的线程数,你可以根据自己的CPU和网络情况调整(比如4、8、16,别超过CPU核心数太多)-http_persistent 1:开启HTTP持久连接,避免每次下载分片都重新握手建立连接,减少不必要的开销-hls_flags multi_threaded_demux:启用HLS多线程解复用,让FFmpeg同时下载多个ts分片,直接拉满带宽
2. 配合aria2c多线程下载(速度提升更明显)
如果FFmpeg自带的多线程效果还是不够理想,试试用aria2c先批量下载所有分片,再用FFmpeg合并——这种方式对大部分m3u8都能带来显著的速度提升:
第一步:用aria2c批量下载分片
直接让aria2c解析m3u8文件,同时开启多线程下载:
aria2c -x 16 -s 16 -i <source m3u8 file> -d ./ts_fragments
参数说明:
-x 16:最大同时下载的线程数-s 16:每个分片文件的最大连接数-d ./ts_fragments:指定分片保存的目录,方便后续合并
第二步:用FFmpeg合并分片
下载完成后,需要创建一个分片列表文件(比如命名为filelist.txt),内容格式要像这样:
file './ts_fragments/xxx.ts' file './ts_fragments/yyy.ts' file './ts_fragments/zzz.ts' ...
你可以用脚本自动生成这个列表(比如Linux下用ls ./ts_fragments/*.ts | sed 's/^/file /' > filelist.txt),然后用FFmpeg合并:
ffmpeg -f concat -safe 0 -i filelist.txt -c copy target.mp4
-f concat:使用FFmpeg的concat解复用器来合并文件-safe 0:允许使用跨目录或者绝对路径的文件,避免报错
小提醒
- 有些网站的m3u8有防盗链限制,这时候不管用FFmpeg还是aria2c,都需要添加请求头参数(比如FFmpeg用
-headers "Referer: 原网页URL",aria2c用-H "Referer: 原网页URL") - 线程数不是越高越好,太高可能会触发服务器的限流机制,反而导致速度变慢,建议从8-16开始测试,找到适合自己网络的数值
内容的提问来源于stack exchange,提问作者xichun lin
相关产品推荐
相关产品推荐

