进行了尝试
我正在使用出色的[QtAV](https://github.com/wang-bin/QtAV/)
包来执行视频解码。我想要实现的是获得一个视频的缩略图。以下是我迄今为止所做的工作。
bool saveThumb( QString videoFile ) {
AVDemuxer *demux = new AVDemuxer();
demux->setSeekUnit( SeekByFrame );
demux->setSeekType( KeyFrameSeek );
VideoDecoder *vdec = VideoDecoder::create( VideoDecoderId_FFmpeg );
demux->setMedia( videoFile );
qDebug() << "Loading file:" << demux->load();
qDebug() << "Seeking to 50%" << demux->seek( 0.5 );
qDebug() << "Reading frame:" << demux->readFrame();
vdec->setCodecContext( demux->videoCodecContext() );
vdec->open();
Packet pkt = demux->packet();
qDebug() << "Packet valid:" << pkt.isValid();
qDebug() << "Decoding packet:" << vdec->decode( pkt );
VideoFrame frame = vdec->frame();
qDebug() << "Valid frame:" << frame.isValid();
QImage img = frame.toImage();
qDebug() << "Valid image:" << ( not img.isNull() );
bool saved = img.save( videoFile + ".jpg" );
return saved;
}
我的问题是frame.isValid()
总是返回false
,无论我在哪里寻找,或者播放哪个视频。以上所有检查返回true
。
我想补充一点,如果我使用AVPlayer
并播放视频,视频会正确渲染,但没有音频播放。
此外,我还可以使用AVPlayer::videoCapture()->capture()
拍摄快照
为了记录在案,我已经使用Qt4
和Qt5
为了获得视频的缩略图,您可以简单地使用QtAV VideoFrameExtractor
类,如:
#include "QtAV/VideoFrameExtractor.h"
...
bool saveThumb(const QString& videoFile) {
auto extractor = new QtAV::VideoFrameExtractor;
connect(
extractor,
&QtAV::VideoFrameExtractor::frameExtracted,
extractor,
[this, extractor, videoFile](const QtAV::VideoFrame& frame) {
const auto& img = frame.toImage();
auto saved = img.save(videoFile + ".jpg" );
extractor->deleteLater();
});
connect(
extractor,
&QtAV::VideoFrameExtractor::error,
extractor,
[this, extractor](const QString& errorStr) {
qDebug() << errorStr;
extractor->deleteLater();
});
extractor->setAsync(true);
extractor->setSource(videoFile);
extractor->setPosition(1);
}