音视频基础学习之【08.添加播放列表】

目录

添加播放列表

界面设计

sqlite使用

添加文件到播放列表

加载数据库并设置播放列表

双击列表中的文件播放

清空播放列表

播放下一个视频


添加播放列表

  • 界面设计

补充前面的播放控制,添加播放列表的ui设计

 

点击列表按钮实现显示/隐藏播放列表

播放列表采用轻量级数据库sqlite存储本地播放文件

每次运行时读取数据库中的内容添加到本地播放列表中

  • sqlite使用

将sqlapi文件复制到目录下

在工程配置文件Youku.pro中添加包含

选用sqlite的原因

sqlite是轻量级数据库,一般用在嵌入式产品中,占用资源非常低,支持跨平台,并且处理速度快,是文件存储类型的数据库

采用数据库存储是为了标准化存储方式,如果自己编写文件存储,增加了开发成本,别人阅读代码很困难,用数据库就可以有规范化的流程

  • 添加文件到播放列表

首先创建一个存放文件路径的数组m_playList 和 记录列表视频数量的变量m_videoCount;

对右上角的加号添加处理函数

用一个字符串数组存储文件名,定义宏MAX_PLAY_LIST 100为列表最大文件个数,数组大小为MAX_PLAY_LIST

添加到列表的操作如下:

两层循环,外层为选中的所有文件,内层遍历整个数组,如果选中的路径名与数组中已经存在的路径名相同,通过将标志位hasSame置为true判断重复,跳出内循环,不添加该文件到列表

每次外循环时都将标志位置为false,如果遍历列表中所有路径发现没有相同的(即hasSame为false),则将其添加到播放列表中,并将文件名、路径插入到sqlite数据库

//添加文件到播放列表
void Youku::on_pb_addlist_clicked()
{
    //弹出窗口,选择视频文件,获取文件的绝对路径 存路径需要字符数组
    //1.父类 2.标题 3.默认路径
    QStringList path =  QFileDialog::getOpenFileNames(this,"选择要播放的文件","F:/",
                        "视频文件 (*.flv *.rmvb *.avi *.MP4 *.mkv);; 所有文件(*.*);;");

    //去重
    bool hasSame = false;
    for(int i=0;i<path.count();++i)
    {
        hasSame = false;
        //遍历所有歌曲
        for(int j=0;j < m_videoCount;++j)
        {
            //如果选中的视频名与缓存列表中的视频名相同
            if(path[i] == m_playList[j])
            {
                hasSame = true;
                break;
            }
        }
        //如果遍历结束 播放列表中没有与当前加入的同名的视频
        if(!hasSame)
        {
            //将歌曲加入到歌曲列表
            m_playList[m_videoCount] = path[i];
            m_videoCount++;
            //同时将 视频名 添加到控件
            QFileInfo info(path[i]);
            //info.baseName();    //  获取到文件名 /music/稻香.mp3 --->baseName:稻香
            ui->lw_playlist->addItem(info.baseName());
            //插入sql
            QString sqlStr =
                    QString("insert into t_PlayList (videoName,videoPath) values('%1','%2')")
                    .arg(info.baseName()).arg(path[i]);//格式化字符串
            m_sqlite->UpdateSql(sqlStr);


        }
    }
}
  • 加载数据库并设置播放列表

这个函数在启动程序时的构造函数中调用,每次启动程序,从数据库中加载文件名及路径到播放列表中

在项目工程中固定路径(当前路径下/sql/playlist.db)建立数据库文件

先查看路径是否存在,如果不存在,创建该路径,如果存在,查看是否有数据库文件

如果有文件,加载数据库,从数据库中查已经存放的文件名和路径,插入到数组中

如果没有文件,创建数据库文件,建立表结构

