Стоит задача:
Нужно нарезать скриншотов с видеофайла, отступив от начала некоторый процент файла и от конца.
Проблема заключается в том, что при обработке mpeg файлов ф-я avcodec_decode_video выдает предупреждения
[mpeg1video @ 0x2afbbda34e90]current_picture not initialized
[mpeg1video @ 0x2afbbda34e90]warning: first frame is no keyframe
и скрин получается заквадраченым.
Для avi-видео - все в порядке, никаких предупреждений.
Размыто только себе представляю, что есть разные типы фреймов, и если находимся не на ключевом фрейме, будут такие проблемы. Но как это решить, ума не приложу.
Вот мой код, который по теме:
int startPercent = one->getVideoIndenBegin();
int endPercent = one->getVideoIndenEnd();
int screensNumber = one->getScreenShotCount();
int64_t start_pos = m_pFormatCtx->start_time +((int)( m_pFormatCtx->duration * startPercent * 0.01) );
int64_t end_pos = m_pFormatCtx->start_time + (m_pFormatCtx->duration - (int)( m_pFormatCtx->duration*endPercent*0.01) );
int64_t step = (end_pos - start_pos) / (screensNumber );
int64_t target_frame = start_pos;
l1:
if(0 > av_seek_frame(m_pFormatCtx, -1, target_frame, AVSEEK_FLAG_BACKWARD))
one->log().error("1:Can't seek to %d frame",target_frame);
target_frame+= step;
avcodec_flush_buffers(m_pCodecCtx);
while(av_read_frame(m_pFormatCtx, &m_packet) >= 0)
{
// Is this a packet from the video stream?
if(m_packet.stream_index==m_videoStreamNum)
{
// Decode video frame
avcodec_decode_video(m_pCodecCtx,m_pFrame,&m_frameFinished,
m_packet.data, m_packet.size);
// Did we get a video frame?
if(m_frameFinished)
{
m_pFrameCodecCtx->qmin = m_pFrameCodecCtx->qmax = 3;
m_pFrameCodecCtx->mb_lmin = m_pFrameCodecCtx->lmin = m_pFrameCodecCtx->qmin * FF_QP2LAMBDA;
m_pFrameCodecCtx->mb_lmax = m_pFrameCodecCtx->lmax = m_pFrameCodecCtx->qmax * FF_QP2LAMBDA;
m_pFrameCodecCtx->flags |= CODEC_FLAG_QSCALE;
m_pFrame->quality = 4;
m_pFrame->pts = i;
int szBufferActual = avcodec_encode_video(m_pFrameCodecCtx, m_pBuf, numBytes, m_pFrame);
if(szBufferActual < 0)
{
one->log().error("avcodec_encode_video error. return value = %d",szBufferActual);
return -1;
}
if(++i <= screensNumber)
{
/* Write JPEG to file */
if(!saveFrame(frameName,m_pBuf,szBufferActual,i))
return false;
else
{
minute++;
av_free_packet(&m_packet);
goto l1;
}
}
else
break;
}
}
av_free_packet(&m_packet);
}
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от dont
Ответ на:
комментарий
от mv
Ответ на:
комментарий
от dont
Ответ на:
комментарий
от mv
Ответ на:
комментарий
от mv

Ответ на:
комментарий
от INFOMAN
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум [ffmpeg] AVFrame to jpeg file (2008)
- Форум Кодирование видео с помощью libav* (2011)
- Форум ffmpeg: как записать корректный заголовок? (2016)
- Форум Не работает чтение с web-камеры (v4l2) (2024)
- Форум ffmpeg .mp4 troubles (2019)
- Форум V4L2: ошибка удаления буфера из очереди: недопустимый аргумент (2023)
- Форум Trouble ! ! ! (2014)
- Форум Troubles (2002)
- Форум trouble (2005)
- Форум ffmpeg (2020)