管道输入到ffmpeg

时间:2017-08-26 20:52:28

标签: ffmpeg

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

这可能吗?

如,

  1. 手动加载mp3文件
  2. 将其传输到ffmpeg衍生进程
  3. 获取原始输出
  4. (它应该适用于ffprobe和ffplay)

4 个答案:

答案 0 :(得分:5)

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

示例(输出采用PCM签名的16位小端格式):

cat file.mp3 | ffmpeg -f mp3 -i pipe: -c:a pcm_s16le -f s16le pipe:

管道文档是here
支持的音频类型为here

答案 1 :(得分:1)

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

MrBar的例子

ffmpeg -i file.mp3  -c:a pcm_s16le -f s16le pipe: | ffmpeg -f mp3 -i pipe: -c:a pcm_s16le -f s16le encoded.mp3

应阅读

ffmpeg -i file.mp3  -c:a pcm_s16le -f s16le pipe: | ffmpeg -f s16le -i pipe: -f mp3 encoded.mp3

答案 2 :(得分:0)

-pipe:

我找不到文件的记录位置,也没有耐心检查源,但是根据我对ffmpeg 4.2的测试,-似乎与pipe:完全相同.4,其中pipe:完成了in the documentation of the pipe protocol所提到的其他Linux实用程序中对-的通常期望:

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

例如,您可以从https://stackoverflow.com/a/45902691/895245重写命令

ffmpeg -f mp3 -i pipe: -c:a pcm_s16le -f s16le pipe: < file.mp3

更简单一些:

ffmpeg -f mp3 -i - -c:a pcm_s16le -f s16le - < file.mp3

相关:What does "dash" - mean as ffmpeg output filename

答案 3 :(得分:0)

由于您必须设置传入流的属性 - 您可能不喜欢它 - 这是我使用的另一种选择:使用 fifo 或管道(不是上面提到的那个)。

这是一个使用 wget 作为流源的示例,但是你可以使用任何东西,cat、nc,你可以命名它:

$ mkfifo tmp.mp4 # or any other format
$ wget -O tmp.mp4 https://link.mp4 &
$ ffmpeg -i tmp.mp4 YourFileHere.mp4

最后,您可能想要删除管道 - 您可以像删除普通文件一样删除它:

$ rm tmp.mp4

瞧!