Audio FFMPEG-编码后获得精确计算的音频文件大小

Audio FFMPEG-编码后获得精确计算的音频文件大小,audio,ffmpeg,mp3,encode,filesize,Audio,Ffmpeg,Mp3,Encode,Filesize,在使用ffmpeg编码之前,我试图猜测音频(mp3)文件大小,之后,需要精确计算文件大小 下面是我用来预测和计算文件大小的公式(希望我没有错): (比特率x持续时间)/8)x 1000=以字节为单位的文件大小 我将给出一个真实的例子,这样每个人都能理解这个用例 示例: 具有包含以下数据的m4a文件: 名称:xxx.m4a 文件大小:8304014字节(8,3个月) 比特率:256k 持续时间:260秒 预期文件大小:((256 x 260)/8)x 1000=8 320 000字节 然后,我

在使用ffmpeg编码之前,我试图猜测音频(mp3)文件大小,之后,需要精确计算文件大小

下面是我用来预测和计算文件大小的公式(希望我没有错):

(比特率x持续时间)/8)x 1000=以字节为单位的文件大小

我将给出一个真实的例子,这样每个人都能理解这个用例

示例:

具有包含以下数据的m4a文件:

  • 名称:xxx.m4a
  • 文件大小:8304014字节(8,3个月)
  • 比特率: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字节和 不是预期的832万
  • 我的公式或ffmpeg命令中是否有错误
  • 您可以建议什么解决方案来获得准确的预测文件大小

提前感谢。

除了容器中固有的muxing开销外,MP3音频还存储在帧中。每帧有固定数量的1152个样本。编码器将输出完整帧,因此对于44100的输出采样率,最接近260秒的时间为

(260 x 44100/1152)的上限=9954帧=~260.02285秒

这会使您的计算本身失去平衡,即使编码假设是正确的

即使到那时,这一点也可能发挥作用

编辑

您可以降低比特率并添加静默填充,但这也不精确,因为muxing开销会起作用

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秒的持续时间计算。

除了容器固有的muxing开销外,MP3音频存储在帧中。每帧有固定数量的1152个样本。编码器将输出完整帧,因此对于44100的输出采样率,最接近260秒的时间为

(260 x 44100/1152)的上限=9954帧=~260.02285秒

这会使您的计算本身失去平衡,即使编码假设是正确的

即使到那时,这一点也可能发挥作用

编辑

您可以降低比特率并添加静默填充,但这也不精确,因为muxing开销会起作用

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秒的持续时间计算。

粘贴控制台输出。检查头顶上的muxing。很好的信息!我已经编辑了我的问题,并添加了控制台输出。你能告诉我头顶上的muxing是什么吗?我可以把它限制在0吗?(谢谢)粘贴控制台输出。检查头顶上的muxing。很好的信息!我已经编辑了我的问题,并添加了控制台输出。你能告诉我头顶上的muxing是什么吗?我可以把它限制在0吗?(谢谢)谢谢你的回复。尽管如此,您是否可以建议任何解决方案来达到我的目的?降低一点(使用255比特率),然后使用所需大小的ID3标记填充生成的文件。我需要向ffmpeg命令添加什么选项来“使用所需大小的ID3标记填充生成的文件”?再次感谢穆尔维亚。根据相关问题,现在我完全理解了填充理论。我这里的问题是,我认为我不能填充生成的文件,因为我通过HTTP应用程序/八位字节流头中的“管道:1”发送它。。。因此,我想我无法处理它:/除非我可以向ffmpeg命令添加一个选项,以便它添加一个虚拟数据,该数据将填充大小,直到它达到所需的大小,但同样,我必须知道ffmpeg将生成的初始文件大小,以便我可以添加额外的大小,除了ffmpeg命令,我再也负担不起其他命令了。谢谢你的回复。尽管如此,您是否可以建议任何解决方案来达到我的目的?降低一点(使用255比特率),然后使用所需大小的ID3标记填充生成的文件。我需要向ffmpeg命令添加什么选项来“使用所需大小的ID3标记填充生成的文件”?再次感谢穆尔维亚。根据相关问题,现在我完全理解了填充理论。我这里的问题是,我认为我不能填充生成的文件,因为我通过HTTP应用程序/八位字节流头中的“管道:1”发送它。。。因此,我想我无法处理它:/除非我可以向ffmpeg命令添加一个选项,以便它添加一个虚拟数据,该数据将填充大小,直到它达到所需的大小,但同样,我必须知道ffmpeg将生成的初始文件大小,以便我可以添加额外的大小,并且我负担不起ffmpeg命令之后的任何其他命令。