EasyPlayer延迟再优化策略

EasyPlayer是一款专门针对RTSP协议进行过优化的播放器.其中两个我们引以为傲的的优点就是起播快和低延迟.最近我们遇到一些需求,其对延迟要求非常苛刻,于是我们再把代码捡起来,针对之前的播放策略进行再优化,果然又发现一些可以更改的地方,于是又对性能进行了一次压榨,再一次降低了延迟.

主要优化内容如下:

  • 提高解码线程的优先级.

    一个不容忽视且容易被人忽略的事实,就是安卓层在一些低优先级的线程上面,线程休眠时间要比sleep时间要长.比如下面一段代码,在一个线程优先级为BACKGROUND的线程里,我们sleep 100毫秒,然后打印实际上线程暂停的时间.

    new Thread(new Runnable() {
    @Override
    public void run() {
    Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
    long millis = System.currentTimeMillis();
    try {
    Thread.sleep(100);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    Log.d(TAG,"thread sleep :" + (System.currentTimeMillis() - millis));
    }
    }).start();

    然后打印输出如下内容:

    thread sleep :148

    我们发现线程居然sleep了148毫秒.

    如果把线程优先级设置高一些,如果使用默认的优先级,那打印结果如下:

    thread sleep :102

    可见优先级对线程的睡眠时间影响很大.我们这里需要严格控制休眠时间,所以我们需要将线程优先级设置高一些,设置成Audio级别.

    Process.setThreadPriority(Process.THREAD_PRIORITY_AUDIO);
  • 对于音频播放,使用AudioTrack的非阻塞模式写入.

    EasyPlayer在渲染视频轨和音频轨的时候,是分别在不同的线程进行的.但是由于有音视频同步策略,如果某一个线程速度慢了,那另外一个线程就也会放慢下来等待它.而音频渲染就是这样一个容易”慢下来”的线程.

    音频数据是由AudioTrack来进行渲染的,我们将PCM数据由AudioTrack的write接口写入,就可以播放出声音.但是这个write函数是阻塞的,假设某段时间由于网络抖动,没有音频数据过来,过会又突然来了一大块数据,把这些数据都write到AudioTrack,会阻塞一段时间.这样就会导致不可避免的延迟.

    在Android 6.0,AudioTrack提供了一个非阻塞的写入方式,我们在6.0以上的安卓系统,使用非阻塞方式写入,这样大块数据也能很快写入音频设备,就不会因此而导致延迟了.

  • 优化追帧策略.

    上面说了,由于网络抖动,可能一段时间内都没有收到媒体数据,过一会又突然来了一大块数据.这时候已经有延迟产生了.那怎么办呢?我们可以让播放器稍微快速点播放.通过控制视频线程的sleep时间便可实现.当缓冲区内缓存帧数比较大时,可以以一定比例降低sleep时间,这样播放器便可更快地消耗掉缓存帧数,将已经存在的延迟逐步追上.

获取更多信息

邮件:support@easydarwin.org

WEB:www.EasyDarwin.org

Copyright © EasyDarwin.org 2012-2017

EasyPlayer Android RTSP播放器延迟再优化策略的更多相关文章

  1. EasyPlayer Android安卓RTSP服务器低延时再优化策略

    EasyPlayer低延迟再优化策略 EasyPlayer是一款专门针对RTSP协议进行过优化的播放器.其中两个我们引以为傲的的优点就是起播快和低延迟.最近我们遇到一些需求,其对延迟要求非常苛刻,于是 ...

  2. EasyPlayer windows RTSP播放器OCX插件使用说明

    鉴于大家对于EasyPlayer插件的使用还不太熟悉,特此写一篇插件的使用文档,供大家参考:EasyPlayer插件有两种,一种是基于IE的ActiveX控件,一种是基于FireFox(也支持多浏览器 ...

  3. EasyPlayer RTSP播放器运行出现: Unable to load DLL 找不到指定的模块。exception from HRESULT 0x8007007E 解决方案

    最近有EasyPlayer RTSP播放器的开发者反馈,在一台新装的Windows Server 2008的操作系统上运行EasyPlayer RTSP播放器出现"Unable to loa ...

  4. Android流媒体开发之路三:基于NDK开发Android平台RTSP播放器

    基于NDK开发Android平台RTSP播放器 最近做了不少android端的开发,有推流.播放.直播.对讲等各种应用,做了RTMP.RTSP.HTTP-FLV.自定义等各种协议,还是有不少收获和心得 ...

  5. Android平台RTMP/RTSP播放器开发系列--解码和绘制

    本文主要抛砖引玉,粗略介绍下Android平台RTMP/RTSP播放器中解码和绘制相关的部分(Github). 解码 提到解码,大家都知道软硬解,甚至一些公司觉得硬解码已经足够通用,慢慢抛弃软解了,如 ...

  6. EasyPlayer RTSP播放器:一个适用于安防行业的工具利器(EasyPlayer Windows v2.0.17.0709)

    本文转自EasyDarwin开源团队成员Sword的博客:http://blog.csdn.net/swordtwelve EasyPlayer(Windows) v2.0.17.0709版本又更新发 ...

  7. Android、iOS平台RTMP/RTSP播放器实时音量调节

    介绍移动端RTMP.RTSP播放器实时音量调节之前,我们之前也写过,为什么windows播放端加这样的接口,windows端播放器在多窗口大屏显示的场景下尤其需要,尽管我们老早就有了实时静音接口,相对 ...

  8. 基于Live555,ffmpeg的RTSP播放器直播与点播

    基于Live555,ffmpeg的RTSP播放器直播与点播 多路RTSP高清视频播放器下载地址:http://download.csdn.net/detail/u011352914/6604437多路 ...

  9. 使用Vitamio打造自己的Android万能播放器(1)——准备

    前言 虽然Android已经内置了VideoView组件和MediaPlayer类来支持开发视频播放器,但支持格式.性能等各方面都十分有限,这里与大家一起利用免费的Vitamio来打造属于自己的And ...

随机推荐

  1. springmvc4.2.X fastjson 替换引用配置

    <mvc:annotation-driven> <mvc:message-converters register-defaults="true"> < ...

  2. Cryptography I 学习笔记 --- 数论简介

    0. Zn代表{0,1....n-1}的集合 1. 模运算符合交换律结合律 2. gcd(greatest common divisor),可以由扩展欧几里得算法快速得到. 3. 模逆(modular ...

  3. Android开发 大坑Fragment

    是不是弄了半天你的Fragment老是Replace不了,我的原因是:弄成静 态的,然后要动态Replace,竟然不行,后来框个FragmentLayout,改成全动态添加和Replace,OK了.

  4. 洛谷——P2383 狗哥玩木棒

    P2383 狗哥玩木棒 题目背景 狗哥又趁着语文课干些无聊的事了... 题目描述 现给出一些木棒长度,那么狗哥能否用给出的木棒(木棒全用完)组成一个正方形呢? 输入输出格式 输入格式: 输入文件中的第 ...

  5. Xamarin XAML语言教程Visual Studio中实现XAML预览

    Xamarin XAML语言教程Visual Studio中实现XAML预览 每次通过编译运行的方式查看XAML文件效果,需要花费大量的时间.如果开发者使用XAML对UI进行布局和设计,可以通过预览的 ...

  6. Longest Valid Parentheses - LeetCode

    Given a string containing just the characters '(' and ')', find the length of the longest valid (wel ...

  7. 在Bonobo服务器里创建Repository(库)

    新建Repository步骤如下: 点击“库”链接,进入“库管理”页面,如下图所示: 在“库管理”页面点击“创建新库”按钮,进入“创建新库”页面,如下图所示: 点击“建立”按钮,会进入“库管理”页面, ...

  8. Working With Push Buttons In Oracle Forms

    Managing push buttons at run time in Oracle Forms is very simple and in this tutorial you will learn ...

  9. MFC中 编辑框输入换行功能

    首先修改编辑框的属性: Multiline 设为true , Auto HScroll 设为true , Auto VScroll 设为 true . 然后响应PreTranslateMessage( ...

  10. WEB API 返回类型设置为JSON 【转】

    http://blog.sina.com.cn/s/blog_60ba16ed0102uzc7.html web api写api接口时默认返回的是把你的对象序列化后以XML形式返回,那么怎样才能让其返 ...