【发布时间】:2015-11-08 00:27:48
【问题描述】:
我目前正在编写一个使用 FFmpeg 库来解码 C++ 中的音频文件(尤其是 avformat 和 swresample)的小型应用程序。
现在我需要音频流中的样本总数。我知道确切的数字只能通过实际解码所有帧才能找到,我只需要一个估计。 这里首选的方法是什么?如何找出文件的持续时间?
【问题讨论】:
我目前正在编写一个使用 FFmpeg 库来解码 C++ 中的音频文件(尤其是 avformat 和 swresample)的小型应用程序。
现在我需要音频流中的样本总数。我知道确切的数字只能通过实际解码所有帧才能找到,我只需要一个估计。 这里首选的方法是什么?如何找出文件的持续时间?
【问题讨论】:
关于如何从 ffmpeg 中获取信息的问题中有一些很好的信息:FFMPEG Can't Display The Duration Of a Video。
要计算音频流中的样本数量,您需要三个基本信息:
获得该信息后,流中的样本总数只需 [duration] * [rate] * [channels]。
请注意,这不等于字节,因为样本可能至少为 16 位,也可能为 24 位。
【讨论】:
我相信您需要的是 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)。 所以这回答了你问题的第一部分。希望对您有所帮助。
【讨论】: