You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将ffmpeg输出存入变量并通过curl上传至Telegram

原命令失效原因

你的写法存在两个核心逻辑错误:

  • cat > out 是将流内容写入当前目录下名为out的磁盘文件,并非存入shell变量;同时管道是单向顺序传输,cat > out 会把输入流全部写入文件,不会向后传递内容给后续curl命令。你在curl里引用的$out是未定义的空变量,自然不会产生预期效果。
  • Shell变量本身为存储文本设计,直接承载二进制视频流会因为特殊字符转义、空字符截断等问题导致文件损坏,本身就不适合存这类内容。
可行实现方式

方案1:流式直传(无临时文件、性能最好)

不需要存变量也不需要落盘,直接通过管道把ffmpeg输出传给curl即可,curl支持用-代表从标准输入读取上传内容,命令如下:

ffmpeg -i test.mp4 -f avi pipe:1 2>/dev/null | curl -F "document=@-;filename=converted.avi" https://api.telegram.org/bot<替换为你的bot token>/sendDocument?chat_id=<替换为你的chat_id>

参数说明:

  • 加2>/dev/null是为了屏蔽ffmpeg默认输出到stderr的进度、日志信息,避免日志内容混入二进制流导致上传文件损坏。如果需要保留转码日志,可以把stderr重定向到单独日志文件,比如写成2>ffmpeg_transcode.log。
  • 必须加;filename=converted.avi指定上传文件名,否则Telegram侧收到的文件没有合法后缀,无法被识别为正常视频文件。

方案2:临时文件中转(适合需要留存转码结果的场景)

如果你转码后的文件需要后续复用,不要用变量存二进制内容,写入临时文件是兼容性最高、最稳妥的方式:

# 执行转码输出到本地文件
ffmpeg -i test.mp4 -f avi out.avi
# 确认文件生成成功且大小不为0后执行上传
if [ -s out.avi ]; then
  curl -F document=@out.avi https://api.telegram.org/bot<替换为你的bot token>/sendDocument?chat_id=<替换为你的chat_id>
fi

不推荐用Shell变量直接存储ffmpeg输出的二进制内容:Shell对二进制数据的处理存在很多固有缺陷,很容易出现内容截断、字符转义导致的文件损坏,就算通过base64编码绕开兼容问题,也会额外增加1/3的体积开销和编解码性能损耗,没有实用价值。

内容的提问来源于stack exchange,提问作者H4CK3R 5M4CK3R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 05:06:04