音视频同步记录

FFmpeg简易播放器的实现-音视频同步 本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10284653.html 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文件解码和调用SDL显示两大部分。 FFmpeg简易播放器系列文章如下: [1]. FFmpeg简易播放器的实现-最简版 [2]. FFmpeg简易播放器的实现-视频播放 [3]. FFmpeg简易播放... 阅读详情

学习资源链接:链接1  链接2  链接3





目录 [hide]

视频的显示和存放原理

对于一个电影,帧是这样来显示的:I B B P。现在我们需要在显示B帧之前知道P帧中的信息。因此,帧可能会按照这样的方式来存储:IPBB。这就是为什么我们会有一个解码时间戳和一个显示时间戳的原因。解码时间戳告诉我们什么时候需要解码,显示时间戳告诉我们什么时候需要显示。所以,在这种情况下,我们的流可以是这样的:

PTS: 1 4 2 3
DTS: 1 2 3 4
Stream: I P B B

通常PTS和DTS只有在流中有B帧的时候会不同。

DTS和PTS

音频和视频流都有一些关于以多快速度和什么时间来播放它们的信息在里面。音频流有采样,视频流有每秒的帧率。然而,如果我们只是简单的通过数帧和乘以帧率的方式来同步视频,那么就很有可能会失去同步。于是作为一种补充,在流中的包有种叫做DTS(解码时间戳)和PTS(显示时间戳)的机制。为了这两个参数,你需要了解电影存放的方式。像MPEG等格式,使用被叫做B帧(B表示双向bidrectional)的方式。另外两种帧被叫做I帧和P帧(I表示关键帧,P表示预测帧)。I帧包含了某个特定的完整图像。P帧依赖于前面的I帧和P帧并且使用比较或者差分的方式来编码。B帧与P帧有点类似,但是它是依赖于前面和后面的帧的信息的。这也就解释了为什么我们可能在调用avcodec_decode_video以后会得不到一帧图像。

ffmpeg中的时间单位

AV_TIME_BASE

ffmpeg中的内部计时单位(时间基),ffmepg中的所有时间都是于它为一个单位,比如AVStream中的duration即以为着这个流的长度为duration个AV_TIME_BASE。AV_TIME_BASE定义为:

#define         AV_TIME_BASE   1000000

 

AV_TIME_BASE_Q

ffmpeg内部时间基的分数表示,实际上它是AV_TIME_BASE的倒数。从它的定义能很清楚的看到这点:

#define         AV_TIME_BASE_Q   (AVRational){1, AV_TIME_BASE}

 

AVRatioal的定义如下:

typedef struct AVRational{
int num; //numerator
int den; //denominator
} AVRational;

ffmpeg提供了一个把AVRatioal结构转换成double的函数:

复制代码
static inline double av_q2d(AVRational a){
/**
* Convert rational to double.
* @param a rational to convert
**/
    return a.num / (double) a.den;
}
复制代码

现在可以根据pts来计算一桢在整个视频中的时间位置:

timestamp(秒) = pts * av_q2d(st->time_base)
 

计算视频长度的方法:

time(秒) = st->duration * av_q2d(st->time_base)
 

这里的st是一个AVStream对象指针。

时间基转换公式

  • timestamp(ffmpeg内部时间戳) = AV_TIME_BASE * time(秒)
  • time(秒) = AV_TIME_BASE_Q * timestamp(ffmpeg内部时间戳)

所以当需要把视频跳转到N秒的时候可以使用下面的方法:

int64_t timestamp = N * AV_TIME_BASE; 
2
av_seek_frame(fmtctx, index_of_video, timestamp, AVSEEK_FLAG_BACKWARD);

ffmpeg同样为我们提供了不同时间基之间的转换函数:

int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)

这个函数的作用是计算a * bq / cq,来把时间戳从一个时基调整到另外一个时基。在进行时基转换的时候,我们应该首选这个函数,因为它可以避免溢出的情况发生。

链接:http://www.cnblogs.com/yinxiangpei/articles/3892982.html









av_gettime() 与 av_gettime_relative() 是什么含义? 总结: int64_t av_gettime(void) //返回大纪元开始后的微妙数 int64_t av_gettime_relative(void) // 返回开机后开始的微妙数 阅读详情

