[英]FFmpeg: How to estimate number of samples in audio stream?
我目前正在编写一个使用FFmpeg库的小型应用程序,以便在C ++中解码音频文件(尤其是avformat和swresample)。
现在,我需要音频流中的样本总数。 我知道确切的数字只能通过实际解码所有帧才能找到,我只需要一个估计即可。 这里首选的方法是什么? 如何找出文件的持续时间?
这个问题中有一些关于如何从ffmpeg中获取信息的好信息: FFMPEG无法显示视频的持续时间 。
要计算音频流中的样本数量,您需要三个基本的信息位:
获得该信息后,流中的样本总数仅为[持续时间] * [速率] * [通道]。
请注意,这不等于字节,因为采样可能至少为16位,并且可能为24位。
我相信您需要的是音频/框架的公式。 例如,如果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)。 因此,这回答了您问题的第一部分。 希望能有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.