//加载数据库 并设置播放列表
void Youku::loadSqliteAndSetList()
{
    //首先获取路径 设置sql
    //拼接 数据库文件保存路径
    QString DBDir = QDir::currentPath() + "/sql/";
    QString FileName = "playlist.db";
    QDir tempDir;
    tempDir.setPath(DBDir);

    //查看路径是否存在 没有—创建
    if(!tempDir.exists(DBDir))
    {
        //路径不存在,创建
        qDebug()<<"不存在该路径"<<endl;
        tempDir.mkdir(DBDir);
    }
    //查看有没有数据库
    QFile tempFile;
    if(tempFile.exists(DBDir+FileName))
    {
        //有—加载数据库
        //连接数据库 传入数据库的绝对路径
        m_sqlite->ConnectSql(DBDir+FileName);
        QStringList resList;
        //查询
        QString sqlStr = "select videoName,videoPath from t_PlayList;";
        bool res = m_sqlite->SelectSql(sqlStr,2,resList);
        if(!res)
        {
            //没有查询到结果
            return ;
        }
        //把查到的结果放到数组和控件中
        for(int i = 0; i < resList.count(); i += 2)
        {
            ui->lw_playlist->addItem(resList[i]);
            m_playList[m_videoCount] = resList[i+1];
            m_videoCount++;
        }

    }else
    {
        //没有—创建数据库
        tempFile.setFileName(DBDir+FileName);
        //创建文件
        if(!tempFile.open(QIODevice::WriteOnly | QIODevice::Text))
        {
            qDebug()<<"数据库创建失败"<<endl;
            QMessageBox::about(this,"提示","播放列表数据库创建失败");
        }else
        {
            qDebug()<<"数据库创建成功"<<endl;
            tempFile.close();
            //连接数据库 传入数据库的绝对路径
            m_sqlite->ConnectSql(DBDir+FileName);
            //创建表
            QString sqlStr = "create table t_PlayList(videoName varchar(260),videoPath varchar(260));";
            m_sqlite->UpdateSql(sqlStr);
        }
    }
}
  • 双击列表中的文件播放

取到 listWidget 焦点处的路径,通过路径打开文件播放

//双击列表播放
void Youku::on_lw_playlist_doubleClicked(const QModelIndex &index)
{
    //获取当前列表选中项的绝对地址
    QString path = m_playList[ui->lw_playlist->currentIndex().row()];
    if(!path.isEmpty())
    {
        slot_play(path);

    }else
    {
        //没取到路径,打开失败
        QMessageBox::information( this, "提示" , "打开文件失败");
    }

}
  • 清空播放列表

先清除数据库中的记录,再清空存储文件路径的数组和控件,停止播放

//清空播放列表
void Youku::on_pb_clearlist_clicked()
{
    //清空数据库
    //列表中没有视频-->无法删除
    if(m_videoCount <= 0)   return;

    //删除数据库记录
    QString sqlStr = QString("delete from t_PlayList");
    m_sqlite->UpdateSql(sqlStr);

    for(int i = 0 ; i < m_videoCount-1; ++i)
    {
        //清空数组
        m_playList[i].clear();
        //清空控件
        ui->lw_playlist->clear();
    }
    m_videoCount = 0;
    //停止播放
    decode->stop(true);
}
  • 播放下一个视频

通过焦点处的index+1获取下一个视频的路径进行播放

当处于列表最后一个位置时,通过循环取余实现列表循环

//播放下一个
void Youku::on_pb_next_clicked()
{
    //异常处理,列表中没有视频的情况
    if(m_videoCount == 0)
    {
        //停止
        decode->stop(true);
    }
    //切换到下一曲    最后一首歌切换到第一首
    //获取当前列表选中项的绝对地址  循环取余
    QString path = m_playList[(ui->lw_playlist->currentIndex().row() + 1) % m_videoCount];
    //QString path = [ui->lw_playlist->currentIndex().row()];
    slot_play(path);

    //UI切换  设置当前焦点
    ui->lw_playlist->setCurrentRow((ui->lw_playlist->currentIndex().row() + 1) % m_videoCount);

}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值