скопировать декодированный возврат ffmepg avframe -22

#c #ffmpeg

#c #ffmpeg

Вопрос:

У меня есть avframe после sws_scale, и мне нужен новый фрейм для резервного копирования этого фрейма. Я использую av_frame_clone() для клонирования нового фрейма, но возвращаю NULL. Я использую av_frame_alloc() и av_frame_copy(), av_frame_copy() возвращает -22. И когда я отлаживаю код, шаг за шагом в av_frame_clone, та же ошибка в av_frame_copy() также возвращает -22. итак, как скопировать / клонировать этот фрейм.

код, подобный этому

 if ( packet amp;amp; packet->stream_index == this->ctl->index )
    {
        if ( avcodec_send_packet(this->ctl->context, packet) == 0 )
        {
            while (1)
            {
                int ret = avcodec_receive_frame(this->ctl->context, this->ctl->frame);

                if ( ret == AVERROR(EAGAIN) || ret == AVERROR_EOF )
                {
                    break;
                }

                if ( ret == 0 )
                {
                    sws_scale(this->ctl->convertCtx, (const unsigned char* const*)this->ctl->frame->data, this->ctl->frame->linesize, 0, this->ctl->context->height, this->ctl->frameYUV->data, this->ctl->frameYUV->linesize);

                    AVFrame* nf = av_frame_alloc();
                    int re1 = av_frame_copy_props(nf, this->ctl->frameYUV);
                    int re2 = av_frame_copy(nf, this->ctl->frameYUV);

                    qDebug("result %d == %d ", re1, re2);

                    emit decodeVideoFrame(this->ctl->frameYUV);

                    usleep(21750);

                }
            }
        }
    }
 

результаты copy_props и copy равны 0 и -22.
Я попробовал av_frame_clone() вместо av_frame_copy(), но фрейм равен НУЛЮ.

Комментарии:

1. Проверьте, правильно ли заданы все свойства исходного фрейма.

2. нет, никогда не устанавливайте свойства. Но av_frame_clone также возвращает значение NULL. Я выполняю отладку в исходном коде, эта функция устанавливает свойства, но также возвращает -22 в av_frame_copy

3. Например av_frame_copy , который может быть вызван путем av_frame_clone проверки формата и ширины / высоты для видео или количества сэмплов / каналов для аудио, поэтому в этот момент может произойти сбой, если они не были установлены в источнике перед клонированием: ffmpeg.org/doxygen/trunk/frame_8c_source.html#l00678

4. Пожалуйста, предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.

5. хорошо, я загружаю часть кадра копирования. Я использовал av_frame_clone() вместо av_frame_copy(), возвращающий значение NULL.