如何从Cloudflare保护的m3u8文件下载字幕?ffmpeg执行失败求助
问题还原
执行以下FFmpeg命令下载M3U8格式的VTT字幕时失败:
ffmpeg -i https://manifest-gcp-us-east1-vop1.cfcdn.mux.com/nCuL1I6vazd2gTqez6v8cW96dY6kB02KK2i008fUX5L8EjUpCcCJagIoZ2Uu01cAZFC0102nF5SzBm8M/subtitles.m3u8?cdn=cloudflare&expires=1687752000&signature=NjQ5OTBkNDBfYTExYTNkOTRlZTg1ZWU0NjUwZWUzNGFiMzFkZDgyNDFkMzU2OGU0YmExZGQzZGIyNWE5MjJkMGE3ZTdmOTM3YQ== output.vtt
报错信息:
加载第一个分片'https://chunk-gcp-us-east1-vop1.cfcdn.mux.com/v1/subtitle/nCuL1I6vazd2gTqez6v8cW96dY6kB02KK2i008fUX5L8EjUpCcCJagIoZ2Uu01cAZFC0102nF5SzBm8M/0.vtt?skid=default&signature=MF9lY2EwNmQxODg5OGQ5MTQxY2E1NjU2MDNiOTdkNDBhMGJjNzU1N2EwOGQ2N2E1MmE2NTI0Y2Y5MTQxNDZlYjc2'失败,https://manifest-gcp-us-east1-vop1.cfcdn.mux.com/nCuL1I6vazd2gTqez6v8cW96dY6kB02KK2i008fUX5L8EjUpCcCJagIoZ2Uu01cAZFC0102nF5SzBm8M/subtitles.m3u8?cdn=cloudflare:处理输入时发现无效数据。
原因及解决步骤
1. 修复URL参数截断问题
原命令中URL包含&符号,在Shell环境下会被解析为后台执行标记,导致expires和signature参数丢失,服务器收到不完整请求后返回无效数据。
修正命令:给URL加上双引号,确保完整参数传递:
ffmpeg -i "https://manifest-gcp-us-east1-vop1.cfcdn.mux.com/nCuL1I6vazd2gTqez6v8cW96dY6kB02KK2i008fUX5L8EjUpCcCJagIoZ2Uu01cAZFC0102nF5SzBm8M/subtitles.m3u8?cdn=cloudflare&expires=1687752000&signature=NjQ5OTBkNDBfYTExYTNkOTRlZTg1ZWU0NjUwZWUzNGFiMzFkZDgyNDFkMzU2OGU0YmExZGQzZGIyNWE5MjJkMGE3ZTdmOTM3YQ==" output.vtt
2. 验证分片权限与签名有效性
如果加引号后仍失败,手动访问M3U8链接查看分片列表,再尝试单独访问分片URL:
- 若分片无法打开,说明签名已过期或权限不足,需重新获取有效的M3U8链接。
3. 更新FFmpeg版本
旧版FFmpeg对部分M3U8格式支持有限,更新到最新稳定版后重试。
4. 替代方案:使用yt-dlp下载
yt-dlp对加密/签名的M3U8支持更完善,命令示例:
yt-dlp --write-subs --skip-download "https://manifest-gcp-us-east1-vop1.cfcdn.mux.com/nCuL1I6vazd2gTqez6v8cW96dY6kB02KK2i008fUX5L8EjUpCcCJagIoZ2Uu01cAZFC0102nF5SzBm8M/subtitles.m3u8?cdn=cloudflare&expires=1687752000&signature=NjQ5OTBkNDBfYTExYTNkOTRlZTg1ZWU0NjUwZWUzNGFiMzFkZDgyNDFkMzU2OGU0YmExZGQzZGIyNWE5MjJkMGE3ZTdmOTM3YQ=="
内容的提问来源于stack exchange,提问作者ZombZ

