• ijkplayer基于rtsp直播延时的深度优化


    现在ijkPlayer是许多播放器、直播平台的首选,相信很多开发者都接触过ijkPlayer,无论是Android工程师还是iOS工程师。本文主要是总结,也是与大家探讨RTSP直播的延时优化。

    目录

    一、修改编译脚本支持RTSP

    二、修改播放器的option参数

    三、网络抖动的丢包

    四、解码器设为零延时

    五、减少FFmpeg拆帧等待延时

    1、找到当前帧结束符

    2、去掉parse_packet的while循环

    3、 修改av_parser_parse2的帧偏移量

    4、去掉parser_parse的寻找帧起始码

    5、修改parser.c的组帧方法

    一、修改编译脚本支持RTSP

    ijkPlayer默认是没有把RTSP协议编译进去,所以我们得修改编译脚本,原来的disable改为enable:

    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=tcp"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=rtsp"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=sdp"
    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=rtp"

    二、修改播放器的option参数

    //丢帧阈值
    mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 30);
    //视频帧率
    mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "fps", 30);
    //环路滤波
    mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC, "skip_loop_filter", 48);
    //设置无packet缓存
    mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "packet-buffering", 0);
    mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "fflags", "nobuffer");
    //不限制拉流缓存大小
    mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "infbuf", 1);
    //设置最大缓存数量
    mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "max-buffer-size", 1024);
    //设置最小解码帧数
    mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "min-frames", 3);
    //启动预加载
    mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", 1);
    //设置探测包数量
    mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "probsize", "4096");
    //设置分析流时长
    mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "analyzeduration", "2000000");

    值得注意的是,ijkPlayer默认使用udp拉流,因为速度比较快。如果需要可靠且减少丢包,可以改为tcp协议:

    mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "rtsp_transport", "tcp");

    另外

  • 相关阅读:
    常见的云测试策略及重要性
    NC17383 A Simple Problem with Integers
    简易实现通讯录(1.0)
    熟悉Redis6
    项目之旅(第三周)
    GFS分布式文件系统(GlusterFS)
    使用WebView控件进行网络开发
    Web应用安全测试-权限篡改
    一文讲清楚webpack和vite原理
    Java序列化流的奇妙之旅
  • 原文地址:https://blog.csdn.net/irainsa/article/details/127938439