如何在PowerShell中实现streamlink与ffmpeg的二进制数据流管道
在PowerShell中实现Streamlink与FFmpeg的管道操作(无需调用cmd)
完全可以直接在PowerShell中实现这个管道操作,不用借助Start-Process调用cmd。PowerShell虽然主打对象管道,但对于原生可执行文件的输出,默认会以字节流的形式在管道中传递,和cmd的管道行为一致,刚好适配视频流的传输需求。
直接执行管道命令
你可以直接在PowerShell中运行类似cmd的命令写法:
streamlink $stream_url best -O | ffmpeg -i pipe: "output_file.mp4"
- 这里
streamlink的-O参数会将视频流输出到标准输出(stdout),PowerShell会直接把这个字节流传递给ffmpeg的标准输入(stdin),ffmpeg通过pipe:读取输入流并转存为文件。 - 如果
$stream_url包含特殊字符(比如空格、&等),可以用双引号包裹变量:streamlink "$stream_url" best -O,避免参数解析错误。
获取退出码
获取最后一个命令的退出码
PowerShell的$LASTEXITCODE变量会存储最后一个执行的原生可执行文件的退出码,也就是上述命令中ffmpeg的退出码:
streamlink $stream_url best -O | ffmpeg -i pipe: "output_file.mp4" $ffmpegExitCode = $LASTEXITCODE Write-Host "FFmpeg退出码: $ffmpegExitCode"
获取两个命令的退出码
如果需要同时获取streamlink和ffmpeg的退出码,不能直接用单条管道(因为管道只会保留最后一个命令的退出码),可以分两步处理:
- 先执行
streamlink并捕获其退出码,同时将输出传递给ffmpeg - 再获取
ffmpeg的退出码
示例代码:
# 执行streamlink,捕获输出和退出码 $streamlinkOutput = & streamlink $stream_url best -O 2>&1 $streamlinkExitCode = $LASTEXITCODE # 将streamlink的输出传递给ffmpeg $streamlinkOutput | & ffmpeg -i pipe: "output_file.mp4" $ffmpegExitCode = $LASTEXITCODE Write-Host "Streamlink退出码: $streamlinkExitCode" Write-Host "FFmpeg退出码: $ffmpegExitCode"
- 注意:这种方式会先将
streamlink的输出暂存到内存中,如果是长时间的直播流,可能会占用较多内存。如果只关注ffmpeg的退出码,直接用单条管道即可。
内容的提问来源于stack exchange,提问作者krawieck
相关产品推荐
相关产品推荐

