使用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());
相关推荐
h39748 小时前
DirectShow过滤器开发-视频源过滤器
c++·windows·音视频·directshow
夏幻灵9 小时前
JavaScript this 面试:五种绑定规则、优先级与常见面试陷阱
开发语言·javascript·面试
程序猿编码9 小时前
榨干 RTX5090 算力!Qwen3 专用单卡推理引擎,手写C++/CUDA 算子实现 MTP 推测解码
开发语言·c++·大模型推理·qwen3·多模态推理
西飘客10 小时前
vs 怎么根据dll 生成lib文件
c++·qt
bkspiderx11 小时前
Qt 插件机制:动态扩展应用功能的核心框架
开发语言·qt·元数据·qt 插件·qpluginloader
程序员老陆11 小时前
深入理解 C++ thread_local:线程私有存储的正确打开方式
开发语言·c++·程序设计
沐晓时光11 小时前
C语言入门,深入理解指针(3)
c语言·开发语言
美狐美颜sdk11 小时前
直播APP源码可以直接接入视频美颜sdk吗?技术方案详解
android·人工智能·音视频·美颜sdk·直播美颜sdk
码云数智-园园11 小时前
unique_ptr 还是 shared_ptr?C++ 智能指针选型与内存泄漏实战分析
java·开发语言
揽秀亭长12 小时前
从音频到五线谱|扒谱过程中的关键技术环节
人工智能·音视频