管道输入到ffmpeg

11 ffmpeg

我正在尝试使用ffmpeg来解码音频数据.虽然它可以从文件加载,但我想避免使用文件,因为这样做意味着我必须使用临时文件.相反,我想使用stdin管道数据(我以前加载过).

这可能吗?

例如,

  1. 手动加载mp3文件
  2. 将其输入到ffmpeg生成的进程中
  3. 得到原始输出

(它应该与ffprobe和ffplay一起使用)

Cir*_*四事件 12

-是相同的pipe:

我找不到它的文档记录,而且我没有耐心检查源代码,但根据我对 ffmpeg 4.2.4 的测试,它-似乎完全相同,您通常在其他 Linux 中期望的在哪里管道协议文档中提到的实用程序:pipe:pipe:-

如果未指定 number,则默认情况下将使用 stdout 文件描述符进行写入,使用 stdin 进行读取。

例如,您可以重写/sf/answers/3213188401/中的命令

ffmpeg -f mp3 -i pipe: -c:a pcm_s16le -f s16le pipe: < file.mp3
Run Code Online (Sandbox Code Playgroud)

更简单一点:

ffmpeg -f mp3 -i - -c:a pcm_s16le -f s16le - < file.mp3
Run Code Online (Sandbox Code Playgroud)

相关:“破折号”是什么意思 - 作为 ffmpeg 输出文件名


MrB*_*Bar 7

ffmpeg有一个特殊的管道标志,指示程序使用stdin。请注意,几乎总是需要明确定义输入格式。

示例(输出为PCM有符号16位little-endian格式):

cat file.mp3 | ffmpeg -f mp3 -i pipe: -c:a pcm_s16le -f s16le pipe:
Run Code Online (Sandbox Code Playgroud)

管道文档在这里,
支持的音频类型在这里

  • 是的你可以!`ffmpeg -i file.mp3 -c:pcm_s16le -f s16le管道:| ffmpeg -f mp3 -i管道:-c:a pcm_s16le -f s16le encoding.mp3` (2认同)
  • 非常感谢。我很惊讶几乎没有人提到这一点。Unix 管道是自从切片面包以来最好的东西(虽然我不知道切片面包有什么了不起) (2认同)

ota*_*aka 7

我没有足够的声誉来添加评论,所以...

巴尔先生的例子

ffmpeg -i file.mp3  -c:a pcm_s16le -f s16le pipe: | ffmpeg -f mp3 -i pipe: -c:a pcm_s16le -f s16le encoded.mp3
Run Code Online (Sandbox Code Playgroud)

应该读,

ffmpeg -i file.mp3  -c:a pcm_s16le -f s16le pipe: | ffmpeg -f s16le -i pipe: -f mp3 encoded.mp3
Run Code Online (Sandbox Code Playgroud)