Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >音视频同步问题(第一弹)

音视频同步问题(第一弹)

作者头像
用户6280468
发布于 2022-03-21 10:55:29
发布于 2022-03-21 10:55:29
67600
代码可运行
举报
文章被收录于专栏:txp玩Linuxtxp玩Linux
运行总次数:0
代码可运行

前言:

大家好,由于最近工作上碰到一些关于音视频不同步的问题,比如音频跟不上视频的播放速度;基于此,今天给大家分享一篇关于音视频同步的问题,本系列文章会分为几篇来分享,先从基础的音视频同步理论开始,然后再进行基于ffplay里面的源码实战来加深音视频同步的理解!

一、音视频同步基础:

首先我们先来了解一下什么是音视频同步,相信之前看过前面几期关于ffplay源码解析的文章的朋友应该知道,在一个播放器进行解码拿到数据这个环节里面,音频和视频各自有自己的线程进行处理各自对应的数据!

那么在这个环节就可能会出现问题,比如说,音频线程和视频线程可能不会同时解出音视频和视频帧,那么这就会造成后面的播放出现不同问题!也就会出现音视频不同的问题,直白的说,音视频同步就好比我们平时用一个播放器去播放一个视频文件(包括音频和视频!),会出现视频画面和视频画面人物说话的声音对应不上,这就会造成非常差的体验感。

所以为了今后更好的解决实际开发问题,我们在此之前需要掌握一些基础理论知识,下面我们来看一下什么是PTS和DTS、timebase,先来说一下理论概念,后期再通过实战来理解它,当前你只要知道有这三个东西就行:

  • DTS(Decoding Time Stamp),也就是解码时间戳,它会告诉播放器在什么时候来解码这一帧的数据.
  • PTS(Presentation Time Stamp),也就是显示时间戳,那么它也会告诉播放器在什么时候来显示这一帧的数据。
  • timebase时基:PTS值的真正时间单位,一般是秒;同时我们要注意在ffplay里面,PTS值的数据类型是double的,比如下面我定义了一个音频的PTS的变量并进行初始化:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 double audio_pts = 0.020;

同时在ffplay里面,timebase的类型是结构体AVRational(其中一个结构体成员是表示分子,另外一个是表示分母!),具体代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
typedef struct AVRational{
  int num;
  int den;
}AVRational;

那么通过这个如何来计算出PTS的显示时间呢?

比如说timebase={1,100},表示100毫秒,如果pts=1000,那么1000*1/100=10秒,意思就是这帧数据需要在第10秒的时候被显示出来!

因此在ffmpeg里面有一个关于把AVRational转变成double类型的接口实现,我们利用这个接口来计算pts的显示时间就非常方便了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Convert an AVRational to a `double`.
 * @param a AVRational to convert
 * @return `a` in floating-point form
 * @see av_d2q()
 */
static inline double av_q2d(AVRational a){
    return a.num / (double) a.den;
}

所以显示时间戳的时间计算就等于:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pts * av_q2d(参数)

二、常用的音视频同步策略理论解决:

一般有三种解决方法:

  • (1):以音频为基准,同步视频到音频;如果视频慢了,就丢弃部分视频帧(会出现跳帧现象!);如果视频快了,就继续渲染上一帧。
  • (2)以视频为基准,同步音频到视频;如果音频慢了,则加快播放速度,或者也丢弃部分视频帧,不过会出现断音出现;如果音频慢了,就放慢播放速度,或者重复上一帧。但是这里改变播放速度,会涉及重采样的问题!
  • (3)以外部时钟为基准,同步音频和视频到外部时钟

三、总结:

今天的内容就简单分享到这里,更多的是咋们在实际开发过程中,如果遇到类似问题,该如何快速把这种问题解决掉才是关键,这也是需要咋们平时基础的积累!

