我正在尝试使用ffmpeg来解码音频数据。虽然它可以从文件加载,但我想避免使用文件,因为这样做意味着我必须使用临时文件。相反,我想使用stdin管道输入数据(我以前加载过)。
这可能吗?
如,
(它应该适用于ffprobe和ffplay)
答案 0 :(得分:5)
ffmpeg有一个特殊的管道标志,指示程序使用stdin。 请注意,几乎总是需要明确定义输入格式。
示例(输出采用PCM签名的16位小端格式):
cat file.mp3 | ffmpeg -f mp3 -i pipe: -c:a pcm_s16le -f s16le pipe:
答案 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
答案 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
瞧!