缓冲区管理
缓冲区管理在视频播放器中有重要作用。实时在线播放中,为了减小网络流量波动性的影响,使播放流畅,需要缓存一定的数据。缓冲区管理bug导致的丢包和重包可能会使播放器产生各种莫名其妙的错误。
缓冲区溢出 -- 视频服务器交错发送音、视频数据,一种缓冲区满(音频或视频)停止接收时会导致另一种数据亦无法接收,因此,如缓冲区大小设置不当,可能会产生一种缓冲区满而另一种缓冲区空的状况。满的缓冲区由于待播放时间未到而得不到播放,而空的缓冲区由于另一类缓冲区满、服务器停止发送数据而一直空。比如,空的缓冲区为音频,满的缓冲区为视频,视频根据音频的播放位置同步,由于音频缓冲区空而无数据可播放,视频同步时取得的音频播放时间较正常时间滞后,从而认为视频播放时间未到而不播放,进一步导致视频缓冲区一直满,而音频缓冲区一直空,陷入恶性循环。。。当然此种情况亦与服务器发送数据不均衡有关。
两类缓冲区 -- 由于音视频解码后数据量巨大,为了缓存更多的数据而尽可能减少内存占用,应减少解码数据的缓存而缓存未解码数据。进一步,可考虑将大量不必立即解码的数据存盘。
同步[此处经验较少,或许还有更好的方式]
一般将音频自由播放,根据音频播放的时间绘制相应的图像。音频帧(一次写入声卡的一个数据块)写入声卡后无法精确地获知播放的位置,只能大概地获知播放到了某一帧或是某一帧刚播放完。因此,同步时获取的音频播放时间有一定误差,误差大约为一个音频帧的时长。同步时,根据系统时间、音频播放时间、视频pts计算视频的播放时间(或当前距播放的时间间隔)。由于获取的音频播放时间有误差,不应在播放每帧视频时都获取音频播放时间并做调整,而是在获取音频播放时间后,在一段时间内都将此音频播放时间作为参考。由于解码、图像绘制等操作对cpu时间的占用,音频实际播放时间与pts时间的偏差,一段时间后视频会与音频产生一定的偏差。因此,应重新获取音频时间,计算音视频失同步的时间,并在以后的图像绘制时间中做出弥补。为了防止音视频失同步过大,检测音频播放时间并同步的时间间隔不应过长。
效率问题
效率在视频播放器的开发中是一个重要问题,因为我们可能希望播放器在资源有限的系统上运行,希望播放分辨率更高、解码算法复杂(同时意味着压缩比更高)视频。
常见的耗时模块
解码 -- 解码是视频播放器中cpu时间占用的大户,尤其是在高分辨率、解码算法复杂的情况下。
绘制 -- 此处所说的绘制包括写显存、缩放、AlphaBlend等与显示相关的操作。写显存的时间远大于写系统内存的时间。缩放、AlphaBlend时尽量避免浮点运算,尽可能使用cpu的多媒体指令集。运算与内存读写的指令尽量融合。
解码帧拷贝 -- 播放器中,可能会有意或无意的将每一个解码帧在内存中拷贝一次或多次。每个解码帧在内存中的一次拷贝将带来不小的时间开销,如果多拷贝几次。。。总之,要尽量避免每个解码帧的拷贝。
android mediaplayer 缓冲时间 播放器缓冲区
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
RTMP播放器的几种选择
如何选择RTMP播放器?在选择RTMP播放器时,需要综合考虑多个因素,以确保选择的播放器能够满足实际需求并提供良好的用户体验。以下是一些选择RTMP播放器的建议:1. 功能需求低延迟:对于直播场景,低延迟是非常重要的。选择支持低延迟播放的RTMP播放器,以确保观众能够实时看到主播推送端的内容。多平台支持:考虑播放器是否支持跨平台播放,包括PC、移动设备等。这有助于扩大观众范围并提高播放的灵活性。音
RTMP播放器 RTMP player windows rtmp播放器 linux rtmp播放器 大牛直播SDK -
Android平台RTMP|RTSP播放器如何回调YUV或RGB数据?
技术选型我们知道,Android平台一般RTMP|RTSP播放器通常不直接提供回调YUV或RGB数据的功能。如果播放端有视觉分析或类似的需求,需要播放端,能支持YUV或ARG的数据回调,一般来说,可参考的方法如下:1. 使用FFmpeg和JNIFFmpeg是一个强大的多媒体处理库,它支持解码视频并提取帧数据。你可以通过JNI在Android的Java层调用C/C++层的FFmpeg库来解码RTSP
Android rtsp播放器回调yuv rtsp播放器回调rgb rtmp播放器回调yuv rtmp播放器回调rgb -
播放器技术分享(2):缓冲区管理
本文是《播放器技术分享》系列文章的第二篇,主要阐述了播放器缓冲区的管理策略。
播放器 ffmpeg nmplayer 缓冲区 -
【Netty】NIO 缓冲区 ( Buffer ) ( 缓冲区读写类型 | 只读缓冲区 | 映射字节缓冲区 )
I . 缓冲区 ( Buffer ) 存取类型II . 只读缓冲区 ( ReadOnlyBuffer )III . 映射字节缓冲区 ( MappedByteBuffer )
NIO Buffer ReadOnlyBuffer 映射字节缓冲区 只读缓冲区