FFmpeg: How to estimate number of samples in audio

2019-07-12 20:19发布

问题:

I'm currently writing a small application that's making use of the FFmpeg library in order to decode audio files (especially avformat and swresample) in C++.

Now I need the total number of samples in an audio stream. I know that the exact number can only be found out by actually decoding all the frames, I just need an estimation. What is the preferred method here? How can I find out the duration of a file?

回答1:

There's some good info in this question about how to get info out of ffmpeg: FFMPEG Can't Display The Duration Of a Video.

To work out the number of samples in an audio stream, you need three basic bits of info:

  1. The duration (in seconds)
  2. The sample rate (in samples per second)
  3. The number of channels in the stream (e.g. 2 for stereo)

Once you have that info, the total number of samples in your stream is simply [duration] * [rate] * [channels].

Note that this is not equivalent to bytes, as the samples are likely to be at least 16 bit, and possibly 24.



回答2:

I believe what you need is the formula that is AUDIORATE / FRAMERATE. For instance, if ar=48000, and frame rate of video is let's say 50fps then 48000/50 = 960 samples per frame you need.

Buffer calculation comes later as samples_per_frame * nChannels * (audiobit/8). AudioBit is usually 16bit (24 or 32bits also possible). So for 8 channels audio at 16bit 48Khz, you'll need 960 * 8 * 2 = 15360 bytes per audio frame. Offical way to do this last calculation is to use :

av_samples_get_buffer_size(NULL, nChannels, SamplesPerFrame, audio_st->codec->sample_fmt, 0) function.

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

will return also 15360 (For experts: yes I'm assuming format is pcm_s16le). So this answers first part of your question. Hope that helps.



标签: c++ audio ffmpeg