• 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");

    另外

  • 相关阅读:
    多模态 Image-to-Image Translation 论文
    MySQL不常用查询
    嵌入式学习--1线协议(以ds18b20为例)
    vscode摸鱼插件开发
    InheritableThreadLocal 在线程池中进行父子线程间消息传递出现消息丢失的解析
    Python语言:算术运算符知识点讲解
    Django实现音乐网站 (22)
    内核级流量治理引擎Kmesh八大新特性解读
    金蝶云星空的网络控制设置
    自动化测试 | Selenium自动化测试框架,实战遇到的坑都在这了,玩转自动化测试
  • 原文地址:https://blog.csdn.net/irainsa/article/details/127938439