iOS端IJKPlayer支持RTSP

277 阅读2分钟

前言

之前在修改IJKPlayer编译支持RTSP图传的时候遇到一个双图传卡顿的问题,在github的ijk项目下留言,后续还跟一些小伙伴探讨了下。最近又发现陆陆续续有些小伙伴还有这方面的需求。刚好前几天我重新处理并编译了FFmpeg4.0在最新的系统OS15.3系统中编译不通过的问题,并且也更新了自己的库,借此机会在这里跟大家分享一下IJKPlayer支持RTSP的问题。

首先,我直接把我现在在用的支持RTSP并且优化了图传延迟的编译好的库分享给大家:

1. 配置设置:

        let options = IJKFFOptions()
        options.setFormatOptionValue("tcp", forKey: "rtsp_transport")
        // 视频帧率
        options.setPlayerOptionIntValue(30, forKey: "fps")
        // 最大帧率
        options.setPlayerOptionIntValue(30, forKey: "max-fps")=
        // 播放前的探测时间
        options.setFormatOptionIntValue(5000000, forKey: "analyzeduration")
        // 以音频帧为时间基准,当视频帧和音频帧不同步时,允许丢弃的视频帧数[-1,120] 默认0
        options.setPlayerOptionIntValue(30, forKey: "framedrop")
        // 跳过循环滤波; 0 画面质量高,解码开销大; 48 画面质量差,解码开销小
        options.setCodecOptionIntValue(48, forKey: "skip_loop_filter")
        // 跳帧 CPU处理不过来跳帧
        options.setCodecOptionIntValue(0, forKey: "skip_frame")
        // 设置无packet缓存
        options.setPlayerOptionIntValue(0, forKey: "packet-buffering")
        options.setFormatOptionValue("nobuffer", forKey: "fflags")
        // 不限制拉流缓存大小
        options.setPlayerOptionIntValue(1, forKey: "infbuf")
        // 预读数据的缓冲区大小 整数–[0,15 * 1024 * 1024] 默认15 * 1024 * 1024
        options.setFormatOptionIntValue(1024*1024*10, forKey: "max-buffer-size")
        // 停止预读的最小帧数。即预读帧数大于等于该值时,将停止预读。2-50000 默认50000
        options.setPlayerOptionIntValue(3, forKey: "min-frames")
        // 启动预加载
        options.setPlayerOptionIntValue(1, forKey: "start-on-prepared")
        // 设置探测包数量
        options.setFormatOptionIntValue(4096, forKey: "probesize")
        // 通过立即清理数据包来减少等待时长
        options.setFormatOptionIntValue(1, forKey: "flush_packets")
        // 开启硬解码
        options.setPlayerOptionIntValue(1, forKey: "videotoolbox")
        // 最大缓存  毫秒
        options.setPlayerOptionIntValue(1000, forKey: "max_cached_duration")
        // 清理DNS
        options.setFormatOptionIntValue(1, forKey: "dns_cache_clear")
        options.setFormatOptionIntValue(-1, forKey: "dns_cache_timeout")
        // 设置自动重连
        options.setFormatOptionIntValue(1, forKey: "reconnect")
        // 设置连接超时时间
        options.setFormatOptionIntValue(15 * 1000 * 1000, forKey: "timeout")

2.我编译好的库下载地址:

IJKMediaFramework.framework.zip 链接: pan.baidu.com/s/15slcwBmL… 

其次:这个版本的库编译修改的部分,都是在网上找了一些大神的贴子,综合处理下来完成的

1. FFmpeg的修改

  • 基于FFmpeg4.0做修改,避免双图传卡顿问题
  • 适配RTSP的支持
  • 处理延迟问题

2. IJKPlayer的修改

  • 处理编译报错问题
  • 处理H265支持
  • 追帧问题
  • 修改主线程警告问题