[原]音视频播放笔记

缓冲区管理
    缓冲区管理在视频播放器中有重要作用。实时在线播放中,为了减小网络流量波动性的影响,使播放流畅,需要缓存一定的数据。缓冲区管理bug导致的丢包和重包可能会使播放器产生各种莫名其妙的错误。
    缓冲区溢出 -- 视频服务器交错发送音、视频数据,一种缓冲区满(音频或视频)停止接收时会导致另一种数据亦无法接收,因此,如缓冲区大小设置不当,可能会产生一种缓冲区满而另一种缓冲区空的状况。满的缓冲区由于待播放时间未到而得不到播放,而空的缓冲区由于另一类缓冲区满、服务器停止发送数据而一直空。比如,空的缓冲区为音频,满的缓冲区为视频,视频根据音频的播放位置同步,由于音频缓冲区空而无数据可播放,视频同步时取得的音频播放时间较正常时间滞后,从而认为视频播放时间未到而不播放,进一步导致视频缓冲区一直满,而音频缓冲区一直空,陷入恶性循环。。。当然此种情况亦与服务器发送数据不均衡有关。
    两类缓冲区 -- 由于音视频解码后数据量巨大,为了缓存更多的数据而尽可能减少内存占用,应减少解码数据的缓存而缓存未解码数据。进一步,可考虑将大量不必立即解码的数据存盘。

同步[此处经验较少,或许还有更好的方式]
    一般将音频自由播放,根据音频播放的时间绘制相应的图像。音频帧(一次写入声卡的一个数据块)写入声卡后无法精确地获知播放的位置,只能大概地获知播放到了某一帧或是某一帧刚播放完。因此,同步时获取的音频播放时间有一定误差,误差大约为一个音频帧的时长。同步时,根据系统时间、音频播放时间、视频pts计算视频的播放时间(或当前距播放的时间间隔)。由于获取的音频播放时间有误差,不应在播放每帧视频时都获取音频播放时间并做调整,而是在获取音频播放时间后,在一段时间内都将此音频播放时间作为参考。由于解码、图像绘制等操作对cpu时间的占用,音频实际播放时间与pts时间的偏差,一段时间后视频会与音频产生一定的偏差。因此,应重新获取音频时间,计算音视频失同步的时间,并在以后的图像绘制时间中做出弥补。为了防止音视频失同步过大,检测音频播放时间并同步的时间间隔不应过长。

效率问题
    效率在视频播放器的开发中是一个重要问题,因为我们可能希望播放器在资源有限的系统上运行,希望播放分辨率更高、解码算法复杂(同时意味着压缩比更高)视频。

常见的耗时模块
    解码 -- 解码是视频播放器中cpu时间占用的大户,尤其是在高分辨率、解码算法复杂的情况下。
    绘制 -- 此处所说的绘制包括写显存、缩放、AlphaBlend等与显示相关的操作。写显存的时间远大于写系统内存的时间。缩放、AlphaBlend时尽量避免浮点运算,尽可能使用cpu的多媒体指令集。运算与内存读写的指令尽量融合。
    解码帧拷贝 -- 播放器中,可能会有意或无意的将每一个解码帧在内存中拷贝一次或多次。每个解码帧在内存中的一次拷贝将带来不小的时间开销,如果多拷贝几次。。。总之,要尽量避免每个解码帧的拷贝。

posted on 2008-08-29 17:12  techsunny  阅读(387)  评论(0编辑  收藏  举报

导航