2017-04-18 23 views
1

给定命令行ffmpeg -f lavfi -i "sine=frequency=1000:duration=5" -ar 8000 -c:a FOO pipe:1,ffmpeg可能会抱怨它“无法找到合适的输出格式”。对于某些编解码器,ffmpeg具有默认的容器格式,例如-c:a libmp3lame会产生MP3的。对于其他编解码器,你只需重复自己(排序):-c:a pcm_alaw -f alawffmpeg用于“原始”输出的格式/协议?

但是,如果我想流原始编解码器输出,并且没有匹配-f?我可以拿-f alaw并假设它没有做任何事情吗? (G711 alaw是一个简单的编解码器,它可以产生一个字节流,所以-f alaw大概就是复制那个字节流)

很明显,管道的另一端需要知道数据流如何解释,如果没有容器信息。但假定我已经知道管道的另一端正在等待以8 kHz采样的音频流,编码为-c:a FOO

回答

2

是的,原始数据流就是这样:没有封装编解码器的有效载荷。

为了清楚在你的命令语法起见,你可以使用data

ffmpeg -f lavfi -i "sine=frequency=1000:duration=5" -ar 8000 -c:a FOO -map 0 -f data pipe:1 
+0

'-map 0'完成了这个技巧。 – MSalters

1

我假设'生'你的意思是未压缩的音频样本(PCM)。

除了alaw之外,ffmpeg支持PCM格式的其他变化。

ffmpeg -formats | grep PCM 

显示

 
DE alaw   PCM A-law 
DE f32be   PCM 32-bit floating-point big-endian 
DE f32le   PCM 32-bit floating-point little-endian 
DE f64be   PCM 64-bit floating-point big-endian 
DE f64le   PCM 64-bit floating-point little-endian 
DE mulaw   PCM mu-law 
DE s16be   PCM signed 16-bit big-endian 
DE s16le   PCM signed 16-bit little-endian 
DE s24be   PCM signed 24-bit big-endian 
DE s24le   PCM signed 24-bit little-endian 
DE s32be   PCM signed 32-bit big-endian 
DE s32le   PCM signed 32-bit little-endian 
DE s8    PCM signed 8-bit 
DE u16be   PCM unsigned 16-bit big-endian 
DE u16le   PCM unsigned 16-bit little-endian 
DE u24be   PCM unsigned 24-bit big-endian 
DE u24le   PCM unsigned 24-bit little-endian 
DE u32be   PCM unsigned 32-bit big-endian 
DE u32le   PCM unsigned 32-bit little-endian 
DE u8    PCM unsigned 8-bit 

同样,

ffmpeg -codecs | grep PCM 

将显示PCM格式的音频编解码器的列表。

+0

都能跟得上;就像编解码器中出现的那样,这可能是也可能不是PCM的味道。请注意,alaw和mulaw本质上是有损压缩方案; 16到8位。 – MSalters

+0

感谢您的澄清。我认为'-f数据'由@Mulvya回答应该工作。 – wto