代码之家  ›  专栏  ›  技术社区  ›  N0un

为什么avcodec\u fill\u audio\u帧在只有样本数不同的情况下返回-22?

  •  1
  • N0un  · 技术社区  · 8 年前

    AVFrame* frame = av_frame_alloc();
    frame->nb_samples = 8000;
    frame->format = AV_SAMPLE_FMT_S16;
    frame->channels = 1;
    frame->channel_layout = AV_CH_LAYOUT_MONO;
    frame->sample_rate = 8000;
    frame->quality = 1;
    
    int res = avcodec_fill_audio_frame(frame, 1, AV_SAMPLE_FMT_S16, /*my samples data*/, 16000, 0);
    
    // If res >= 0, continue with avcodec_encode_audio2
    

    有效:)……嗯,我的意思是。。。

    当我的输入是 音频样本( S16 16000 字节),它可以工作。但是当我 6000 音频样本(静止 格式化so 字节),它以-22(无效参数)失败。知道吗?

    此样本计数没有动态变化。我有一些会话的数据总是由8000个样本组成(它可以工作),还有一些会话的数据总是由6000个样本组成(它失败了)。样本数和数据大小是这些会话之间唯一不同的参数。

    如果我设置或不设置 frame_size 字段输入 AVCodecContext ,之后返回0 avcodec_open2 AV_CODEC_CAP_VARIABLE_FRAME_SIZE 这听起来很正常。

    2 回复  |  直到 8 年前
        1
  •  3
  •   Ronald S. Bultje    8 年前

    avcodec_encode_audio2() 应该正好是N个样本,其中N是 AVCodecContext::frame_size 。在某些情况下,这取决于编解码器(例如,mp3帧大小是恒定的),但在其他情况下,它可以是可变的。对于大多数编码器来说,它在编码中应该仍然是恒定的。看起来你的值就是默认值,mulaw没有内置常量,所以你可以指定一个不同的值 frame_size 调用前的值 avcodec_open2()

    如果样本数量动态变化,则需要一个环形缓冲区来确保输入 avcodec\u encode\u AUDIO 2() 仍然有恒定数量的样本。

        2
  •  1
  •   N0un    8 年前

    • 根据所需的默认对齐方式初始化并填充输入缓冲区 libavcodec 。您可以使用 av_samples_get_buffer_size 0 选择合适的尺寸。

    • avcodec_fill_audio_frame 将对齐参数设置为 1. 忽略对齐。