在使用 QMediaPlayer 播放 m3u8 文件时,需要使用 Qt 的网络模块(QtNetwork)来下载 m3u8 文件及其包含的视频片段。具体步骤如下:
- 使用 QNetworkAccessManager 发送 GET 请求获取 m3u8 文件内容。
QNetworkRequest request(QUrl("http://example.com/video.m3u8"));
QNetworkReply *reply = manager->get(request);
connect(reply, SIGNAL(finished()), this, SLOT(onM3u8Downloaded()));
- 解析 m3u8 文件内容,获取所有视频片段的 URL,并将其保存到 QVector 中。
void onM3u8Downloaded()
{
QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());
if (reply) {
if (reply->error() == QNetworkReply::NoError) {
QString m3u8 = reply->readAll();
QStringList urls = m3u8.split("\n");
for (const QString &url : urls) {
if (url.endsWith(".ts")) {
videoUrls.append(url.trimmed());
}
}
playNextSegment();
} else {
qDebug() << "Failed to download m3u8 file:" << reply->errorString();
}
reply->deleteLater();
}
}
- 使用 QMediaPlayer 播放第一个视频片段,并在播放结束时播放下一个视频片段。
void playNextSegment()
{
if (!videoUrls.isEmpty()) {
QMediaContent media(QUrl(videoUrls.first()));
player.setMedia(media);
player.play();
videoUrls.removeFirst();
}
}
void onMediaStateChanged(QMediaPlayer::State state)
{
if (state == QMediaPlayer::StoppedState) {
playNextSegment();
}
}
需要注意的是,对于一些加密的 m3u8 文件,可能需要设置 QNetworkRequest 的 header 来传递认证信息。另外,如果视频片段过多,可以考虑使用 QThread 来下载和播放,以免阻塞主线程。