我目前正在编写一个小应用程序,它使用FFmpeg库来解码C ++中的音频文件(特别是avformat和swresample)。
现在我需要音频流中的样本总数。我知道确切的数字只能通过实际解码所有帧来找到,我只需要一个估计。 这里的首选方法是什么?如何查找文件的持续时间?
答案 0 :(得分:0)
在这个问题中有一些关于如何从ffmpeg获取信息的好信息:FFMPEG Can't Display The Duration Of a Video。
要计算音频流中的样本数,您需要三个基本信息位:
获得该信息后,您的信息流中的样本总数就是[持续时间] * [费率] * [渠道]。
请注意,这不等于字节,因为样本可能至少为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)。 所以这回答了你问题的第一部分。希望有所帮助。