下期,我们继续!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 txp玩Linux 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PyTorch多GPU并行训练方法及问题整理
以下都在Ubuntu上面进行的调试, 使用的Ubuntu版本包括14, 18LST
公众号机器学习与AI生成创作
2020/09/14
15.1K0
PyTorch多GPU并行训练方法及问题整理
深入理解Pytorch中的分布式训练
作者:台运鹏 (正在寻找internship...) 主页:https://yunpengtai.top
zenRRan
2023/01/12
1.5K0
深入理解Pytorch中的分布式训练
【Ubuntu】分布式训练/pycharm远程开发
摸到了组里配备的多卡服务器,对于一个习惯单卡环境的穷学生来说,就像是鸟枪换炮,可惜这炮一时还不会使用,因此就有了此番学习。
zstar
2022/10/08
2.1K0
【Ubuntu】分布式训练/pycharm远程开发
Pytorch 多卡并行训练
DataParallel 使用起来非常方便,我们只需要用 DataParallel 包装模型,再设置一些参数即可。需要定义的参数包括:参与训练的 GPU 有哪些,device_ids=gpus;用于汇总梯度的 GPU 是哪个,output_device=gpus[0] 。DataParallel 会自动帮我们将数据切分 load 到相应 GPU,将模型复制到相应 GPU,进行正向传播计算梯度并汇总:
为为为什么
2022/08/09
4.2K0
Pytorch 多卡并行训练
当代研究生应当掌握的并行训练方法(单机多卡)
每天给你送来NLP技术干货! ---- 排版:AI算法小喵 1. Take-Away 笔者使用 PyTorch 编写了不同加速库在 ImageNet 上的使用示例(单机多卡)。需要的同学可以当作 quickstart 将所需要的部分 copy 到自己的项目中(Github 请点击下面链接): nn.DataParallel[1] 简单方便的 nn.DataParallel torch.distributed[2] 使用 torch.distributed 加速并行训练 torch.multiprocessi
zenRRan
2022/08/26
1.7K0
当代研究生应当掌握的并行训练方法(单机多卡)
【AI大模型】训练Al大模型
应用领域 首先来谈一谈大模型的·成就 大模型已经在许多应用领域取得了显著的成果,包括:
洁洁
2023/10/10
1.1K0
【AI大模型】训练Al大模型
PyTorch分布式训练进阶:这些细节你都注意到了吗?
导语 | pytorch作为目前主流的深度学习训练框架之一,可以说是每个算法同学工作中的必备技能。此外,pytorch提供了极其方便的API用来进行分布式训练,由于最近做的工作涉及到一些分布式训练的细节,在使用中发现一些之前完全不会care的点,现记录于此,希望对有需求的同学有所帮助。 本文包含: pytorch分布式训练的工作原理介绍。 一些大家平时使用时可能不太注意的点,这些点并不会导致直观的bug或者训练中断,但可能会导致训练结果的偏差以及效率的降低。 同时结合某些场景,介绍更为细粒度(group)的
腾讯云开发者
2022/05/13
1.1K0
PyTorch分布式训练进阶:这些细节你都注意到了吗?
PyTorch中的多GPU训练:DistributedDataParallel
在pytorch中的多GPU训练一般有2种DataParallel(DP)和DistributedDataParallel(DDP) ,DataParallel是最简单的的单机多卡实现,但是它使用多线程模型,并不能够在多机多卡的环境下使用,所以本文将介绍DistributedDataParallel,DDP 基于使用多进程而不是使用多线程的 DP,并且存在 GIL 争用问题,并且可以扩充到多机多卡的环境,所以他是分布式多GPU训练的首选。
deephub
2022/11/11
1.3K0
PyTorch中的多GPU训练:DistributedDataParallel
[源码解析] PyTorch分布式(5) ------ DistributedDataParallel 总述&如何使用
本文是 PyTorch 分布式系列的第五篇,以几篇官方文档的翻译为基础,加入了自己的一些思考,带领大家进入DistributedDataParallel,在后续会用5~6篇左右做深入分析。
罗西的思考
2021/11/18
2.3K0
[源码解析] PyTorch分布式(5) ------ DistributedDataParallel 总述&如何使用
[源码解析] PyTorch 分布式(17) --- 结合DDP和分布式 RPC 框架
在前面的文章之中,我们已经学习了PyTorch 分布式的基本模块,接下来我们通过几篇文章来看看如何把这些模块应用到实践之中,顺便把PyTorch分布式逻辑整体梳理一下。本文介绍如何把DDP和RPC framework结合起来。
罗西的思考
2021/12/17
6330
[源码解析] PyTorch 分布式(17) --- 结合DDP和分布式 RPC 框架
[源码解析] PyTorch 分布式(11) ----- DistributedDataParallel 之 构建Reducer和Join操作
因为前文已经围绕Reducer相关的各种成员变量做了相关分析,所以本文开始做动态逻辑分析,目的是:把前面几篇文章串联起来,为后面分析前向传播和反向传播设定基础。
罗西的思考
2021/11/29
1.5K0
batch-compute & GPU分布式机器学习
当用户提交一些机器学习任务时,往往需要大规模的计算资源,但是对于响应时间并没有严格的要求。在这种场景下,首先使用腾讯云的batch-compute(批量计算)产品来自动化提交用户的任务,然后使用分布式+gpu的方式解决算力问题,在任务完成后通知用户,是一个可行的解决方案。
用户7480322
2020/07/17
1.2K0
class torch.nn.parallel.DistributedDataParallel()
torch.nn.parallel.DistributedDataParallel(module, device_ids=None, output_device=None, dim=0, broadcast_buffers=True, process_group=None, bucket_cap_mb=25, find_unused_parameters=False, check_reduction=False)[source]
狼啸风云
2020/05/11
1.9K0
[源码解析] PyTorch 分布式(2) ----- DataParallel(上)
DataParallel 从流程上来看,是通过将整个小批次(minibatch)数据加载到主线程上,然后将子小批次(ub-minibatches)数据分散到整个GPU网络中来工作。
罗西的思考
2021/11/11
1.2K0
[源码解析] PyTorch 分布式(2) ----- DataParallel(上)
PyTorch分布式训练简介
分布式训练已经成为如今训练深度学习模型的一个必备工具,但pytorch默认使用单个GPU进行训练,如果想用使用多个GPU乃至多个含有多块GPU的节点进行分布式训练的时候,需要在代码当中进行修改,这里总结一下几种使用pytorch进行分布式训练的方式。
狼啸风云
2020/02/13
5.1K0
大模型的实践应用-大语言模型的分布式训练并行策略,数据并行原理
大家好,我是微学AI,今天给大家介绍一下大模型的实践应用14-大语言模型的分布式训练并行策略,数据并行原理。大语言模型的分布式训练并行策略主要通过数据并行来实现。数据并行是指将训练数据划分为多个小批量, 然后将这些小批量分配给不同的计算设备进行并行处理。通过数据并行的并行策略,每个计算设备都可以独立地计算小批量数据的梯度,并将结果进行聚合,从而实现模型的并行训练。这种分布式训练策略可以加速大语言模型的训练过程,并提高模型的性能和效果。
微学AI
2025/05/29
2190
大模型的实践应用-大语言模型的分布式训练并行策略,数据并行原理
Pytorch 分布式训练
即进程组。默认情况下,只有一个组,一个 job 即为一个组,也即一个 world。
肉松
2020/09/07
2.6K0
Pytorch 分布式训练
DeepSpeed大模型分布式训练
iResearch666
2023/09/13
1K0
DeepSpeed大模型分布式训练
【他山之石】“最全PyTorch分布式教程”来了!
“他山之石,可以攻玉”,站在巨人的肩膀才能看得更高,走得更远。在科研的道路上,更需借助东风才能更快前行。为此,我们特别搜集整理了一些实用的代码链接,数据集,软件,编程技巧等,开辟“他山之石”专栏,助你乘风破浪,一路奋勇向前,敬请关注。
马上科普尚尚
2020/12/15
3.3K0
【他山之石】“最全PyTorch分布式教程”来了!
万亿参数背后的算力密码:大模型训练的分布式架构与自动化运维全解析
在人工智能技术高速发展的当下,AI 大模型凭借其强大的学习能力和泛化能力,已成为推动各领域变革的核心力量。深度学习作为 AI 大模型的技术基石,通过构建多层神经网络实现复杂模式识别;分布式计算解决了大模型训练所需的海量算力问题;自动化技术则大幅提升了模型开发、部署及应用的效率。三者深度融合,正在重塑整个 AI 生态。
羑悻的小杀马特.
2025/05/25
1640
万亿参数背后的算力密码:大模型训练的分布式架构与自动化运维全解析
推荐阅读
相关推荐
PyTorch多GPU并行训练方法及问题整理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验