admin管理员组文章数量:1570218
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/s/1VTFq_CC5h1t3ZvZCBUpMSg
提取码:gfnv
本文原创作者:冯一川(ifeng12358@163),未经作者授权同意,请勿转载。
版权声明:本文标题:FFmpeg开发(十)——Qt 实现FFmpeg下载m3u8视频 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1727666047a1124639.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论