• [原]音视频播放笔记


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

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

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

    常见的耗时模块
        解码 -- 解码是视频播放器中cpu时间占用的大户,尤其是在高分辨率、解码算法复杂的情况下。
        绘制 -- 此处所说的绘制包括写显存、缩放、AlphaBlend等与显示相关的操作。写显存的时间远大于写系统内存的时间。缩放、AlphaBlend时尽量避免浮点运算,尽可能使用cpu的多媒体指令集。运算与内存读写的指令尽量融合。
        解码帧拷贝 -- 播放器中,可能会有意或无意的将每一个解码帧在内存中拷贝一次或多次。每个解码帧在内存中的一次拷贝将带来不小的时间开销,如果多拷贝几次。。。总之,要尽量避免每个解码帧的拷贝。
  • 相关阅读:
    为什么你应该(从现在开始就)写博客
    ASP.net 中使用Flexigrid详细教程之二直接使用数据库数据(有图有真相)
    保护眼睛的方法 (眼睛累了吗 来看看吧)
    程序员不如快递员?
    项目管理界面
    地址栏射击游戏!对,你没看错,就是在地址栏上玩的游戏,有图有真相!
    书写是为了更好的思考
    IT人员如何找到自己的时间?
    std::mem_fun_ref,mem_fun1_ref分析
    __declspec(selectany) 的作用是什么
  • 原文地址:https://www.cnblogs.com/techsunny/p/1279620.html
Copyright © 2020-2023  润新知