音视频同步、网络抖动
今天在一个流媒体群里,看到一个大神分享自己解决网络抖动、音视频同步的方法,记录一下学习学习。
注:时间是用的相对时间戳,则时间越小播放越快,注释很明白相信大家一看就明白了。
变量名称
static int m_timer_realtime_video ; //每一次回调渲染数据定时器时间,可根据时间戳变化,毫秒
static long long m_audio_list_node_pts; //当前从pcm的list中取出的时间最新 //解决网络抖动问题
static long long m_audio_openal_pts; //音频当前正在播放时间戳 //解决网络抖动问题
//存放解码后yuv数据的list
static list<Raw_data_yuv> m_list_Raw_data_yuv;
//存放解码后pcm数据的list
static list<Raw_data_pcm> m_list_Raw_data_pcm;
优化版本
音视频同步
//具体算法
见大神博客http://blog.csdn.net/zhuweigangzwg/article/details/59528378
//得到当前音频从包里拿出的pts减去第一帧pts所得时间再减去openal缓存的时间。//解决网络抖动问题
long long m_audio_real_pts = (m_audio_list_node_pts - m_first_audio_pts) - lvs_openal_getnumqueuedsize_realpts();int delay = 0;
int diff = 0;;
//算出一帧视频本应该显示的时间
delay = 40;
// update delay to sync to audio
long long video_real_pts = yuv_data_node.pts - m_first_video_pts;printf("yuv_data_node.ActualLen : %lld video_real_pts :%lld\n",yuv_data_node.ActualLen,video_real_pts);//音频过快大于200毫秒 并且有音频存在的情况下 ,以及音频队列或缓存不为传输中间空 //解决网络抖动问题
if (m_audio_real_pts - video_real_pts > 200 && m_isfind_first_audio_pts == 1 && (m_list_Raw_data_pcm.size() != 0 || lvs_openal_getnumqueuedsize() != 0 ))
{m_timer_realtime_video = 1;
}
//视频过快大于200毫秒 并且有音频存在的情况下,以及音频队列或缓存不为传输中间空 //解决网络抖动问题
else if (video_real_pts - m_audio_real_pts > 200 && m_isfind_first_audio_pts ==1 &&
(m_list_Raw_data_pcm.size() != 0 || lvs_openal_getnumqueuedsize() != 0 ))
{m_timer_realtime_video = delay* 5; //如果 视频显示过快 则停留 5帧的时间
}
else
{diff = video_real_pts - m_audio_openal_pts; if(abs(diff) < AV_NOSYNC_THRESHOLD) //求浮点数x的绝对值{if(diff <= -delay) {delay = 10; //如果 视频显示过慢,离音频 过于远 则 显示时间为10ms} else if(diff >= delay){delay = 2 * delay; //如果 视频显示过快 则停留 两帧的时间}}m_timer_realtime_video = delay;
}
顺便请教了大神一些问题。下面是我整理的大神的分享。
当播放器接入服务器播放的时候不一定每次都切到I帧, 一旦产生切到P帧或者B帧的时候会出现花屏或者黑屏的情况,甚至播不出来。这时候就有两个方案来处理这个问题。
2:fastpaly
比如一个gop 25帧,你播放器切到了第10帧 是个p帧,整个gop从i帧到你切的这个p帧数据一定要照常发送才能解码出来不花屏。但最核心的是要改这个gop的时间戳 ,从i帧到这个切的p帧 。假设你切的这个p帧时间戳是100,那前面的10帧就是90 91 ....100,这就是fastpaly,既解决延迟 又解决花屏,即修改当前gop中的I帧到切换的P帧中的所有帧的时间,服务器端默认都会缓冲一个gop的。
音视频同步、网络抖动相关推荐
- WebRTC 音视频同步分析
文中提到的代码引用自 libwebrtc M96 版本 https://github.com/aggresss/libwebrtc/tree/M96 0x00 前言 WebRTC 音频和视频分别通过不 ...
- WebRTC音视频同步详解
WebRTC音视频同步详解 1 WebRTC版本 2 时间戳 2.1 视频时间戳 2.2 音频时间戳 2.3 NTP时间戳 2 延迟 3 同步 3.1 一张图看懂音视频同步 3.2 音视频相对延迟 3 ...
- ffmpeg rtsp转hls_Qt音视频开发24-ffmpeg音视频同步
## 一.前言 用ffmpeg来做音视频同步,个人认为这个是ffmpeg基础处理中最难的一个,无数人就卡在这里,怎么也不准,本人也是尝试过网上各种demo,基本上都是渣渣,要么仅仅支持极其少量的视频文 ...
- 音视频同步-ffmpeg
音视频同步肯定是需要使用时间戳进行同步的,音频和视频的时间戳进行对比,哪个小就写入哪个包,基本上可以实现音视频同步. 但是这个时间戳从哪里来呢? 使用rtp头中携带的时间戳是最正确的方法,因为音视频流 ...
- 深入理解Android音视频同步机制(二)ExoPlayer的avsync逻辑
深入理解Android音视频同步机制(一)概述 深入理解Android音视频同步机制(二)ExoPlayer的avsync逻辑 深入理解Android音视频同步机制(三)NuPlayer的avsync ...
- 即构互动白板音视频同步、多端协作技术实践
8月27日晚,即构联合技术社区LiveVideoStack在线上举办了互动白板的技术分享直播活动,吸引了大量在线教育及音视频相关的开发者参与.即构科技互动白板研发负责人陈晓聪在活动上分享了我们在互动白 ...
- 【Android音视频开发】【020】音视频同步原理
音视频不同步现象 由于视频解码和显示,非常消耗性能,所以视频帧无法和音频帧一样,保证每一帧都能严格准时播放 在现有技术和硬件条件下,任何库都无法百分百保证音视频同步,只能尽力保证误差最小 同步方案 一 ...
- 音视频同步原理及实现
本文主要描述音视频同步原理,及常见的音视频同步方案,并以代码示例,展示如何以音频的播放时长为基准,将视频同步到音频上以实现视音频的同步播放.内容如下: 1.音视频同步简单介绍 2.DTS和PTS简介 ...
- ffmpeg入门小结(二)——音视频同步
1.H264格式简介(视频解码同步相关) ---------------------- 前言 ----------------------- H264是新一代的编码标准,以高压缩高质量和支持多种网络的 ...
- 视频【解码】原理(播放器原理),音视频同步等
1.视频编码格式:H264, VC-1, MPEG-2, MPEG4-ASP (Divx/Xvid), VP8, MJPEG 等. 2.音频编码格式:AAC, AC3, DTS(-HD), True ...
最新文章
- 5 个关于 API 中日期和时间设计规则
- 股市大涨是不是楼市就要跌了?
- jna 使用_使用JNA的透明JFrame
- mysql操作json优点和缺点_MySQL与JSON-为什么?
- 提取多个字段_动态合并多个工作表,数据再多也不怕
- springsecurity文档_今天学了springsecurity
- RhinoMock异常ExpectationViolationException以及解决
- Tiktok预计下半年开通购物车,你有想法做吗?
- 蓝桥杯 ALGO-115 算法训练 和为T Java版
- 2013-2018卷积神经网络中十个最重要的概念与创新
- 计算机更新bios,win7bios升级教程_win7电脑主板bios升级的方法
- 带你走进CoDeSys
- Swift5使用KVC报setValue:forUndefinedKey
- apktool助手转java_apktool助手
- 搭建配置私服-nexus ,Maven中的使用——3
- 使用Google word2vec训练我们自己的词向量模型
- 大学c语言作业用什么搜题比较好,快速查找题库_什么手机软件可以把题库输入进去然后输入关键字可以查找点道题_淘题吧...
- 解决Unable to find encoder for type stored in a Dataset问题
- Flutter 状态管理指南之 Provider
- 手工折纸作品展示:送别的花束
热门文章
- 计算机网络图片大全,说说心情图片大全唯美
- python软件长什么样子图片_使用Python把多个图片拼接成为长图
- 多元时间序列预测 —— 向量自回归(VAR)
- c语言程序设计诗句,诗歌大全
- 解决网络正常,但chrome浏览器无法正常使用的问题
- 怎么在计算机登录VMware,vmware虚拟机怎么用,vmware虚拟机的使用方法
- 软件开发需要学什么?
- 走进C++11(四十)最宽松的顺序 memory_order_relaxed 内存模型(三)
- 北大AI公开课第十课--人工智能在生命科学中的应用by碳云智能李英睿
- Turtle画图之太阳花