免责声明:我是这方面的新手,这个问题可能很愚蠢
我正在尝试将 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不支持自定义解码器规范)