FFMPEG - 编码后获取准确计算的音频文件大小
FFMPEG - Get the exact calculated audio filesize after encode
我试图在使用 ffmpeg 编码之前猜测音频 (mp3) 文件大小,之后,需要计算出准确的文件大小。
这是我用来预测和计算文件大小的公式(希望我没有错):
(比特率 x 持续时间)/ 8) x 1000 = 文件大小(以字节为单位)。
我将举一个真实的例子,以便大家理解用例。
示例:
有一个包含以下数据的 m4a 文件:
- 名称:假设 xxx.m4a
- 文件大小:8 304 014 字节 (8,3 Mo)
- 比特率:256k
- 持续时间:260 秒
预期文件大小:( (256 x 260) / 8 ) x 1000 = 8 320 000 字节
然后输入 运行 以下 ffmpeg 命令:
ffmpeg -i xxx.m4a -f mp3 -y -minrate 256k -maxrate 256k -bufsize 256k -b:a 256k -fs 8320000 output.mp3
控制台输出:
ffmpeg version 2.7.2 Copyright (c) 2000-2015 the FFmpeg developers
built with Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
configuration: --prefix=/usr/local/Cellar/ffmpeg/2.7.2_1 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-opencl --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-vda
libavutil 54. 27.100 / 54. 27.100
libavcodec 56. 41.100 / 56. 41.100
libavformat 56. 36.100 / 56. 36.100
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 16.101 / 5. 16.101
libavresample 2. 1. 0 / 2. 1. 0
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 2.100 / 1. 2.100
libpostproc 53. 3.100 / 53. 3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'xxx.m4a':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2mp41
encoder : Lavf56.36.100
Duration: 00:04:20.53, start: 0.000000, bitrate: 254 kb/s
Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 253 kb/s (default)
Metadata:
handler_name : SoundHandler
Output #0, mp3, to 'output.mp3':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2mp41
TSSE : Lavf56.36.100
Stream #0:0(und): Audio: mp3 (libmp3lame), 44100 Hz, stereo, fltp, 256 kb/s (default)
Metadata:
handler_name : SoundHandler
encoder : Lavc56.41.100 libmp3lame
Stream mapping:
Stream #0:0 -> #0:0 (aac (native) -> mp3 (libmp3lame))
Press [q] to stop, [?] for help
size= 8127kB time=00:04:20.02 bitrate= 256.1kbits/s
video:0kB audio:8127kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.011765%
问题与疑问:
- 你能告诉我为什么我得到一个 8 322 546 字节的输出并且
不是预期的 8 320 000 ?
- 我的公式或ffmpeg命令有问题吗?
- 您可以建议什么解决方案来获得准确的预测文件大小?
提前致谢。
除了容器固有的多路复用开销外,MP3 音频以帧的形式存储。每帧有固定数量的 1152 个样本。编码器将输出完整帧,因此对于 44100 的输出采样率,最接近 260 秒的是
ceiling of (260 x 44100/1152) = 9954 frames = ~260.02285 seconds.
这会使您的计算本身失去平衡,即使编码假设是正确的。
即便如此,bit reservoir 也可能发挥作用。
编辑:
您可以降低比特率并添加静音填充,但这也不准确,因为混合开销开始发挥作用
ffmpeg -i xxx.m4a -f lavfi -t 5 -i anullsrc -lavfi "[0:a][1:a]concat=n=2:v=0:a=1" -f mp3 -y -minrate 224k -maxrate 224k -bufsize 224k -b:a 224k -fs N output.mp3
这里fs
应该是按MP3+5秒计算的
我试图在使用 ffmpeg 编码之前猜测音频 (mp3) 文件大小,之后,需要计算出准确的文件大小。
这是我用来预测和计算文件大小的公式(希望我没有错):
(比特率 x 持续时间)/ 8) x 1000 = 文件大小(以字节为单位)。
我将举一个真实的例子,以便大家理解用例。
示例:
有一个包含以下数据的 m4a 文件:
- 名称:假设 xxx.m4a
- 文件大小:8 304 014 字节 (8,3 Mo)
- 比特率:256k
- 持续时间:260 秒
预期文件大小:( (256 x 260) / 8 ) x 1000 = 8 320 000 字节
然后输入 运行 以下 ffmpeg 命令:
ffmpeg -i xxx.m4a -f mp3 -y -minrate 256k -maxrate 256k -bufsize 256k -b:a 256k -fs 8320000 output.mp3
控制台输出:
ffmpeg version 2.7.2 Copyright (c) 2000-2015 the FFmpeg developers
built with Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
configuration: --prefix=/usr/local/Cellar/ffmpeg/2.7.2_1 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-opencl --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-vda
libavutil 54. 27.100 / 54. 27.100
libavcodec 56. 41.100 / 56. 41.100
libavformat 56. 36.100 / 56. 36.100
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 16.101 / 5. 16.101
libavresample 2. 1. 0 / 2. 1. 0
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 2.100 / 1. 2.100
libpostproc 53. 3.100 / 53. 3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'xxx.m4a':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2mp41
encoder : Lavf56.36.100
Duration: 00:04:20.53, start: 0.000000, bitrate: 254 kb/s
Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 253 kb/s (default)
Metadata:
handler_name : SoundHandler
Output #0, mp3, to 'output.mp3':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2mp41
TSSE : Lavf56.36.100
Stream #0:0(und): Audio: mp3 (libmp3lame), 44100 Hz, stereo, fltp, 256 kb/s (default)
Metadata:
handler_name : SoundHandler
encoder : Lavc56.41.100 libmp3lame
Stream mapping:
Stream #0:0 -> #0:0 (aac (native) -> mp3 (libmp3lame))
Press [q] to stop, [?] for help
size= 8127kB time=00:04:20.02 bitrate= 256.1kbits/s
video:0kB audio:8127kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.011765%
问题与疑问:
- 你能告诉我为什么我得到一个 8 322 546 字节的输出并且 不是预期的 8 320 000 ?
- 我的公式或ffmpeg命令有问题吗?
- 您可以建议什么解决方案来获得准确的预测文件大小?
提前致谢。
除了容器固有的多路复用开销外,MP3 音频以帧的形式存储。每帧有固定数量的 1152 个样本。编码器将输出完整帧,因此对于 44100 的输出采样率,最接近 260 秒的是
ceiling of (260 x 44100/1152) = 9954 frames = ~260.02285 seconds.
这会使您的计算本身失去平衡,即使编码假设是正确的。
即便如此,bit reservoir 也可能发挥作用。
编辑:
您可以降低比特率并添加静音填充,但这也不准确,因为混合开销开始发挥作用
ffmpeg -i xxx.m4a -f lavfi -t 5 -i anullsrc -lavfi "[0:a][1:a]concat=n=2:v=0:a=1" -f mp3 -y -minrate 224k -maxrate 224k -bufsize 224k -b:a 224k -fs N output.mp3
这里fs
应该是按MP3+5秒计算的