相关推荐

ffmpeg学习4--ffmpeg类的简单封装,包含解码和定时录像功能

ffmpeg学习4--ffmpeg类的简单封装,包含解码和定时录像功能         参考网上的资料,简单封装了一下ffmpeg,这里记录一下,其它传感器编码及项目中用到的已经抽离,这里只包含解码和录像部分。这只是个玩具级别的测试。完整测试代码下载:    ffmpegDeCode.h    #pragma once #include "stdafx.h" #include using n

2010yhh 3193

ffmpeg中的时间

ffmpeg中的时间 目录 [hide] 1 视频的显示和存放原理 1.1 DTS和PTS 2 ffmpeg中的时间单位 2.1 AV_TIME_BASE 2.2 AV_TIME_BASE_Q 2.3 时间基转换公式 视频的显示和存放原理 对于一个电影,帧是这样来显示的:I B B P。现在我们需要在显示B帧之前知道P帧中的信息。因此,帧可能会按照这样

Life is not divided 2030

Linux下V4L2+ALSA+FFmpeg音视频采集编码实战:从行车记录仪项目看多线程同步

本文详细解析了Linux下V4L2+ALSA+FFmpeg在行车记录仪项目中的音视频采集与同步技术。通过多线程架构设计、环形缓冲区管理和时间戳同步机制,实现高效的音视频数据采集、编码与封装。文章还分享了性能优化实战经验,包括内存管理、线程调度和电源优化等技巧,为嵌入式Linux多媒体开发提供实用参考。

weixin_42531925的博客 223

ISO时间转化时间戳

