H5流媒体播放器,作为基于HTML5技术的创新产品,近年来在音频和视频播放领域取得了显著的发展。它不仅为用户提供了流畅、稳定的播放体验,还通过丰富的交互功能增强了用户的参与感。
在实际应用时,用户向我们提出了很多需求。其对延迟要求非常苛刻,在此基础上我们对性能进行了一次优化,再一次降低了延迟,以下是采取的方式:
1、提高解码线程的优先级
一个不容忽视且容易被人忽略的事实,就是安卓层在一些低优先级的线程上面,线程休眠时间要比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 :102
可见优先级对线程的睡眠时间影响很大,我们这里需要严格控制休眠时间,所以我们需要将线程优先级设置高一些,可以设置成Audio级别:
Process.setThreadPriority(Process.THREAD_PRIORITY_AUDIO)
2、对于音频播放使用AudioTrack的非阻塞模式写入
EasyPlayer播放器在渲染视频轨和音频轨的时候,是分别在不同的线程进行的,但是由于有音视频同步策略,如果某一个线程速度慢了,那另外一个线程就也会放慢下来等待它,而音频渲染就是这样一个容易"慢下来"的线程。
3、优化追帧策略
视频是有一个个视频帧组成的帧序列。每个视频帧代表了一个时间点的采样,我们收到视频帧同时会得到其所在的时间信息,即视频时间戳。通过时间戳可计算出视频帧之间的时间间隔。播放时,我们需要根据这个时间间隔T来Sleep,这样播放时才能保证流畅性。
// 睡眠时间=当前时间戳-上一帧的时间戳-解码时间
long sleepTime = frameInfo.stamp - previousStampUs - decodeSpend * 1000;
if (sleepTime > 100000) { // 睡眠时间超过100毫秒了,可能时间戳异常。设置为100毫秒。
Log.w(TAG, "sleep time.too long:" + sleepTime);
sleepTime = 100000;
}
当前流媒体发展如此迅速,我们也应对它有更深入的了解。EasyPlayer.js是一个基于JavaScript的轻量级音视频播放器,旨在简化音视频播放的功能和集成。它通常提供基本的播放、暂停、音量控制、全屏、进度条等功能,并且支持多种格式。
- 支持点播多清晰度播放;
- 支持全屏或比例显示;
- 支持电子放大;
- 支持水印(动态水印、幽灵水印);
- 支持显示上一个视频最后一帧;
- 支持播放器快照截图。
随着流媒体的发展愈发迅速,H5流媒体播放器可以拥有更多样化的播放器选择、更广泛的协议支持、更高的视频质量、更低的延迟、以及更广泛的应用场景。H5流媒体播放器的灵活性和兼容性使其成为现代网络环境中不可或缺的工具,它正在不断改变我们消费媒体内容的方式,为用户和企业提供了更加丰富和便捷的体验。
标签:视频,H.265,媒体播放器,时间,RTSP,线程,sleep,播放 From: https://www.cnblogs.com/easyplayer/p/18612564