2015-08-14 136 views
1

我目前正在编写一个使用FFmpeg库来解码C++中的音频文件(尤其是avformat和swresample)的小应用程序。FFmpeg:如何估计音频流中的采样数量?

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

回答

0

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

若要出样本的数量在音频流,则需要的信息的三个基本位:

  1. 的持续时间(以秒计)
  2. 采样率(以每秒的样本)
  3. 流中的通道数(例如,2个立体声)

一旦获得了该信息,流中的样本总数仅为[duration] * [rate] * [channels]。

注意,这不等同于字节为样本很可能是至少16位,并可能24

0

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

缓冲区计算后来的为samples_per_frame * nChannels * (audiobit/8)。 AudioBit通常是16bit(24或32bits也是可能的)。因此,对于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)。 所以这回答你的问题的第一部分。希望有所帮助。