【问题标题】:How to confirm opus encode buffer size?如何确认 opus 编码缓冲区大小?
【发布时间】:2018-03-28 22:55:10
【问题描述】:

函数 opus_encode 需要帧大小作为参数。在 api doc 中,它说缓冲区大小是每个通道的样本数。 但是如何确定我应该使用哪种尺寸?

我在 android 中使用 opus。采样率 16k,缓冲区大小 1280。当我在编码和解码中将帧大小设置为 640 时,解码文件的长度是原始 pcm 的一半。当我设置为 960 时,解码文件是原始 pcm 的 2/3。但设置为 1280,encode 将返回 -1 作为 arg 错误。

当我使用酷编辑播放解码时,它比原始 pcm 快。

我的参数一定有问题。 有没有人使用 opus 可以帮助我。 非常感谢。

【问题讨论】:

    标签: android opus


    【解决方案1】:

    作品编码定义:

    opus_int32 opus_encode  ( OpusEncoder *         st,
                              const opus_int16 *    pcm,
                              int                   frame_size,
                              unsigned char *       data,
                              opus_int32            max_data_bytes )
    

    当您指定 frame_size 时,您需要将其设置为pcm 缓冲区中可用的每个通道的样本数。

    OPUS编解码器支持立体声和单声道信号,编码器的对应配置为调用opus_encoder_create函数时指定的channels参数。

    您还需要了解 OPUS 编解码器支持的帧大小。它支持具有 2.5、5、10、20、40 或 60 毫秒音频数据的帧。

    16kHz 的一毫秒音频是 16 个样本 (16000/1000)。因此对于单声道,您可以将 frame_size 设置为:

    • 16 * 2.5 = 40(非常罕见)
    • 16 * 5 = 80(罕见)
    • 16 * 10 = 160
    • 16 * 20 = 320
    • 16 * 40 = 640
    • 16 * 60 = 960

    OPUS 编解码器不接受其他尺寸。处理 1280 个样本的缓冲区大小的最佳方法是拆分为四个 20ms 数据包或两个 40ms 数据包。

    因此,您从缓冲区接收到的一个缓冲区中的两个或四个数据包进行编码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-05
      • 1970-01-01
      • 2013-06-03
      • 2017-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多