博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EasyPlayer Android安卓RTSP服务器低延时再优化策略
阅读量:4537 次
发布时间:2019-06-08

本文共 1957 字,大约阅读时间需要 6 分钟。

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时间,这样播放器便可更快地消耗掉缓存帧数,将已经存在的延迟逐步追上.

EasyPlayer

EasyPlayer是由EasyDarwin开源团队开发和维护的一个流媒体播放器项目,目前有RTSP版和Pro版两个版本,RTSP支持Windows(支持多窗口、包含ActiveXnpAPI Web插件)、Android平台,iOS平台,视频支持H.264H.265MPEG4MJPEG,音频支持G711AG711UG726AAC,支持RTSP over TCP/UDP,支持硬解码,是一套极佳的RTSP流播放组件;

EasyPlayer Pro版支持RTSP、RTMP、HTTP、HLS等各种流媒体协议播放,稳定、高效、可靠,支持Windows、Android、iOS!

获取更多信息

邮件:

WEB:

Copyright © EasyDarwin.org 2012-2017

EasyDarwin

转载于:https://www.cnblogs.com/babosa/p/8206974.html

你可能感兴趣的文章
错误:已经有针对IP 192.168.1.107:8000的侦听,原因是因为这个行为配置,去掉后服务Open成功...
查看>>
android的listview中getview()的问题
查看>>
switch语句
查看>>
ie6-ie8中不支持opacity透明度的解决方法
查看>>
视图事件穿透
查看>>
HDU 5428 分解质因数
查看>>
用Jekyll搭建的Github Pages个人博客实践2
查看>>
masonry
查看>>
ContentProvider初步-------------------笔记
查看>>
asp.net网站中退出系统后通过后退键重新进入系统的解决方法
查看>>
Software Configure
查看>>
正则表达式(一)
查看>>
C# DEV 右键出现菜单
查看>>
数据字典到SQL语句的转换(使用word与VBA)
查看>>
属性赋值-@PropertySource加载外部配置文件
查看>>
1万台币等于多少人民币(2014年04月22日)
查看>>
无法安装64位office,因为您的PC上有32位
查看>>
java实现发送邮件功能
查看>>
Ubuntu 18.04 启用 rc.local 设置开机启动
查看>>
Single Number
查看>>