使用QtAV进行视频钉钉



我正在使用出色的[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() 拍摄快照

为了记录在案,我已经使用Qt4Qt5

进行了尝试

为了获得视频的缩略图,您可以简单地使用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);
}

相关内容

  • 没有找到相关文章

最新更新