使用libmpv库时如何获取拥有多个分片的视频总播放进度

由于libmpv中的time-pos属性记录的是当前分片的播放进度,如果我们使用mpv播放m3u8格式文件(有多个视频分片)就会导致time-pos记录的时间并不是整个视频播放的总时间,所以想要通过time-pos来显示当前视频的播放进度是行不通的。我的解决办法是:

  1. 先读取m3u8文件中的内容,获取总视频分片的个数、每个视频分片的时长、在整个视频中的索引、在整个视频的起止时间

    复制代码
    class VideoSegmentInfo{
    public:
        int _index;         //片段在整个视频中的索引
        double _duration;   //持续时长
        QString _url;       //地址
    
        //当前分片在整段视频中的位置
        double _startPos;
        double _endPos;
    };
  2. 使用libmpv中的方法获取当前播放视频的分片索引,以及当前分片的播放位置(也就是time-pos

    cpp 复制代码
    mpv_get_property(_mpv, "playlist-pos", MPV_FORMAT_INT64, &_curSegmentIndex);
    mpv_get_property(_mpv, "time-pos", MPV_FORMAT_DOUBLE, &_curSegmentPlayDuration);
  3. 做一个很简单的相加就可以得到当前视频播放的总进度

    cpp 复制代码
    if(_curSegmentIndex == 0){
    	_curPlayTime = (int64_t)_curSegmentPlayDuration;
    }else{
    	_curPlayTime = (int64_t)(_curSegmentPlayDuration + (*_segmentInfoList)[_curSegmentIndex-1]._endPos);
    }
  4. 还有一个问题:设置拖拽进度条的时间,由于传递的进度条时间也是视频播放的总时间,所以我们需要转化一下,定位到具体分配以及该分片下的播放进度,此时又有一个问题:

    如果我们使用mpv_set_property来设置playlist-postime-pos,例如:

    cpp 复制代码
    for(int i = 0; i < _curSegmentIndex; ++i)
    {
        if(seconds >= (*_segmentInfoList)[i]._startPos && seconds <= (*_segmentInfoList)[i]._endPos)
        {
            //如果处于第i个视频分片,跳转到此视频分片
            mpv_set_property_async(_mpv, 0, "playlist-pos", MPV_FORMAT_INT64, &i);
            int64_t pos = (int64_t)(seconds - (*_segmentInfoList)[i]._startPos);
            mpv_set_property_async(_mpv, 0, "time-pos", MPV_FORMAT_INT64, &pos);
            _curSegmentIndex = i;
            _curSegmentPlayDuration = pos;
        }
    }

    由于这个方法是异步的,所以这两个参数的设置顺序可能会错乱,导致设置异常,因此应该使用命令链来设置参数:

    cpp 复制代码
    QString cmd = QString("set playlist-pos %1; set time-pos %2").arg(i).arg(pos);
    mpv_command_string(_mpv, cmd.toUtf8().constData());
相关推荐
小智社群20 小时前
VR漫游视频完整版
前端·javascript·音视频
ECT-OS-JiuHuaShan21 小时前
严格证明:还原论是ASCII,整体论是UTF-8的历史意义和价值
开发语言·人工智能·算法·量子计算
AC赳赳老秦21 小时前
时间开销自动统计:OpenClaw 记录工作任务时长、分析时间分配、给出优化建议
java·大数据·开发语言·python·自动化·deepseek·openclaw
音视频牛哥1 天前
从RFC到工程落地:SmartMediaKit 低延迟RTSP播放器技术深度解析
音视频·rtsp播放器·rtsp播放器安卓端·rtspplayer·鸿蒙next rtsp播放器·rtsp播放器linux端·rtsp播放器windows端
西安老张(AIGC&ComfyUI)1 天前
第026章:从坑里上来了!ComfyUI文生音频IndexTTS2+Qwen3-TTS本地部署!
音视频
祉猷并茂,雯华若锦1 天前
Appium 3.x 实战:元素定位与常见错误解析
开发语言·python·appium
Lethehong1 天前
飞算Java:从需求梳理到风险闭环,搭建云盾企业信息安全与权限管理平台
java·开发语言
爱喝水的鱼丶1 天前
SAP-ABAP:ALV数据导出增强——实现Excel/PDF/CSV多格式自定义导出
开发语言·性能优化·sap·abap·erp
Mortalbreeze1 天前
深入理解 Linux 线程机制(四):线程同步——条件变量与信号量
linux·运维·服务器·开发语言·c++
不会c+1 天前
C语言:入门到精通(408考研版)系列七 派生的数据类型
c语言·开发语言