管道式 FFmpeg 输入中,代理归下载程序所有
当 FFmpeg 只收到一个字节管道时,把代理配置放在负责抓取媒体的程序上。
当 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 输入和管道输入之间切换时,要保留现有工作流的格式要求。