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

音视频项目—基于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 播放出音视频就好了,到时候也会深入讲同步机制的。

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

相关文章:

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

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

键鼠自动化2.0树形结构讲解

介绍 在键鼠自动化2.0中使用Qtc实现了全自定义树形结构&#xff0c;实现任务的拖拽&#xff0c;复制粘贴&#xff0c;撤销重做&#xff0c;以及包括树形结构增加序号展示&#xff0c;以及增加搜索功能 实现 1.自定义节点 // 自定义节点类 class TreeNode : public QObject …...

2023年【金属非金属矿山安全检查(地下矿山)】考试报名及金属非金属矿山安全检查(地下矿山)最新解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 金属非金属矿山安全检查&#xff08;地下矿山&#xff09;考试报名参考答案及金属非金属矿山安全检查&#xff08;地下矿山&#xff09;考试试题解析是安全生产模拟考试一点通题库老师及金属非金属矿山安全检查&#…...

Java 12 及Tomcat 部署配置

使用的软件版本 1. Java12部署 和之前的Java版本不太一样&#xff0c;12版本不用配置JRE环境。 解压缩文件夹 root账户执行 tar -xzvf /home/software/jdk-12.0.2_linux-x64_bin.tar.gz创建java文件夹 root账户执行 cd /usr mkdir java移动Java文件到创建的文件夹下 root账…...

pandas教程:Date Ranges, Frequencies, and Shifting 日期范围,频度,和位移

文章目录 11.3 Date Ranges, Frequencies, and Shifting&#xff08;日期范围&#xff0c;频度&#xff0c;和位移&#xff09;1 Generating Date Ranges&#xff08;生成日期范围&#xff09;2 Frequencies and Date Offsets&#xff08;频度和日期偏移&#xff09;Week of mo…...

设计模式 - 概览

一、概念 分为三大类、23中具体设计模式。 类型原理具体模式创建型封装了具体类的信息&#xff0c;隐藏了类的实例化过程。 单例模式&#xff08;Singleton&#xff09; 工厂方法模式&#xff08;Factory Method&#xff09; 抽象工厂模式&#xff08;Abstract Factory&#xf…...

【Linux】Makefile

一、gcc 的缺点 gcc -o test a.c b.c我们具体分析&#xff1a;gcc -o test a.c b.c这条命令 它们要经过下面几个步骤&#xff1a; 1&#xff09;对于a.c&#xff1a;执行&#xff1a;预处理 编译 汇编 的过程&#xff0c;a.c >xxx.s >xxx.o 文件。2&#xff09;对于b.c…...

TS的函数如何定义类型

如何接受arguments参数 function add(...args: string[]) {let list4: IArguments arguments;}add(1, 2) 自定义一个args interface A1 {callee: Function,length: number,[index: number]: any}function adds(...args: string[]) {let list4: A1 arguments;}adds(1, 2) …...

xstream实现xml和java bean 互相转换

目录 pom引用java bean 类XML 转换工具类测试类执行结果注意问题 JAXB方式见&#xff1a; JAXB实现XML和Bean相互转换 Java中实现XML和Bean的转换的方式或插件有以下几种&#xff1a; JAXB&#xff08;Java Architecture for XML Binding&#xff09;&#xff1a;JAXB是Java …...

斯坦福机器学习 Lecture1 (机器学习,监督学习、回归问题、分类问题定义)

https://www.bilibili.com/video/BV1JE411w7Ub?p1&vd_source7a1a0bc74158c6993c7355c5490fc600 笔记如下 机器学习的定义&#xff1a;不需要明确编程就能让计算机去学习做某件事情 另一个定义 什么是监督学习&#xff1f; 给定一组 (x,y) 样本&#xff0c;学习一个 x-&g…...

五、Linux目录结构

1.基本介绍 1.Linux的文件系统是采用级层式的树状目录结构&#xff0c;在此结构中的最上层是根目录"r/"&#xff0c;然后在此目录下再创建其他的目录。 2.深刻理解linux树状文件目录是非常重要的 3.记住一句经典的话&#xff1a;在Linux世界里&#xff0c;一切皆文件…...

C/C++数据结构之中缀表达式转换为后缀表达式,删除堆栈元素

