【问题标题】:FFmpeg: How to estimate number of samples in audio stream?FFmpeg:如何估计音频流中的样本数量?
【发布时间】:2015-11-08 00:27:48
【问题描述】:

我目前正在编写一个使用 FFmpeg 库来解码 C++ 中的音频文件(尤其是 avformat 和 swresample)的小型应用程序。

现在我需要音频流中的样本总数。我知道确切的数字只能通过实际解码所有帧才能找到,我只需要一个估计。 这里首选的方法是什么?如何找出文件的持续时间?

【问题讨论】:

    标签: c++ audio ffmpeg


    【解决方案1】:

    关于如何从 ffmpeg 中获取信息的问题中有一些很好的信息:FFMPEG Can't Display The Duration Of a Video

    要计算音频流中的样本数量,您需要三个基本信息:

    1. 持续时间(以秒为单位)
    2. 采样率(每秒采样数)
    3. 流中的声道数(例如,2 个立体声)

    获得该信息后,流中的样本总数只需 [duration] * [rate] * [channels]。

    请注意,这不等于字节,因为样本可能至少为 16 位,也可能为 24 位。

    【讨论】:

      【解决方案2】:

      我相信您需要的是 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)。 所以这回答了你问题的第一部分。希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 2016-01-10
        • 1970-01-01
        • 2016-02-26
        • 2017-02-28
        • 2019-03-13
        • 2018-03-01
        • 2013-01-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多