Стоит задача: Нужно нарезать скриншотов с видеофайла, отступив от начала некоторый процент файла и от конца. Проблема заключается в том, что при обработке 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 .mp4 troubles (2019)
- Форум Trouble ! ! ! (2014)
- Форум trouble (2005)