ffmpeg使用什么格式/协议进行“原始”输出?

4
给定一个命令行 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 alaw 但是如果我想流式传输原始编解码器输出,并且没有匹配的 -f 呢?我是否可以只取 -f alaw 并假设它不起作用?(G711 alaw 是一种简单的编解码器,它产生一个字节流,因此 -f alaw 可能只是复制该字节流)
显然,如果没有容器信息,另一端的管道需要知道如何解释数据流。但是假设我已经知道管道的另一端希望以 8 kHz 采样率、使用 -c:a FOO 编码的音频流。
2个回答

3

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

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

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

1
我假设你所说的“raw”是指未压缩的音频样本(PCM)。
除了alaw以外,ffmpeg还支持其他几种PCM格式的变体。
ffmpeg -formats | grep PCM

显示

 DE alaw            PCM A-law
 DE f32be           PCM 32位浮点数大端序
 DE f32le           PCM 32位浮点数小端序
 DE f64be           PCM 64位浮点数大端序
 DE f64le           PCM 64位浮点数小端序
 DE mulaw           PCM mu-law
 DE s16be           PCM 有符号16位大端序
 DE s16le           PCM 有符号16位小端序
 DE s24be           PCM 有符号24位大端序
 DE s24le           PCM 有符号24位小端序
 DE s32be           PCM 有符号32位大端序
 DE s32le           PCM 有符号32位小端序
 DE s8              PCM 有符号8位
 DE u16be           PCM 无符号16位大端序
 DE u16le           PCM 无符号16位小端序
 DE u24be           PCM 无符号24位大端序
 DE u24le           PCM 无符号24位小端序
 DE u32be           PCM 无符号32位大端序
 DE u32le           PCM 无符号32位小端序
 DE u8              PCM 无符号8位

类似地,

ffmpeg -codecs | grep PCM

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


不,"原始"指的是编解码器输出的任何内容,可能是PCM的某种变体,也可能不是。请注意,alaw和mulaw本质上是有损压缩方案;将16位转换为8位。 - MSalters
感谢澄清。我认为@Mulvya回答的“-f data”应该可以工作。 - wto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接