FFmpeg开发(十)——Qt 实现FFmpeg下载m3u8视频
FFmpeg開發(十)——Qt 實現FFmpeg下載m3u8視頻
之前的文章介紹了如何利用ffmpeg實現一個視頻播放器,今天使用ffmpeg在Qt平臺下實現下載m3u8視頻。
FFmpeg開發(四)——Qt實現一個視頻播放器(參考了暴風影音、迅雷影音)
FFmpeg開發(五)——Qt視頻播放器之封裝FFmpeg類(參考了暴風影音、迅雷影音)
FFmpeg開發(六)——Qt視頻播放器之封裝音頻類(參考了暴風影音、迅雷影音)
FFmpeg開發(七)——Qt視頻播放器之播放列表類(參考了暴風影音、迅雷影音)
FFmpeg開發(八)——Qt視頻播放器之多線程的使用(參考了暴風影音、迅雷影音)
FFmpeg開發(九)——Qt視頻播放器之快進滑動條(參考了暴風影音、迅雷影音)
一簡介:
維基百科對m3u8給出的解釋是:
M3U8 是 Unicode 版本的 M3U,用 UTF-8 編碼。"M3U" 和 "M3U8" 文件都是蘋果公司使用的 HTTP Live Streaming(HLS) 協議格式的基礎,這種協議格式可以在 iPhone 和 Macbook 等設備播放。
HLS 的工作原理是把整個流分成一個個小的基于 HTTP 的文件來下載,每次只下載一些。當媒體流正在播放時,客戶端可以選擇從許多不同的備用源中以不同的速率下載同樣的資源,允許流媒體會話適應不同的數據速率。在開始一個流媒體會話時,客戶端會下載一個包含元數據的 extended M3U (m3u8) playlist文件,用于尋找可用的媒體流。
HLS 只請求基本的 HTTP 報文,與實時傳輸協議(RTP)不同,HLS 可以穿過任何允許 HTTP 數據通過的防火墻或者代理服務器。它也很容易使用內容分發網絡來傳輸媒體流。
m3u8準確來說是一種索引文件,使用m3u8文件實際上是通過它來解析對應的放在服務器上的視頻網絡地址,從而實現在線播放。使用m3u8格式文件主要因為可以實現多碼率視頻的適配,視頻網站可以根據用戶的網絡帶寬情況,自動為客戶端匹配一個合適的碼率文件進行播放,從而保證視頻的流暢度。
m3u文件的大小很小,也就是因為它里面沒有任何音頻數據。把M3U文件直接轉換為音頻文件是不可能的,除非你把它指向的音頻文件下載下來再作處理。
m3u格式的文件只是存儲多媒體播放列表,提供了一個指向其他位置的音頻視頻文件的索引,你播放的還是那些被指向的文件,用記事本打開m3u文件可以查看所指向文件的地址及文件的屬性,以選用合適播放器播放。
二、ffmpeg下載
使用ffmpeg下載m3u8文件主要使用的命令是:
ffmpeg -i xxxx.m3u8 -c copy outfile.mp4三、界面
?
?四、代碼實現
使用Qt中調用外部可執行文件的類QProcess實現。
m_pInputLab = new QLabel;m_pInputLab->setText("網址:");m_pInputLineEdit = new QLineEdit;m_pStartBtn = new QPushButton;m_pStartBtn->setText("開始");m_pFileNameLab = new QLabel;m_pFileNameLab->setText("保存文件名:");m_pFileNameLineEdit = new QLineEdit;m_fileName = "test001";m_pTextEdit = new QTextEdit();m_pProcess = new QProcess();m_pathExe = QDir::currentPath();m_pathExe += "/";?
connect( m_pStartBtn, SIGNAL( clicked() ), this, SLOT( slotStartDownLoad() ) );connect( m_pProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(slotShowDownLoadInfo()));connect( m_pProcess, SIGNAL(readyReadStandardError()) , this , SLOT(slotShowDownLoadErrInfo()));connect( m_pProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(slotShowDownLoadProcessFinished(int, QProcess::ExitStatus))); void Loadm3u8::slotStartDownLoad() {QString urlPath = m_pInputLineEdit->text();if( urlPath.isEmpty() ){return;}if( !urlPath.contains(".m3u8") ){QMessageBox::information(this,"提示","請輸入正確的網址!");return;}if( !m_pFileNameLineEdit->text().isEmpty() ){m_fileName = m_pFileNameLineEdit->text();}QString loadFile = QString("ffmpeg -i %1 -c copy %2%3.mp4").arg(urlPath).arg(m_pathExe).arg(m_fileName);m_pProcess->start(loadFile);}void Loadm3u8::slotShowDownLoadInfo() {QByteArray text = m_pProcess->readAllStandardOutput();m_pTextEdit->append(QString::fromLocal8Bit( text ));m_pTextEdit->update();}void Loadm3u8::slotShowDownLoadErrInfo() {QString text = m_pProcess->readAllStandardError();m_pTextEdit->append(text); }void Loadm3u8::slotShowDownLoadProcessFinished(int exitCode, QProcess::ExitStatus exitStatus) {m_pTextEdit->append("下載完成!");m_pTextEdit->update(); }五、軟件鏈接
下面是軟件可執行文件(V1.01)鏈接,我放到了百度網盤中。可以直接哪來使用。
鏈接:https://pan.baidu.com/s/1VTFq_CC5h1t3ZvZCBUpMSg?
提取碼:gfnv
本文原創作者:馮一川(ifeng12358@163.com),未經作者授權同意,請勿轉載。
總結
以上是生活随笔為你收集整理的FFmpeg开发(十)——Qt 实现FFmpeg下载m3u8视频的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于Treap的学习感受
- 下一篇: Django之ORM对数据库操作