[✔️]视频同步的心得

简介: [✔️]视频同步的心得

同步问题


因为ffmpeg解码出来的纹理需要传递给engine渲染,如果在play的时候就开始进行ffmpeg解码,生成的texture传递给engine进行渲染,这样也没啥问题


但是如果要符合视频的正常速率,就需要我们在合适的时机进行ffmpeg解码,然后再和engine进行同步,否则的话,就会造成渲染的视频播放速率和实际的视频播放速率不太一致


要解决这个同步问题,有很多办法


如果ffmpeg解码是在另外一个线程解码,的确可以缓解OpenGL线程卡顿的问题,但是需要注意ffmpeg的解码时机,如果ffmpeg的解码跟时间无关,


void thread(){
    while(ffmpeg->decode()){
        results->push(ffmpeg->currentFrame());
    }
}


如上的代码,在这个线程开始执行的时候,ffmpeg的解码结果就会不停的产生,那么你就得注意缓存ffmpeg的解码结果,否则OpenGL要真正渲染当前时间的画面时,就拿不到了


视频帧率和游戏帧率不一致导致的同步问题


因为游戏引擎一般的帧率都是每秒60帧,有些情况下,出于性能考虑,会将帧率锁定在30左右, FFMpeg解码视频也需要花费时间,如果视频的帧率比游戏的帧率还要高,那么游戏引擎在渲染视频时,必定会发生丢帧现象。


举个例子:


▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
| time | 0s    | 0.1s | 0.2s | 0.3s | 0.4s | 0.5s | 0.6s | 0.7s | 0.8s | 0.9s | 1s  |
--------------------------------------------------------------------------------------
|video | f0    |  f1  |  f2  |  f3  |  f4  |  f5  |  f6  |  f7  |  f8  |  f9  |  f10|
|game  | f0    |      |  f1  |      |  f2  |      |  f3  |      |  f4  |      |  f5 |
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔


如上所示例,游戏引擎的fps是每秒5帧,视频的fps是每秒10帧。


当游戏的帧率走到f1时,时间已经过去了0.2s,此时的0.2s对应的是视频的f2,也就是说,视频的f1帧就是解码出来了,游戏引擎在渲染的时候,因为时间同步的原因也会抛弃掉。


因此,视频的帧率不建议比游戏的帧率高,这样会浪费好多解码的视频帧,产生无效帧的同时还增加了CPU的负担,但是我们在处理音频时,还需要处理好这种情况,主动将落后时间过多的视频帧丢弃掉。


如果视频的帧率过高,还会导致解码的速度跟不上播放的速度,比如当前时间已经流逝到第1s,但是解码的视频帧还在第0.5s,通常的处理办法就是画面卡在解码出来的视频最后一帧,这样循环往复下去,视频的播放速率是比正常要慢的,原因就出在解码速度跟不上。


只有游戏引擎的帧率高于视频的帧率,渲染出来的视频效果才能表现出更多的细节,因为这种情况下,播放视频时不会发生丢帧现象。


视频帧过于提前当前时间,导致播放节奏变快


还有一种情况,就是我们也要校验当前的视频帧,是否提前于当前时间,如果过于视频帧过于提前,我们需要等待下当前时间,也就是说我们播放的视频帧时间和当前时间的关系如下:


当前时间-offset1 <= 视频帧时间 <= 当前时间+offset2


一般来说:


  • offset1(我设置的是40)要大一点,因为丢帧是为了追赶当前时间


  • offset2(我设置的是20)要小一点,因为等待时间到来时,当前是有画面的,稍微停留一下是感知不出来的


目录
相关文章
|
3月前
|
canal 关系型数据库 MySQL
蓝易云 - 详解canal同步MySQL增量数据到ES
以上就是使用Canal同步MySQL增量数据到Elasticsearch的基本步骤。在实际操作中,可能还需要根据具体的业务需求和环境进行一些额外的配置和优化。
84 2
|
4月前
|
消息中间件 关系型数据库 MySQL
Maxwell 概述、安装、数据同步【一篇搞定】!
Maxwell 是一个由 Zendesk 开源的用于 MySQL 数据库实时数据捕获和同步的工具,支持多种数据库系统,以 JSON 格式输出变更数据。它实时监控数据库中的更新,将变化传递给其他系统,常用于实时数据管道、数据仓库和事件驱动架构。Maxwell 具有实时性、可配置性和高性能等特点。其工作流程包括 Binlog 解析、数据解析、重构、发布到消息队列(如 Kafka)以及事件处理。安装时需注意 JDK 版本,并配置 MySQL、Zookeeper 和 Kafka。此外,Maxwell 支持定向监听特定库表,并能进行历史和增量数据同步。
|
4月前
|
存储 SQL DataWorks
要将MySQL整库同步到Holo
要将MySQL整库同步到Holo
107 2
|
cobar 运维 Oracle
yugong阿里巴巴去Oracle数据迁移同步工具(全量+增量,目标支持MySQL/DRDS)
2008年,阿里巴巴开始尝试使用 MySQL 支撑其业务,开发了围绕 MySQL 相关的中间件和工具,Cobar/TDDL(目前为阿里云DRDS产品),解决了单机 Oracle 无法满足的扩展性问题,当时也掀起一股去IOE项目的浪潮,愚公这项目因此而诞生,其要解决的目标就是帮助用户完成从 Oracle 数据迁移到 MySQL 上,完成去 IOE 的重要一步工作。
yugong阿里巴巴去Oracle数据迁移同步工具(全量+增量,目标支持MySQL/DRDS)
|
SQL 关系型数据库 MySQL
PolarDB-X 1.0-用户指南-分布式事务-基于 MySQL 5.6 的分布式事务
本文描述的分布式事务适用于MySQL 5.6版本,或版本早于5.3.4的DRDS实例。
276 0
|
SQL 关系型数据库 MySQL
PolarDB-X 1.0-用户指南-分布式事务-基于 MySQL 5.7 的分布式事务
如果您的 MySQL 版本 ≥ 5.7,并且PolarDB-X版本 ≥ 5.3.4 时,将会自动开启 XA 分布式事务,使用体验和单机 MySQL 数据库一致,无需特殊指令开启。 如果不满足上述要求,请您移步 基于 MySQL 5.6 的分布式事务文档。
235 0
|
SQL 存储 监控
PostgreSQL 逻辑同步
本文探讨 概念、用法、发布者、订阅者、复制槽管理、冲突、限制、架构、首次同步、监控、安全性、配置设置、实操(有主键表、无主键表、分区表的同步;列顺序不同、表结构不同等情况下的复制)
1107 0
PostgreSQL 逻辑同步
|
关系型数据库 MySQL 数据库
数据集成同步到mysql~小数点后面数据同步不过来
数据集成同步任务时候,用会出现这样一种现象:odps 表里的数据是 11490877.44 ,mysql数据源目标表字段类型float(16,2) 同步过来是11490877小数点后面数据没有同步过来。
|
机器学习/深度学习 SQL 关系型数据库
MySQL超时参数以及相关数据集成、DataX数据同步案例分享
一、背景 MySQL系统变量提供关于服务器的一些配置和能力信息,大部分变量可在mysqld服务进程启动时设置,部分变量可在mysqld服务进程运行时设置。合理的系统变量设值范围,是保障MySQL稳定提供服务的重要因素。
|
关系型数据库 MySQL PostgreSQL