FFmpeg开发(十)——Qt 实现FFmpeg下载m3u8视频

17 篇文章 4 订阅
11 篇文章 17 订阅

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),未经作者授权同意,请勿转载。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冯一川

谢谢老板对我的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值