FFmpeg sample_fmt 实际上并未改变 bit _depth + 缺少支持的样本格式

FFmpeg sample_fmt 实际上并未改变 bit _depth + 缺少支持的样本格式

免责声明:我是这方面的新手,这个问题可能很愚蠢

我正在尝试将 mp3 文件的位深度从 32 更改为 16,同时更改比特率

这是我的命令: ffmpeg -i input.mp3 -sample_fmt s16p -vsync 2 -b:a 256k output2.mp3 比特率成功改变,但位深度没有改变。

这些就是结果。

输入文件: ffprobe -i input.mp3

Duration: 00:04:40.08, start: 0.025056, bitrate: 323 kb/s
Stream #0:0: Audio: mp3, 44100 Hz, stereo, fltp, 320 kb/s

输出文件: ffprobe -i output.mp3

Duration: 00:04:40.08, start: 0.025056, bitrate: 283 kb/s
Stream #0:0: Audio: mp3, 44100 Hz, stereo, fltp, 256 kb/s

或者换句话说,这是 VLC 的媒体编解码器给我的: 当前媒体信息

我们可以看到 fltp,经过谷歌搜索,我认为它意味着 32 位

现在这是使用s16p但如果我尝试s16我得到以下信息:

[libmp3lame @ 000001645fdcaec0] Specified sample format s16 is not supported by the libmp3lame encoder
[libmp3lame @ 000001645fdcaec0] Supported sample formats:
[libmp3lame @ 000001645fdcaec0]   s32p
[libmp3lame @ 000001645fdcaec0]   fltp
[libmp3lame @ 000001645fdcaec0]   s16p

有趣的是,如果我输入,ffmpeg -sample_fmts我会得到这个:

name   depth
u8        8
s16      16
s32      32
flt      32
dbl      64
u8p       8
s16p     16
s32p     32
fltp     32
dblp     64
s64      64
s64p     64

这似乎意味着 s16 应该可以工作了,不是吗?我是不是完全忽略了什么?发生了什么?

答案1

MP3 文件中的压缩数据经过编码,因此没有任何固有的存储格式或位深度。指Supported sample formats的是编码器接受处理的样本格式。

output.mp3 显示的样本格式是解码器发出的格式。默认情况下,ffmpeg 使用 mp3float 解码器,该解码器输出单精度浮点样本。要获取 16 位整数,请强制使用 mp3 定点解码器,

ffmpeg -c:a mp3 -i output.mp3

(ffprobe不支持自定义解码器规范)

相关内容