我得到了 QT5.6 示例“视频播放器”。它适用于本地文件。我修改“打开文件”功能以使用互联网 URL 而不是本地文件。事实上,我使用 youtube URL。像这样:
void VideoPlayer::openFile()
{
//QString fileName = QFileDialog::getOpenFileName(this, tr("Open Movie"),QDir::homePath());
QString fileName = "https://r4---sn-n8v7znls.googlevideo.com/videoplayback?initcwndbps=1427500&dur=3369.354&sver=3&sparams=dur%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpl%2Cratebypass%2Crequiressl%2Csource%2Cupn%2Cexpire&lmt=1416581653227418&requiressl=yes&ip=80.68.2.81&mime=video%2Fmp4&source=youtube&mm=31&mn=sn-n8v7znls&pl=23&id=o-AODorl7SvqZSnDSvxck5hqt4t3DHXmuquI-oLniRvtIu&ms=au&mt=1464897333&mv=m&expire=1464919182&upn=vf3wyJFr-XM&key=yt6&ipbits=0&ratebypass=yes&itag=18&fexp=9412859%2C9414702%2C9416126%2C9416891%2C9419451%2C9422596%2C9423965%2C9425351%2C9426985%2C9428398%2C9431012%2C9432822%2C9433096%2C9433221%2C9433946%2C9434790%2C9435527%2C9435876%2C9436917%2C9437067%2C9437180%2C9437553&signature=A22462E28C81BAFEA1D411B53F4AA7624179608D.BB0B47C09F09A93C3751D49EEE61AF6059A635FB";
if (!fileName.isEmpty()) {
mediaPlayer.setMedia(QUrl(fileName));
playButton->setEnabled(true);
mediaPlayer.play();
qDebug() << "playback started!!";
}
}
应用程序正常启动,可以播放视频,但是!当我使用长视频时,我会向前寻找位置,之后不再更新视频屏幕。不渲染视频帧。
这个 QT 示例演示了 QGraphicsScene 上的 QGraphicsVideoItem - 我的应用程序中需要它们。但是找位置怎么办?它不适用于 http URL 视频!除此之外 mediaPlayer::isSeekable() 返回“true”。在寻找位置之后,播放器的行为就像它真的从新位置点开始播放一样,因为像 positionChanged() 这样的通知信号会定期调用。QMediaStatus 是 QMediaPlayer::BufferedMedia。但是没有屏幕更新!
我有一个位置处理程序:
void VideoPlayer::positionChanged(qint64 position)
{
positionSlider->setValue(position);
qDebug()
<< " pos " << position
<< " sta " << mediaPlayer.mediaStatus();
}
用户搜索位置后,我看到调试输出:
pos 2363199 sta QMediaPlayer::BufferedMedia
pos 2364049 sta QMediaPlayer::BufferedMedia
pos 2364049 sta QMediaPlayer::BufferedMedia
pos 2365050 sta QMediaPlayer::BufferedMedia
pos 2365983 sta QMediaPlayer::BufferedMedia
pos 2365983 sta QMediaPlayer::BufferedMedia
好像有戏?但没有视频输出,没有音频输出..什么都没有。在 Internet mp4 URL 源的情况下如何处理 QMediaPlayer 的 seek/setPosition?