当前位置: 首页 > article >正文

音视频项目—基于FFmpeg和SDL的音视频播放器解析(十二)

介绍

在本系列,我打算花大篇幅讲解我的 gitee 项目音视频播放器,在这个项目,您可以学到音视频解封装,解码,SDL渲染相关的知识。您对源代码感兴趣的话,请查看基于FFmpeg和SDL的音视频播放器

如果您不理解本文,可参考我的前一篇文章音视频项目—基于FFmpeg和SDL的音视频播放器解析(十一)

解析

我们今天要讲的和音视频同步有关,其中 async 主要负责时间的控制,未来 audiooutput 和 videooutput 这两个负责播放音频和视频的文件就依赖其实现音视频同步。

我们先看看 async 的代码

#ifndef AVSYNC_H_
#define AVSYNC_H_

#include<chrono>
#include<ctime>
#include<time.h>
#include<math.h>
using namespace std::chrono;


class AVSync
{
public:
    AVSync();
    void InitClock(){
        
    }
    void SetClockAt(double pts, double time){
        this->pts = pts;
        pts_drift = this->pts - time;
    }
    double GetClock(){
        double time = GetMicroseconds() / 1000000.0;
        return pts_drift + time;
    }
    double SetClock(){
        double time = GetMicroseconds() / 1000000.0;
        SetClockAt(pts, time);
    }
    time_t GetMicroseconds(){
        system_clock::time_point time_point_new = system_clock::now();
        system_clock::duration duration = time_point_new.time_since_epoch();
        time_t us = duration_cast<microseconds>(duration).count();
        return us;
    }
    double pts = 0;
    double pts_drift = 0;
};


#endif

这个代码量不大,成员变量有 pts,pts_drift 这两个。成员函数主要是 GetMicroseconds,SetClock,GetClock,SetClockAt,我们接下来逐步解析。

我们先说成员变量的含义。pts(presentation timestamp),了解音视频的朋友应该知道,这是显示时间戳,表示帧应该在屏幕显示的时间。pts_drift,当前 pts 与系统时间的差值。

然后,我们看一下函数

GetMicroseconds:
time_t GetMicroseconds(){
      system_clock::time_point time_point_new = system_clock::now();
      system_clock::duration duration = time_point_new.time_since_epoch();
      time_t us = duration_cast<microseconds>(duration).count();
      return us;
}

这个函数负责获取时间的间隔。

首先,第一行,system_clock::time_point time_point_new = system_clock::now(),我们获取了当前的时间。

然后,system_clock::duration duration = time_point_new.time_since_epoch(),通过这个函数我们获得了时间间隔。注意,先是得到 time_piont,我们才能计算 duration。

最后,time_t us = duration_cast<microseconds>(duration).count(),转换成毫秒并返回。

SetClockAt:
void SetClockAt(double pts, double time){
    this->pts = pts;
    pts_drift = this->pts - time;
}

这个函数负责给 pts 和 pts_drift 赋值。这很好理解,因为 pts_drift 就是 pts 和当前时间的差值。

GetClock:
double GetClock(){
      double time = GetMicroseconds() / 1000000.0;
      return pts_drift + time;
}

这个函数负责获取时间。获取了时间间隔后加上 pts_stamp 后就返回这个值。

SetClock:
double SetClock(){
     double time = GetMicroseconds() / 1000000.0;
     SetClockAt(pts, time);
}

这个函数负责设置设置时钟,获取时间间隔,然后调用 SetClockAt 后就可以了。

我们这篇文章就讲讲了时间设置的操作,并没有深入讲音视频同步的原理。我们最后通过 audiooutput 和 videooutput 播放出音视频就好了,到时候也会深入讲同步机制的。

欲知后事如何,请听下回分解。


http://www.kler.cn/a/133578.html

相关文章:

  • Vue.js 项目创建流程
  • css:盒子模型
  • sql server 查看io资源使用
  • 论文阅读《BEVFormer v2》
  • ctfshow-web入门-SSTI(web361-web368)上
  • 阿里巴巴通义灵码推出Lingma SWE-GPT:开源模型的性能新标杆
  • golang学习笔记——select 判断语句
  • 动态加载js文件的方法封装
  • 系统安全-常见的几种sql注入攻击的方式
  • 【IDEA 使用easyAPI、easyYapi、Apifox helper等插件时,导出接口文档缺少代码字段注释的相关内容、校验规则的解决方法】
  • 1、cvpr2024
  • 2023.11.19 hadoop之MapReduce
  • [ 一刷完结撒花!! ] Day50 力扣单调栈 : 503.下一个更大元素II |42. 接雨水 | 84.柱状图中最大的矩形
  • Fork项目新分支如何同步
  • upgrade k8s (by quqi99)
  • SEnet注意力机制(逐行代码注释讲解)
  • Golang中的闭包详解
  • 浅谈滑动窗口
  • Java Swing抽奖程序
  • 一句话总结敏捷实践中不同方法
  • Django 简单入门(一)
  • C++虚函数(定义,作用,原理,案例)
  • 实时人眼追踪、内置3D引擎,联想ThinkVision裸眼3D显示器创新四大应用场景
  • 【机器学习】 逻辑回归算法:原理、精确率、召回率、实例应用(癌症病例预测)
  • 【蓝桥杯选拔赛真题21】C++行李运费 第十二届蓝桥杯青少年创意编程大赛C++编程选拔赛真题解析
  • SpringSecurity+jwt使用