Libav FFv1 read_quant_table解码错误

Libav FFv1 read_quant_table decoding errors

提问人:flansel 提问时间:11/16/2023 更新时间:11/16/2023 访问量:59

问:

我在使用“ffv1”编解码器编码和解码视频时遇到问题。有趣的是,当宽度和高度为 ~640 或更小时,这可以正常工作,但对于任何“大”帧尺寸(例如 1280x720),我会出现以下错误......

[ffv1 @ 0x5612f4ab2240] read_quant_table error
[ffv1 @ 0x5612f4ab2240] Cannot decode non-keyframe without valid keyframe

是否有任何需要设置的选项,或者我是否做错了其他事情,我把这个例子做得非常小,我知道我没有将图像写入框架,只是在缓冲区中分配垃圾等。 提前致谢。

// minimal example
// ...
#define FRAMES (500)

int main(int argc, char **argv)
{
    AVCodecContext *enc, *dec;
    AVFrame *frame = av_frame_alloc();
    AVFrame *decoded_frame = av_frame_alloc();
    AVPacket *packet = av_packet_alloc();
    AVPacket *padded_packet = av_packet_alloc();

    const AVCodec *enc_codec = avcodec_find_encoder_by_name("ffv1");
    const AVCodec *dec_codec = avcodec_find_decoder_by_name("ffv1");
    enc = avcodec_alloc_context3(enc_codec);
    dec = avcodec_alloc_context3(dec_codec);

    enc->width   = 1280;
    enc->height  = 720;
    enc->pix_fmt = AV_PIX_FMT_YUV420P;
    enc->time_base.num = 1001;
    enc->time_base.den = 60000;

    dec->width  = enc->width;
    dec->height = enc->height;

    avcodec_open2(enc, enc_codec, NULL);
    avcodec_open2(dec, dec_codec, NULL);

    frame->height = enc->height;
    frame->width  = enc->width;
    frame->format = enc->pix_fmt;
    av_frame_get_buffer(frame, 32);
    printf("frame linesz %i,%i,%i\n", frame->linesize[0], frame->linesize[1], frame->linesize[2]);

    for (int i = 0; i < FRAMES; ++i)
    {
        avcodec_send_frame(enc, frame);
        while (!avcodec_receive_packet(enc, packet))
        {
            av_new_packet(padded_packet, packet->size + AV_INPUT_BUFFER_PADDING_SIZE);
            padded_packet->size -= AV_INPUT_BUFFER_PADDING_SIZE;

            memset(padded_packet->data, 0, padded_packet->size);
            memcpy(padded_packet->data, packet->data, packet->size);
            printf("frame %i encoded %i bytes\n", i, padded_packet->size);
            if (!avcodec_send_packet(dec, padded_packet))
            {
                printf("sent bytes to decoder\n");
            }
        }

        while (!avcodec_receive_frame(dec, decoded_frame))
        {
            printf("decoded frame height %i, width %i\n", decoded_frame->height, decoded_frame->width);
        }
        usleep(16000);
    }
    return 0;
}
c ffmpeg libav libavcodec

评论

0赞 flansel 11/16/2023
通过向编码器添加选项 level=1 来缓解,也许默认值(我相信级别 3)并不完全稳定?

答: 暂无答案