今天在一个流媒体群里,看到一个大神分享自己解决网络抖动、音视频同步的方法,记录一下学习学习。

注:时间是用的相对时间戳,则时间越小播放越快,注释很明白相信大家一看就明白了。

变量名称
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帧的时候会出现花屏或者黑屏的情况,甚至播不出来。这时候就有两个方案来处理这个问题。

1:帧精确
2:fastpaly
帧精确好理解 就是把一个gop切到的重新编码,即服务器把切到的P帧再重新编码为I帧,再下发但这样效率会很低
更多的 更好的是才用第二种
比如一个gop 25帧,你播放器切到了第10帧 是个p帧,整个gop从i帧到你切的这个p帧数据一定要照常发送才能解码出来不花屏。但最核心的是要改这个gop的时间戳 ,从i帧到这个切的p帧 。假设你切的这个p帧时间戳是100,那前面的10帧就是90 91 ....100,这就是fastpaly,既解决延迟 又解决花屏,即修改当前gop中的I帧到切换的P帧中的所有帧的时间,服务器端默认都会缓冲一个gop的。
例如开源的srs 服务器 在 src/app/srs_app_source.h中有个  SrsGopCache类进行gop缓冲,SrsRtmpJitter进行时间戳抖动处理,如果需要大家可以去看看。

音视频同步、网络抖动相关推荐

  1. WebRTC 音视频同步分析

    文中提到的代码引用自 libwebrtc M96 版本 https://github.com/aggresss/libwebrtc/tree/M96 0x00 前言 WebRTC 音频和视频分别通过不 ...

  2. WebRTC音视频同步详解

    WebRTC音视频同步详解 1 WebRTC版本 2 时间戳 2.1 视频时间戳 2.2 音频时间戳 2.3 NTP时间戳 2 延迟 3 同步 3.1 一张图看懂音视频同步 3.2 音视频相对延迟 3 ...

  3. ffmpeg rtsp转hls_Qt音视频开发24-ffmpeg音视频同步

    ## 一.前言 用ffmpeg来做音视频同步,个人认为这个是ffmpeg基础处理中最难的一个,无数人就卡在这里,怎么也不准,本人也是尝试过网上各种demo,基本上都是渣渣,要么仅仅支持极其少量的视频文 ...

  4. 音视频同步-ffmpeg

    音视频同步肯定是需要使用时间戳进行同步的,音频和视频的时间戳进行对比,哪个小就写入哪个包,基本上可以实现音视频同步. 但是这个时间戳从哪里来呢? 使用rtp头中携带的时间戳是最正确的方法,因为音视频流 ...

  5. 深入理解Android音视频同步机制(二)ExoPlayer的avsync逻辑

    深入理解Android音视频同步机制(一)概述 深入理解Android音视频同步机制(二)ExoPlayer的avsync逻辑 深入理解Android音视频同步机制(三)NuPlayer的avsync ...

  6. 即构互动白板音视频同步、多端协作技术实践

    8月27日晚,即构联合技术社区LiveVideoStack在线上举办了互动白板的技术分享直播活动,吸引了大量在线教育及音视频相关的开发者参与.即构科技互动白板研发负责人陈晓聪在活动上分享了我们在互动白 ...

  7. 【Android音视频开发】【020】音视频同步原理

    音视频不同步现象 由于视频解码和显示,非常消耗性能,所以视频帧无法和音频帧一样,保证每一帧都能严格准时播放 在现有技术和硬件条件下,任何库都无法百分百保证音视频同步,只能尽力保证误差最小 同步方案 一 ...

  8. 音视频同步原理及实现

    本文主要描述音视频同步原理,及常见的音视频同步方案,并以代码示例,展示如何以音频的播放时长为基准,将视频同步到音频上以实现视音频的同步播放.内容如下: 1.音视频同步简单介绍 2.DTS和PTS简介 ...

  9. ffmpeg入门小结(二)——音视频同步

    1.H264格式简介(视频解码同步相关) ---------------------- 前言 ----------------------- H264是新一代的编码标准,以高压缩高质量和支持多种网络的 ...

  10. 视频【解码】原理(播放器原理),音视频同步等

    1.视频编码格式:H264, VC-1, MPEG-2, MPEG4-ASP (Divx/Xvid), VP8, MJPEG 等.  2.音频编码格式:AAC, AC3, DTS(-HD), True ...

最新文章

  1. 5 个关于 API 中日期和时间设计规则
  2. 股市大涨是不是楼市就要跌了?
  3. jna 使用_使用JNA的透明JFrame
  4. mysql操作json优点和缺点_MySQL与JSON-为什么?
  5. 提取多个字段_动态合并多个工作表,数据再多也不怕
  6. springsecurity文档_今天学了springsecurity
  7. RhinoMock异常ExpectationViolationException以及解决
  8. Tiktok预计下半年开通购物车,你有想法做吗?
  9. 蓝桥杯 ALGO-115 算法训练 和为T Java版
  10. 2013-2018卷积神经网络中十个最重要的概念与创新
  11. 计算机更新bios,win7bios升级教程_win7电脑主板bios升级的方法
  12. 带你走进CoDeSys
  13. Swift5使用KVC报setValue:forUndefinedKey
  14. apktool助手转java_apktool助手
  15. 搭建配置私服-nexus ,Maven中的使用——3
  16. 使用Google word2vec训练我们自己的词向量模型
  17. 大学c语言作业用什么搜题比较好,快速查找题库_什么手机软件可以把题库输入进去然后输入关键字可以查找点道题_淘题吧...
  18. 解决Unable to find encoder for type stored in a Dataset问题
  19. Flutter 状态管理指南之 Provider
  20. 手工折纸作品展示:送别的花束

热门文章

  1. 计算机网络图片大全,说说心情图片大全唯美
  2. python软件长什么样子图片_使用Python把多个图片拼接成为长图
  3. 多元时间序列预测 —— 向量自回归(VAR)
  4. c语言程序设计诗句,诗歌大全
  5. 解决网络正常,但chrome浏览器无法正常使用的问题
  6. 怎么在计算机登录VMware,vmware虚拟机怎么用,vmware虚拟机的使用方法
  7. 软件开发需要学什么?
  8. 走进C++11(四十)最宽松的顺序 memory_order_relaxed 内存模型(三)
  9. 北大AI公开课第十课--人工智能在生命科学中的应用by碳云智能李英睿
  10. Turtle画图之太阳花