#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#l006784. Пожалуйста, предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.
5. хорошо, я загружаю часть кадра копирования. Я использовал av_frame_clone() вместо av_frame_copy(), возвращающий значение NULL.