日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt 之播放m3u8视频流

發(fā)布時間:2024/8/1 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt 之播放m3u8视频流 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 前言
  • 一、m3u8是什么?
    • m3u8 文件格式詳解
      • 簡介
      • M3U8 文件簡介
  • 二、qt 如何播放?
    • 1.播放流程


前言

項目中,需要播放視頻,拿到的數(shù)據(jù)是一個m3u8結(jié)尾的http鏈接,比如http://charge.zzzz.cc//fudao_79d049cdbe22116dd19bdc1bad150b90.m3u8?,然后本以為直接調(diào)用QMediaPlayer的接口即可,如下

player = new QMediaPlayer; connect(player, SIGNAL(positionChanged(qint64)), this, SLOT(positionChanged(qint64))); player->setMedia(QUrl::fromLocalFile("/Users/me/Music/coolsong.mp3")); player->setVolume(50); player->play();

或者qml:

MediaPlayer {id: player; }function startPlay(url) {player.source = url;player.videoPlayClicked = true;player.start(); }

卻發(fā)現(xiàn),針對m3u8這種url,不能直接播放,然后就研究了下什么是m3u8.


一、m3u8是什么?

m3u8 文件格式詳解

簡介

M3U8 是 Unicode 版本的 M3U,用 UTF-8 編碼?!癕3U” 和 “M3U8” 文件都是蘋果公司使用的 HTTP Live Streaming(HLS) 協(xié)議格式的基礎(chǔ),這種協(xié)議格式可以在 iPhone 和 Macbook 等設(shè)備播放。

上述文字定義來自于維基百科??梢钥吹?#xff0c;m3u8 文件其實是 HTTP Live Streaming(縮寫為 HLS) 協(xié)議的部分內(nèi)容,而 HLS 是一個由蘋果公司提出的基于 HTTP 的流媒體網(wǎng)絡(luò)傳輸協(xié)議。

HLS 的工作原理是把整個流分成一個個小的基于 HTTP 的文件來下載,每次只下載一些。當媒體流正在播放時,客戶端可以選擇從許多不同的備用源中以不同的速率下載同樣的資源,允許流媒體會話適應(yīng)不同的數(shù)據(jù)速率。在開始一個流媒體會話時,客戶端會下載一個包含元數(shù)據(jù)的 extended M3U (m3u8) playlist文件,用于尋找可用的媒體流。
HLS 只請求基本的 HTTP 報文,與實時傳輸協(xié)議(RTP)不同,HLS 可以穿過任何允許 HTTP 數(shù)據(jù)通過的防火墻或者代理服務(wù)器。它也很容易使用內(nèi)容分發(fā)網(wǎng)絡(luò)來傳輸媒體流。

簡而言之,HLS 是新一代流媒體傳輸協(xié)議,其基本實現(xiàn)原理為將一個大的媒體文件進行分片,將該分片文件資源路徑記錄于 m3u8 文件(即 playlist)內(nèi),其中附帶一些額外描述(比如該資源的多帶寬信息···)用于提供給客戶端??蛻舳艘罁?jù)該 m3u8 文件即可獲取對應(yīng)的媒體資源,進行播放。

因此,客戶端獲取 HLS 流文件,主要就是對 m3u8 文件進行解析操作。

那么,下面就簡單介紹下 m3u8 文件。

M3U8 文件簡介

m3u8 文件實質(zhì)是一個播放列表(playlist),其可能是一個媒體播放列表(Media Playlist),或者是一個主列表(Master Playlist)。但無論是哪種播放列表,其內(nèi)部文字使用的都是 utf-8 編碼。

當 m3u8 文件作為媒體播放列表(Meida Playlist)時,其內(nèi)部信息記錄的是一系列媒體片段資源,順序播放該片段資源,即可完整展示多媒體資源。其格式如下所示:

#EXTM3U #EXT-X-TARGETDURATION:10#EXTINF:9.009, http://media.example.com/first.ts #EXTINF:9.009, http://media.example.com/second.ts #EXTINF:3.003, http://media.example.com/third.ts

對于點播來說,客戶端只需按順序下載上述片段資源,依次進行播放即可。而對于直播來說,客戶端需要 定時重新請求 該 m3u8 文件,看下是否有新的片段數(shù)據(jù)需要進行下載并播放。

當 m3u8 作為主播放列表(Master Playlist)時,其內(nèi)部提供的是同一份媒體資源的多份流列表資源(Variant Stream)。其格式如下所示:

#EXTM3U #EXT-X-STREAM-INF:BANDWIDTH=150000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2" http://example.com/low/index.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=240000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2" http://example.com/lo_mid/index.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=440000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2" http://example.com/hi_mid/index.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=640000,RESOLUTION=640x360,CODECS="avc1.42e00a,mp4a.40.2" http://example.com/high/index.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=64000,CODECS="mp4a.40.5" http://example.com/audio/index.m3u8

該備用流資源指定了多種不同碼率,不同格式的媒體播放列表,并且,該備用流資源也可同時提供不同版本的資源內(nèi)容,比如不同語言的音頻文件,不同角度拍攝的視屏文件等等??蛻艨梢愿鶕?jù)不同的網(wǎng)絡(luò)狀態(tài)選取合適碼流的資源,并且最好根據(jù)用戶喜好選擇合適的資源內(nèi)容。

以上,就是 m3u8 文件的大概內(nèi)容

二、qt 如何播放?

1.播放流程

  • 通過QNetworkAccessManager get獲得video的url,即上面提到的
  • http://charge.zzzz.cc//fudao_79d049cdbe22116dd19bdc1bad150b90.m3u8?

  • 下載url文件,保存到本地文件
  • fudao_79d049cdbe22116dd19bdc1bad150b90.m3u8

  • 設(shè)置QMediapPlayer的 media
  • 核心代碼如下(下載):

    void M3u8DownloadManager::startDownLoad(const QByteArray &url) {QUrl surl = QUrl::fromEncoded(url);revData.clear();filename = getFileName(surl); //根據(jù)url獲得文件名 字符串解析if(QFile::exists(DevConfig::GetInstance()->getTempM3u8Dir() + filename)){qDebug() << "exists" << filename;emit getU3m8(DevConfig::GetInstance()->getTempM3u8Dir() + filename);return;}int linkpos = surl.toString().indexOf("&c=");QString link = surl.toString().mid(linkpos+3);QString urlDecode = QUrl::fromPercentEncoding(link.toLocal8Bit());QUrl linkUrl = QUrl(urlDecode);QNetworkRequest request(linkUrl);currentDownload = pManager->get(request);connect(currentDownload, SIGNAL(finished()),SLOT(downloadFinished()));connect(currentDownload, SIGNAL(readyRead()),SLOT(downloadReadyRead()));}

    保存下載文件

    void M3u8DownloadManager::downloadFinished() {int datalen = revData.length();qDebug() << filename << datalen /*<< revData*/;QFile output;output.setFileName(DevConfig::GetInstance()->getTempM3u8Dir() + filename);if (!output.open(QIODevice::ReadWrite | QIODevice::Truncate)) {qDebug() <<"open file error" << output.errorString()<< output.fileName();return; // skip this download}output.write(revData,val);output.close();emit getU3m8(DevConfig::GetInstance()->getTempM3u8Dir() + filename);currentDownload->deleteLater(); }

    接受下載完信號,然后播放器播放

    Connections{target: dataManageronGetU3m8:{player.source = "file:///"+ m3u8;player.videoPlayClicked = true;player.start();}}

    總結(jié)

    以上是生活随笔為你收集整理的Qt 之播放m3u8视频流的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。