在这篇博客中&#xff0c;我们将深入分析一个使用C编写的栈和表达式计算程序。该程序不仅实现了基本的栈操作&#xff0c;还提供了中缀表达式转后缀表达式和删除堆栈中的元素等实用功能。通过逐一讲解每个函数的功能&#xff0c;我们将更全面地理解这个程序的实现。 资源获取&a…...

uni-app下,页面跳转后wacth持续监听的问题处理

uni-app下&#xff0c;页面跳转后wacth持续监听的问题处理 好久没写博客了&#xff0c;最近碰到了一个uni-app&#xff08;vue2&#xff09;开发小程序的问题&#xff0c;个人觉得很典型&#xff0c;所以拿出来给各位做个参考。 需求场景&#xff1a; 全局轮询用户权限。简单…...

Python技术栈 —— 语言基础

Python基础 语法拾遗List与Tuple的区别yield关键字for in enumeratefor in zip 精彩片段测量程序用时 语法拾遗 List与Tuple的区别 ListTuple建立后是否可变可变不可变建立后是否可添加元素可添加不可添加 # list and tuple List [1, 2, 3, 4, 5] Tuple (1, 2, 3, 4, 5) p…...

redis cluster搭建

k8s部署 Redis Insight k8s部署redis集群_mob6454cc6c6291的技术博客_51CTO博客 占用的内存竟然这么小&#xff0c;才200M左右 随便选个节点进去&#xff0c;看能否连接上其他节点 redis-cli -h redis-cluster-v1-0.redis-cluster.project-gulimall.svc.cluster.local 再创建个…...

windows 11 本地运行ER-NeRF及pytorch3D安装

ER-NeRF本地运行只要梳理好依赖版本&#xff0c;运行起来就很顺畅 conda create -n ernerf python3.10 创建本项目虚拟环境conda install pytorch1.12.1 torchvision0.13.1 cudatoolkit11.3 -c pytorch 若windows有多个版本的cuda&#xff0c;需要在环境变量中切换至cuda 11.3&…...

mysql客户端navicat的一些错误合集

关于mysql的客户端的使用的一些问题 问题描述&#xff1a; 在使用navicat prenium客户端的时候&#xff0c;连接数据库出现 Table ‘performance_schema.session_variables’ doesn’t exist 错误 解决方案&#xff1a; 首先找到mysql的bin目录 然后winR 进入到cmd界面 输入…...

【力扣面试经典150题】(链表)K 个一组翻转链表

题目描述 力扣原文链接 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只…...

数据结构刷题

空间复杂度&#xff1a;临时开辟的空间、空间是可以重复利用的 递归为O(n) 时间复杂度&#xff1a;程序执行次数 消失的数字 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 思路1&#xff1a;利用连续的特点求等差和然后减去所有元素得到的就是消…...

【Android】设置全局标题栏

序言 在做项目的时候&#xff0c;有时候需要一个全局统一的标题栏&#xff0c;保证项目风格的统一&#xff0c;但是如果在每个activity上面都写一遍这个标题栏就很麻烦了&#xff0c;我们经常用的方法就是写个基类Activity&#xff0c;然后当某个Activity需要这个统一的标题栏…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

五子棋测试用例

一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏&#xff0c;有着深厚的文化底蕴。通过将五子棋制作成网页游戏&#xff0c;可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家&#xff0c;都可以通过网页五子棋感受到东方棋类…...

【深度学习新浪潮】什么是credit assignment problem?

Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...

基于谷歌ADK的 智能产品推荐系统(2): 模块功能详解

在我的上一篇博客&#xff1a;基于谷歌ADK的 智能产品推荐系统(1): 功能简介-CSDN博客 中我们介绍了个性化购物 Agent 项目&#xff0c;该项目展示了一个强大的框架&#xff0c;旨在模拟和实现在线购物环境中的智能导购。它不仅仅是一个简单的聊天机器人&#xff0c;更是一个集…...

初级程序员入门指南

初级程序员入门指南 在数字化浪潮中&#xff0c;编程已然成为极具价值的技能。对于渴望踏入程序员行列的新手而言&#xff0c;明晰入门路径与必备知识是开启征程的关键。本文将为初级程序员提供全面的入门指引。 一、明确学习方向 &#xff08;一&#xff09;编程语言抉择 编…...