ffmpeg 使用什么 format/protocol 输出 "raw"?

What format/protocol does ffmpeg use for "raw" output?

给定命令行 ffmpeg -f lavfi -i "sine=frequency=1000:duration=5" -ar 8000 -c:a FOO pipe:1,ffmpeg 可能会抱怨它是 "unable to find a suitable output format"。对于某些编解码器,ffmpeg 具有默认的容器格式,例如-c:a libmp3lame 会制作 MP3。对于其他编解码器,您只需重复自己(有点):-c:a pcm_alaw -f alaw

但是,如果我想流式传输原始编解码器输出,但没有匹配的 -f 怎么办?我可以只接受 -f alaw 并假设它什么都不做吗? (G711 alaw 是一种产生字节流的简单编解码器,因此 -f alaw 大概只是复制该字节流)

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

编码

我认为 'raw' 你指的是未压缩的音频样本 (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 格式的音频编解码器列表。

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

为了您的命令语法清晰,您可以使用 data

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