直接上代码看注释吧可能理解的更深刻一点:

音视频同步有三种,视频同步音频,音频同步视频,音视频同步到其他时钟,本文介绍视频同步音频,其他方式不适用。项目采用openal做音频渲染,sdl同理,opengl做视频渲染。

//具体算法方案请看注释

[cpp] view plaincopy
  1. //得到当前音频从包里拿出的pts减去第一帧pts所得时间再减去openal缓存的时间。//解决网络抖动问题
  2. long long m_audio_real_pts = (m_audio_list_node_pts - m_first_audio_pts) - lvs_openal_getnumqueuedsize_realpts();
  3. int delay = 0;
  4. int diff = 0;;
  5. //算出一帧视频本应该显示的时间
  6. delay = 40;
  7. // update delay to sync to audio
  8. long long video_real_pts = yuv_data_node.pts - m_first_video_pts;
  9. printf("yuv_data_node.ActualLen : %lld video_real_pts :%lld\n",yuv_data_node.ActualLen,video_real_pts);
  10. //音频过快大于200毫秒 并且有音频存在的情况下 ,以及音频队列或缓存不为传输中间空     //解决网络抖动问题
  11. if (m_audio_real_pts - video_real_pts > 200 && m_isfind_first_audio_pts == 1 &&
  12. (m_list_Raw_data_pcm.size() != 0 || lvs_openal_getnumqueuedsize() != 0 ))
  13. {
  14. m_timer_realtime_video = 1;
  15. }
  16. //视频过快大于200毫秒 并且有音频存在的情况下,以及音频队列或缓存不为传输中间空      //解决网络抖动问题
  17. else if (video_real_pts - m_audio_real_pts > 200 && m_isfind_first_audio_pts ==1 &&
  18. (m_list_Raw_data_pcm.size() != 0 || lvs_openal_getnumqueuedsize() != 0 ))
  19. {
  20. m_timer_realtime_video = delay* 5; //如果 视频显示过快 则停留 5帧的时间
  21. }
  22. else
  23. {
  24. diff = video_real_pts - m_audio_openal_pts;
  25. if(abs(diff) < AV_NOSYNC_THRESHOLD) //求浮点数x的绝对值
  26. {
  27. if(diff <= -delay)
  28. {
  29. delay = 10;       //如果 视频显示过慢,离音频 过于远 则 显示时间为10ms
  30. }
  31. else if(diff >= delay)
  32. {
  33. delay = 2 * delay;  //如果 视频显示过快 则停留 两帧的时间
  34. }
  35. }
  36. m_timer_realtime_video = delay;
  37. }

//变量名称

[cpp] view plaincopy
  1. static int m_timer_realtime_video ;            //每一次回调渲染数据定时器时间,可根据时间戳变化,毫秒
  2. static long long m_audio_list_node_pts;                //当前从pcm的list中取出的时间最新  //解决网络抖动问题
  3. static long long m_audio_openal_pts;                   //音频当前正在播放时间戳          //解决网络抖动问题
  4. //存放解码后yuv数据的list
  5. static list<Raw_data_yuv> m_list_Raw_data_yuv;
  6. //存放解码后pcm数据的list
  7. static list<Raw_data_pcm> m_list_Raw_data_pcm;

//实现效果

