RelinRan / IJKPlayer

Android IJK集成播放器
15 stars 2 forks source link

无法播放RTSP #2

Open JcTom opened 5 months ago

JcTom commented 5 months ago

播放rtsp Error (-10000,0)

RelinRan commented 5 months ago

播放rtsp Error (-10000,0)

IJK源码问题导致,在不更新版本情况下,可以在setDataSource之后配置protocol_whitelist ijk.getMediaPlayer().setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "protocol_whitelist", "async,cache,crypto,file,http,https,ijkhttphook,ijkinject,ijklivehook,ijklongurl,ijksegment,ijktcphook,pipe,rtp,tcp,tls,udp,ijkurlhook,data,rtmp,rtsp");

JcTom commented 5 months ago

1、我在此处添加 binding.videoView.setDataSource(App.RTSP); binding.videoView.getMediaPlayer().setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "protocol_whitelist", "async,cache,crypto,file,http,https,ijkhttphook,ijkinject,ijklivehook,ijklongurl,ijksegment,ijktcphook,pipe,rtp,tcp,tls,udp,ijkurlhook,data,rtmp,rtsp"); 2、IjkVideoView--createPlayer方法里面加入 以上两个加入之后都无法播放rtsp

RelinRan commented 5 months ago

1、我在此处添加 binding.videoView.setDataSource(App.RTSP); binding.videoView.getMediaPlayer().setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "protocol_whitelist", "async,cache,crypto,file,http,https,ijkhttphook,ijkinject,ijklivehook,ijklongurl,ijksegment,ijktcphook,pipe,rtp,tcp,tls,udp,ijkurlhook,data,rtmp,rtsp"); 2、IjkVideoView--createPlayer方法里面加入 以上两个加入之后都无法播放rtsp

v2004.3.12.1版本已重新编译so,同时修改ijk部分源码

JcTom commented 5 months ago

1、我在此处添加 binding.videoView.setDataSource(App.RTSP); binding.videoView.getMediaPlayer().setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "protocol_whitelist", "async,cache,crypto,file,http,https,ijkhttphook,ijkinject,ijklivehook,ijklongurl,ijksegment,ijktcphook,pipe,rtp,tcp,tls,udp,ijkurlhook,data,rtmp,rtsp"); 2、IjkVideoView--createPlayer方法里面加入 以上两个加入之后都无法播放rtsp

v2004.3.12.1版本已重新编译so,同时修改ijk部分源码

可以播放了。修改了一下配置 private void initIJKpPlayerConfig() {

    //初始化建议配置在Application
    IJK ijk = IJK.config();
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 0);
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-auto-rotate", 0);
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-handle-resolution-change", 0);
    // 若是是rtsp协议,能够优先用tcp(默认是用udp)
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "rtsp_transport", "tcp");
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "rtsp_flags", "prefer_tcp");
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "http-detect-range-support", 0);
    //设置探测缓冲区大小
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "probesize", 1024 * 10);
    //设置最小缓冲帧数
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "min-frames", 100);
    //设置最大缓冲区大小(默认是0,表示无限制)
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "max-buffer-size", 1024);
    //设置最小缓冲帧数
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "min-frames", 3);
    //设置超时时间
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "timeout", 10000);
    //设置启动时的探测时间
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "analyzeduration", 2000000L);
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "analyzemaxduration", 100L);
    //立刻写出处理完的Packet
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "flush_packets", 1L);
    //调用prepareAsync()方法后是否自动开始播放
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", 1L);
    //优化进度跳转
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "enable-accurate-seek", 1);
    //丢帧阈值
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 30);
    //视频帧率
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "fps", 30);
    //环路滤波
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_CODEC, "skip_loop_filter", 48);
    //设置无packet缓存
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "packet-buffering", 0);
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "fflags", "nobuffer");
    //不限制拉流缓存大小
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "infbuf", 1);
    //设置探测包数量
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "probsize", "4096");
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER,"reconnect",5);
}这样会比默认配置延迟要低一些,但是还是比较高的,大佬知道如何优化吗。还有就是方便告知如何编译的吗
RelinRan commented 5 months ago

1、我在此处添加 binding.videoView.setDataSource(App.RTSP); binding.videoView.getMediaPlayer().setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "protocol_whitelist", "async,cache,crypto,file,http,https,ijkhttphook,ijkinject,ijklivehook,ijklongurl,ijksegment,ijktcphook,pipe,rtp,tcp,tls,udp,ijkurlhook,data,rtmp,rtsp"); 2、IjkVideoView--createPlayer方法里面加入 以上两个加入之后都无法播放rtsp

v2004.3.12.1版本已重新编译so,同时修改ijk部分源码

可以播放了。修改了一下配置 private void initIJKpPlayerConfig() {

    //初始化建议配置在Application
    IJK ijk = IJK.config();
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 0);
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-auto-rotate", 0);
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-handle-resolution-change", 0);
    // 若是是rtsp协议,能够优先用tcp(默认是用udp)
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "rtsp_transport", "tcp");
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "rtsp_flags", "prefer_tcp");
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "http-detect-range-support", 0);
    //设置探测缓冲区大小
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "probesize", 1024 * 10);
    //设置最小缓冲帧数
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "min-frames", 100);
    //设置最大缓冲区大小(默认是0,表示无限制)
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "max-buffer-size", 1024);
    //设置最小缓冲帧数
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "min-frames", 3);
    //设置超时时间
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "timeout", 10000);
    //设置启动时的探测时间
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "analyzeduration", 2000000L);
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "analyzemaxduration", 100L);
    //立刻写出处理完的Packet
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "flush_packets", 1L);
    //调用prepareAsync()方法后是否自动开始播放
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", 1L);
    //优化进度跳转
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "enable-accurate-seek", 1);
    //丢帧阈值
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 30);
    //视频帧率
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "fps", 30);
    //环路滤波
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_CODEC, "skip_loop_filter", 48);
    //设置无packet缓存
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "packet-buffering", 0);
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "fflags", "nobuffer");
    //不限制拉流缓存大小
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "infbuf", 1);
    //设置探测包数量
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "probsize", "4096");
    ijk.option(IjkMediaPlayer.OPT_CATEGORY_PLAYER,"reconnect",5);
}这样会比默认配置延迟要低一些,但是还是比较高的,大佬知道如何优化吗。还有就是方便告知如何编译的吗

IjkMediaPlayer.OPT_CATEGORY_PLAYER 中包含了一些可以调整延迟和卡顿的参数 ` // 设置最大缓冲大小为1MB

mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "max-buffer-size", 1024 * 1024); // 设置最小帧数为30 mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "min-frames", 30); // 设置最大缓存时长为5000毫秒 mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "max_cached_duration", 5000); // 设置分析最大时长为1000000毫秒 mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "analyzemaxduration", 1000000); // 启用无限缓冲模式 mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "infbuf", 1); // 启用数据包缓冲 mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "packet-buffering", 1); // 设置帧率为30 mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "fps", 30);`

自己编译so的话,可以看我博客文章:https://blog.csdn.net/u012127961/article/details/136026559?spm=1001.2014.3001.5501