FFmpeg sample_fmt は実際にはビット _depth を変更しません + サポートされているサンプル形式がありません

FFmpeg sample_fmt は実際にはビット _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はGoogleで検索すると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 はカスタムデコーダー仕様をサポートしていません)

関連情報