播放器音视频同步及网络抖动解决方案相关推荐

  1. NDK开发——FFmpeg实现视频转YUV、视频转RGB显示、音频转PCM、音频播放、音视频同步

    项目演示 前提准备 编译FFmpeg+CMake并能运行,详细可见我博客 下载libyuv库并编译成libyuv.so库,用于实现转换RGB格式功能 FFmpeg库简介 avcodec:编解码,包含 ...

  2. 使用FFmpeg实现rtmp播放和音视频同步

    使用FFmpeg4.2.2实现本地视频和rtmp直播流的播放,实现了音视频同步 git地址

  3. 【音频播放】自制音频播放器—音视频基础概念,未完待续。。。

    近期用Electron制作了一个简易版客户端,未完待补充,重点在播放,引用凯教,先说几点.(图片禁止搬运,不得允许不准转载) 研究音频的数字化技术之前,必须对声音和图像的的物理性质有基本的了解. 如下 ...

  4. FFmpeg/WebRTC/RTMP/RTSP/HLS/播放器-音视频流媒体高级开发【零声学院】

    FFmpeg/WebRTC/RTMP/RTSP/HLS/播放器-音视频流媒体高级开发 学习 音视频流媒体高级开发学习 01音视频基础 [录播]0-音视频开发高级课程简介(22分钟) 免费试学 [录播] ...

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

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

  6. 音视频从入门到精通——FFmpeg 播放器实现音视频同步的三种方式

    老人们经常说,播放器对音频和视频的播放没有绝对的静态的同步,只有相对的动态的同步,实际上音视频同步就是一个"你追我赶"的过程. 音视频的同步方式有 3 种,即:音视频分别向系统时钟 ...

  7. 在抖音APP源码中如何实现播放器的音视频同步

    在抖音APP源码中音频和视频的播放是在不同线程中进行的,而且音频和视频都有自己的时间戳,所以需要同步机制保障音画同步. 抖音APP源码有多种机制可以做到音视频同步:a. 音频同步于视频.b. 视频同步 ...

  8. android万能播放器,Android万能视频播放器05-音视频同步

    1.概念 由于视频播放器中音频和视频是分别播放和渲染的,就会出现声音和画面不同步的现象.为了使同一时刻声音和画面的一致性,我们就需要音视频同步来实现,这就是音视频同步. 2.播放时间 2.1.音频播放 ...

  9. FFmpeg基础:音视频同步播放

    文章目录 定义全局数据类 定义数据队列 定义SDL库初始化操作 定义音视频流解析函数 定义解封装线程和视频解码线程 定义音视频的解码函数 主函数事件响应 视频文件解复用之后视频流和音频流是独立的,也是 ...

  10. ffmpeg java 播放视频_Javacv使用ffmpeg实现音视频同步播放

    最近用javaCV的ffmpeg包的FFmpegFrameGrabber帧捕捉器对捕捉到的音频帧和视频帧做了同步的播放.采用的同步方法是视频向音频同步. 具体的思路如下: (1)首先介绍ffmpeg是 ...

最新文章

  1. 做acm 需要学的算法
  2. 神经网络知识专题总结!
  3. 【codeforces 242E】XOR on Segment
  4. 区域填充与击中击不中变换
  5. ubuntu 环境下调试mysql源码_Linux中eclipse调试mysql源代码
  6. 详解.NET中容易混淆的委托与接口
  7. 「技美之路」图形 1.2.1 向量基础
  8. (35)FPGA面试技能提升篇(AD、DA、时钟芯片)
  9. 一些有关系统APK的探索(一)
  10. 程序员面试时自称字节跳动工作两年,被发现学历造假,结果蒙了
  11. 为什么word中插入对象会自动关闭word_你常常忽视的Word文本操作小技巧
  12. Java21天打卡Day5-ifelse
  13. 浅析 Spring 中的事件驱动机制
  14. Spark2.1特征处理:提取/转换/选择
  15. 公司注销又有新变化! 财务人要知道的公司注销新规定
  16. mybatis配置类设置驼峰命名不起作用
  17. 初学者javaweb基本使用方法
  18. 【天梯赛练习题(c语言)】
  19. 跨考计算机复试自我介绍,跨考生复试自我介绍
  20. PCI配置空间(PCI Configuration Space)

热门文章

  1. 香港传媒高层访团莅临深之蓝参观访问
  2. 大数据的七大核心具体价值
  3. 信息系统项目管理师下午论文的一些心得
  4. android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )及屏幕适配注意事项
  5. xposed修改手机屏幕分辨率
  6. 图灵——如迷的解谜者
  7. 【leetcode-652】寻找重复的子树
  8. mysql表空间加密
  9. 观测云产品更新|新增阿里云账户结算方式;新增 DQL 查询查看器;新增基础设施网络模块等
  10. python列表创建操作_python列表操作