ISO时间转化时间戳 我们在实际的开发中 获取的时间格式是ISO格式时间(2018-07-22T16:00:00.000Z)时,比标准的时间少了8个小时。 以下方法转化为时间戳,更加有利于利于展示时间,一级排序 filters: { timeFilter(ms) { // 2020-06-01T04:24:43.230Z 获取到的时间格式 // 把时间的中的T和Z 替换成空字符串 l

达拉崩巴斑得贝迪卜多比鲁翁_ 3831

FFmpeg简易播放器的实现5-音视频同步

如果仅仅是视频按帧率播放,音频按采样率播放,二者没有同步机制,即使最初音视频是基本同步的,随着时间的流逝,音视频会逐渐失去同步,并且不同步的现象会越来越严重。[4]. 解码器中会缓存一定数量的帧,一个新的解码动作启动后,向解码器送入好几个 packet 后解码器才会输出第一个 packet,这比较容易理解,因为解码时帧之间有信赖关系,例如 IPB 三个帧被送入解码器后,B 帧解码需要依赖 I 帧和 P 帧,所以在 B 帧输出前,I 帧和 P 帧必须存在于解码器中而不能删除。为简便,就不贴图了。

yinshipin007的博客 669

【Cicadaplayer】基于FFmpeg 计算缓存队列duration:av_rescale_q 、av_get_time_base_q、av_q2d

深入理解pts,dts,time_base ffplay 包队列 duration 计算 每个包的duration,最小是15 #define MIN_PKT_DURATION 15 队列的duration 是包的duration 累加的: q->duration += FFMAX(pkt1->pkt.duration, MIN_PKT_DURATION); 减少 至少也要减少 15 q->duration -= FFMAX(pkt1-&g..

突围 792

音视频的同步原理--记录

1. 音视频同步的原理 2. 音视频同步的较正方法 3. 音视频同步时遇到的问题 声明:以下所有内容均为转载 1.原文转自:http://bbs.chinavideo.org/viewthread.php?tid=1183&extra=page%3D1%26amp%3Bfilter%3Ddigest&page=1 下面贴出...

weixin_33713350的博客 137

别再自己写组件了!用uni-app的midButton属性5分钟搞定中间凸起TabBar(H5/小程序通用)

本文详细介绍了uni-app官方提供的midButton属性,帮助开发者5分钟内实现中间凸起的TabBar效果,无需编写繁琐的自定义组件代码。该方案兼容H5和微信小程序平台,配置简单且维护成本低,大幅提升开发效率和性能表现。

weixin_30431445的博客 347

音视频基础学习之【04.音视频同步优化方案】

目录 音视频同步的几种方案 各个方案的比较 视频时钟的计算方式 音频时钟的计算方式 视频同步到音频时钟的方法 参考 音视频同步的几种方案 音频同步到视频 视频同步到音频 音视频都同步到外部时钟 各个方案的比较 第一种方案,势必会出现音频的卡顿或加速,非常影响观感体验 第二种方案比第一种更加合理,因为音频一般和外部时钟是相同的,而且考虑到人对声音的敏感度要强于视频,所以一般会以音频时钟为参考时钟,视频同步到音频上 第三种方案,通常在播放网络流或者视频源没有音频时钟的情况下使用,是更加

存星的博客 435

Vivado2023.2与Vitis协同开发:从Hello World到BOOT.BIN的完整流程解析

本文详细解析了使用Vivado 2023.2与Vitis协同开发ZYNQ/MPSoC平台的完整流程。从环境安装、硬件设计、软件编写、在线调试到生成独立的BOOT.BIN启动文件,手把手指导开发者完成从Hello World到系统固化的全步骤,并提供了常见问题的避坑指南,帮助初学者快速掌握软硬件协同开发的核心技能。

weixin_29197051的博客 176

开关电源EMC整改案例-辐射骚扰

2.4.1 获得原始数据。同样的分析可以应用在差模电流的情况, 唯一不同的是, 两根导线的磁场分布是相反的, 磁 场互相抵消, 由于导线中的电流大小相等, 产生的磁场 H 大小相同, 在互相靠近的情况下, 在磁 环内的两个感应磁场大小相同、方向相反, 因此合成之后的感应磁场 B 几乎为 0,对任意一根导 线而言,相当于是一段“无感导线”,对差模电流不会产生任何抑制作用。众所周知, 共模电感的匝数越多, 感量越大, 按道 理来说对共模干扰电流的抑制也会越强烈,对抗辐射 也越有利,然而事实真的如此吗?

经营范围: CTA、SRRC、CCC、移动、电信、联通入库 3496

音视频采集推流时间戳记录方案

落点值 = T = current systime - starttime //当前系统时间 – 起始时间。frameTimeStamp = current systime - start time //第一帧时间戳= 系统时间–起始时间。//如果当前帧的计算时间戳(CurrentFrameTS)与系统时间差值(T)的绝对值大于等于一个半帧间隔,那么我们就应该将当前帧的时间戳直接设置为系统时间差值T。初始化 starttime = systime。

weixin_50873490的博客 2672

不只是驱动:拆解AIC8800 WiFi模组在RK Android系统的完整启动链(从DTS到HAL)

本文深入解析了AIC8800 WiFi模组在RK Android系统中的完整启动链,从设备树(DTS)配置到HAL层适配,涵盖驱动移植、固件加载及用户空间服务协同等关键环节。通过详细的技术分析和调试技巧,帮助开发者解决RK平台与AIC8800模组的兼容性问题,优化WiFi子系统性能。

weixin_30439067的博客 492

今天你云同步了吗

今天你云同步了吗大多数人认为云计算离我们的日常生活很远。其实,云计算已经***到我们生活和工作中的方方面面,尤其是云同步,更是目前必不可少的应用技术。我们每天都可以用云同步软件做什么?又有哪些你未曾想到过的环境可以使用云同步呢?不妨跟着聪明的一休一起去看看他的解决方案吧。一休是著名的动漫人物,以头脑聪明、善于解决疑难问题而著称,不少朋友从《聪明的一休》上见识过他...

weixin_34112208的博客 454

学习STM32的DS18B20温度传感器

该函数首先复位传感器,然后发送跳过ROM命令和转换命令,并等待转换完成。接下来,它再次复位传感器,发送跳过ROM命令和读取温度命令。最后,它读取温度值的最低字节和最高字节,并将其组合成16位温度值。传感器的VCC引脚连接到STM32的3.3V电源,GND引脚连接到GND,而数据引脚连接到任何一个IO引脚。需要注意的是,示例代码中使用了一个简单的延时函数来等待转换完成。实际上,您可能需要使用定时器或其他更精确的延时方法来实现更准确的延时。下面是一个示例代码,演示如何读取DS18B20传感器的温度值。

m0_75244442的博客 1180

9篇9章1节:认识 SHARE 数据库

SHARE数据库是欧洲最大的跨国老龄化追踪调查项目,覆盖28个欧洲国家和以色列的50岁及以上人群。自2004年启动以来,已完成14-16万受访者的50-60万次访谈,形成跨度20年的纵向数据。该数据库采用标准化的多阶段抽样方法,收集健康、经济和社会关系等领域的多维度信息,具有高度的跨国可比性。SHARE与美国HRS、英国ELSA等调查对接,构成全球老龄化研究网络。数据免费向科研人员开放,但需注册并承诺仅用于非商业性研究。该项目由欧盟委员会等多方资助,为老龄化研究和政策制定提供了重要实证依据。

MD Code 898

视频播放器--音视频同步

之前已经完成了音频和视频的播放,但是发现音频的播放速度要明显快于视频。由于音频和视频解码时间、渲染时间的不同,所以要进行音视频同步。 由于人耳的听觉灵敏度是要高度视觉的。假如音频少一帧的话是能够明显感觉到的。但是视频少一帧是很难察觉到的。所以所以视频同步的关键是以音频播放为准,视频不断的去减少两者之间的相对播放时间。 一、记录音频的相对播放时间 1、声明变量clock(相对开始的播放时间),...

qinbin2015的博客 969

软解调详解

在这个示例中,生成了一个随机的比特序列,将其调制为QPSK信号,添加了高斯白噪声,然后计算了每个比特的LLR,并根据LLR的符号进行了解调判决。软解调是一种基于接收信号的概率估计进行解调的方法。与传统的硬解调相比,软解调不仅考虑了接收信号的幅度和相位信息,还利用统计特性计算每个比特为0或1的概率,从而提高了解调性能。软解调过程中涉及的主要公式包括对数似然比(LLR)的计算公式、信号的概率分布函数以及解调判决公式等。软解调的计算处理流程包括信号接收、预处理、相位估计、LLR计算、解调判决和输出等步骤。

ahah12345678的博客 1225

关于ffmpeg实现音视频同步具体实践

这是一个基于Qt框架实现的音视频播放器项目,采用多线程架构设计。主要包含解封装线程、音频解码线程和视频解码线程三个核心模块。解封装线程负责读取媒体文件并分离音视频流,将数据包分别送入对应的解码队列。音频解码线程通过重采样和变速处理后将PCM数据送入音频设备播放,同时维护音频时钟供视频同步使用。视频解码线程采用音视频同步算法,通过动态调整帧间延迟实现同步播放,最后通过QOpenGLWidget进行视频渲染。项目采用模块化设计,各线程通过互斥锁实现线程安全,支持播放控制、进度同步等功能。代码已开源在GitHub

m0_62092496的博客 726

SAP-MM:SAP MM(物料管理)模块 的系统化学习计划

SAP MM模块的系统化学习计划

baidu_35680696的博客 1545

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

scrcpy录制功能完全指南:5个关键技巧实现完美音视频同步

scrcpy是一款强大的Android设备屏幕镜像和控制工具,其录制功能支持视频和音频的同步录制,时间戳在设备端采集,完全不受网络延迟影响,确保录制内容完美同步。无论是游戏直播、应用演示还是会议记录,scrcpy都能提供专业级的录制体验。 ## 为什么scrcpy录制功能如此出色? scrcpy的录制功能具有独特的技术优势: - **设备端编码技术**:视频和音频直接在Android设备上编

gitblog_00639的博客 896

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

AEE胸牌记录仪助力国网智慧电力建设,推进安全监督与管理

相较于传统执法记录仪的庞大体积和沉淀的负重感,AEE DSJ-P1胸牌服务记录仪专为服务行业设计,采用胸牌+记录的全新商务风格的设计理念,外观时尚简约,体积轻薄小巧,佩戴方便简单无负重。

WWW4527的博客 532

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

TSMaster视频与音频记录功能的操作指南

路试跑了一圈,CAN 报文里到处是"异常"——但到底哪个动作触发的?以前你只能靠逻辑推,现在 TSMaster 让你直接查看音视频记录。

TOSUN 同星智能的博客 288
上一篇: FFmpeg中的重要数据结构
下一篇: Linux 系统获取系统时间
tkp2014
博客等级 码龄12年 137粉丝 241原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值