美文网首页ijkplayer
ijkplayer支持rtsp实时性

ijkplayer支持rtsp实时性

作者: 南风无影 | 来源:发表于2017-09-08 11:35 被阅读375次

    ijkplayer对rtsp的支持是很弱的,所以需要修改一些代码;


    1. Config
      首先要开启rtsp的一些config选项,不知道最新的版本是否已经添加,不过我用的是0.7.2还没加上。
    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"
    
    1. Code
      很多人一拿到编好的库,发现播不了,其实是因为下面这句代码
      因为av_read_frame读到了数据,到这里又不处理,导致缓冲区一直不满,
      所以rtsp不要设置缓冲区;
    #if CONFIG_RTSP_DEMUXER || CONFIG_MMSH_PROTOCOL
            if (is->paused &&
                    (!strcmp(ic->iformat->name, "rtsp") ||
                     (ic->pb && !strncmp(ffp->input_filename, "mmsh:", 5)))) {
                /* wait 10 ms to avoid trying to get another packet */
                /* XXX: horrible */
                SDL_Delay(10);
                continue;
            }
    #endif
    

    把这段代码注释了吧!

    另外,不设置缓冲区,在应用层添加(以android为例):

    // 最大缓冲cache是3s, 有时候网络波动,会突然在短时间内收到好几秒的数据
    // 因此需要播放器丢包,才不会累积延时
    // 这个和第三个参数packet-buffering无关。
    ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "max_cached_duration", 3000); 
    
    // 无限制收流
    ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "infbuf", 1); 
    
    // 设置无缓冲,这是播放器的缓冲区,有数据就播放
    ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "packet-buffering", 0); 
    
    // 可选,有时候tcp模式出画面更快,因为rtsp是先udp,不成功再切到tcp的
    ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "rtsp_transport", "tcp");
    
    // 设置在解析的 url 之前 (这里设置超时为5秒)
    // 如果没有设置stimeout,在解析时(也就是avformat_open_input)把网线拔掉,av_read_frame会阻塞(时间单位是微妙)
    ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "stimeout", "5000000");
    

    3.讲的差不多了,代码面前,了无秘密,
    需要rtsp的优化后代码,请私信我QQ:307509256。

    1. 前两天听群里人说,抓包看ijk播放rtsp不会发TEARDOWN,断开时通过tcp read的timeout,大概也就30s左右吧,如果是这样,那确实是ijk对rtsp支持的一个bug,vlc抓包是有发的,我没去查原因,知情者可以讨论下;

    后记:
    如果代码有bug或好的建议,请不吝赐教;
    如果觉得有用,并加颗星;

    Ai时代,写作是一种新竞争力,自勉之~

    相关文章

      网友评论

      • overla5:你好,像网上随便找的直播链接比如熊猫的直播间,ijk支持播放吗?需要做什么操作么
        南风无影:ijk基于ffmpeg,ffmpeg的支持就支持,ffmpeg目前几乎支持所有格式
      • 7c5e367ee034:Hi~@Gongjia
        很喜欢你写的文章。
        请教一下ijkplayer对rtsp的实时性 能做到真正的实时吗?
        我优化了一下代码 但还是有大约700ms左右的延时!
        Jeffrey_238f:@ALLENYAN_6353 我也优化了下,延时1s左右,你是如何优化的,我的qq: 119161229,可以私下请教一下吗,谢谢!
        7c5e367ee034:@Gongjia 嗯,我已经把他优化到了200-300ms的延迟!
        南风无影:@ALLENYAN_6353 700ms已经挺不错了,毕竟在avformat_find_stream_info那里要消耗100-200ms, 其它应该没什么消耗

      本文标题:ijkplayer支持rtsp实时性

      本文链接:https://www.haomeiwen.com/subject/eosgjxtx.html