2015-08-14 35 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)。 所以這回答你的問題的第一部分。希望有所幫助。