当 FFmpeg 读取 pipe:0 时,它的输入协议是管道。如果媒体是 curl 抓取的,那么网络连接是 curl 打开的,代理配置就必须交给 curl。

对于顺序的 MPEG-TS 输入,一个 Bash 管道可以写成:

set -o pipefail
curl --fail --silent --show-error \
  --proxy http://proxy.example.net:8080 --noproxy "" \
  'https://media.example.net/stream.ts' |
  ffmpeg -i pipe:0 -c copy output.ts

对于允许的公共媒体下载,HTTP 代理列表可以为 curl 的代理 URL 提供候选。把绕过列表留空,这个 curl 请求就会走选定的中间人。pipefail 还能让上游的下载失败保留在管道的退出状态里。

FFmpeg 的 http_proxy 选项属于它支持的 HTTP 网络输入。仅仅因为某个程序的输出被管道送进 FFmpeg,并不能用它来配置那个程序。

如果该由 FFmpeg 负责下载,就直接把媒体 URL 交给它,并使用它所选协议和构建支持的选项。对于 HTTP 输入,把 FFmpeg 的代理选项放在该输入之前。管道也没有普通的文件寻址,所以在 URL 输入和管道输入之间切换时,要保留现有工作流的格式要求。

相关文章