FFmpeg:如何估计音频流中的样本数量?

时间:2015-08-14 17:07:12

标签: c++ audio ffmpeg

我目前正在编写一个小应用程序,它使用FFmpeg库来解码C ++中的音频文件(特别是avformat和swresample)。

现在我需要音频流中的样本总数。我知道确切的数字只能通过实际解码所有帧来找到,我只需要一个估计。 这里的首选方法是什么?如何查找文件的持续时间?

2 个答案:

答案 0 :(得分:0)

在这个问题中有一些关于如何从ffmpeg获取信息的好信息:FFMPEG Can't Display The Duration Of a Video

要计算音频流中的样本数,您需要三个基本信息位:

  1. 持续时间(以秒为单位)
  2. 采样率(每秒采样数)
  3. 流中的频道数(例如,立体声为2)
  4. 获得该信息后,您的信息流中的样本总数就是[持续时间] * [费率] * [渠道]。

    请注意,这不等于字节,因为样本可能至少为16位,可能为24位。

答案 1 :(得分:0)

我相信你需要的是AUDIORATE / FRAMERATE的公式。例如,如果ar = 48000,视频的帧速率为50fps,则每帧需要48000/50 = 960个样本。

缓冲区计算后来为samples_per_frame * nChannels * (audiobit/8)。 AudioBit通常是16位(也可以是24位或32位)。因此,对于16位48Khz的8通​​道音频,每个音频帧需要960 * 8 * 2 = 15360字节。 最后一次计算的正式方法是使用:

av_samples_get_buffer_size(NULL, nChannels, SamplesPerFrame, audio_st->codec->sample_fmt, 0) 功能

av_samples_get_buffer_size(NULL, 8, 960, audio_st->codec->sample_fmt, 0)

也将返回15360(对于专家:是的我假设格式为pcm_s16le)。 所以这回答了你问题的第一部分。希望有所帮助。