使用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-pos和time-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());
相关推荐
Wang's Blog17 分钟前
Java 项目实战:交友项目 - 用户体系集成总结
java·开发语言·交友
中科三方1 小时前
IPv6检测常见问题:AAAA记录检测不通过是什么原因?
开发语言·php
沫璃染墨2 小时前
从零入门计算机网络系列(十一):HTTP协议进阶——从重定向原理到GET/POST与Fiddler抓包
linux·服务器·开发语言·网络·c++·tcp/ip·html
刚入门的大一新生2 小时前
Linux-线程互斥
java·开发语言
香芋芋圆2 小时前
iD-editor 详解|OSM官方在线编辑器,基于D3.js的轻量地图编辑器
开发语言·javascript·编辑器
蓝祁子yoky2 小时前
Qt学习日记 Day13:网络编程(一)-TCP基础与Socket实战
网络·qt·学习
美狐美颜sdk3 小时前
视频美颜SDK中的YUV与RGBA格式有什么区别?直播APP开发解析
人工智能·计算机视觉·音视频·美颜sdk·直播美颜sdk·视频美颜sdk
小熊恋旧3 小时前
Python 面向对象编程:方法、属性、继承与多态详解
开发语言·python
云边云科技_云网融合3 小时前
面向汽车零部件制造业场景的解决方案 | 70 秒:一台车下线的时间里,藏着五张网
开发语言·汽车·php
Evand J3 小时前
【PMSM滤波例程2】PMSM未知负载转矩观测EKF。MATLAB例程(负载增广EKF与实际仿真结果)。附下载链接
开发语言·matlab·电机