美文网首页iOSandroidiOS 移动端开发
IJKPlayer问题集锦之不定时更新

IJKPlayer问题集锦之不定时更新

作者: 恋猫月亮 | 来源:发表于2016-12-07 08:29 被阅读15616次
    大家吼,不知名程序猿小郭同学又冒泡啦,今天是主角是:业界知名,天朝最大异(tong)性交友平台,BILIBILI开源的视频播放器项目,基于FFMPEG的IJKPlayer<( ̄ˇ ̄)/···的问题集锦!好吧,相信刚刚脱离周末,工作两天进入状态的大家,没有什么心情扯蛋,因为···扯多了真的好痛Σ( ° °|||)︴,我们还是开始吧。

    1、IJKPlayer 不像系统播放器会给你旋转视频角度,所以你需要通过onInfowhat == IMediaPlayer.MEDIA_INFO_VIDEO_ROTATION_CHANGED去获取角度,自己旋转画面;或者开启硬解硬解码,不过硬解码容易造成黑屏无声,诸位慎重啊O__O "…。

    mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 1);
    mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-auto-rotate", 1);
    mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-handle-resolution-change", 1);
    

    **2、 *IJKPlayer 出现黑色有声音没图像,看看你的视频编码是不是H264,pixel format是否存在,音频编码是不是AAC?默认IJKPlayer是不支持3pg(支持它干啥(・-・)?),不支持mepg(比如这个库RecordVideoDemo ),不支持AMR。所以如果你真的想要支持,那么参考这个#1961,打开mpeg支持,重新编ffmpeg,然后通过硬解码播放mpeg;或者通过系统的录制VideoRecord;或者选另外的JAVACV录制封装FFmpegRecorder

    ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 1);
    ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec_mpeg4", 1);
    

    **3、 **快进和慢放接口,已经支持全版本,如果遇到声调问题,可以设置:

    ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "soundtouch", 1);
    

    4、暂停的时候,退到后台再回到前台,画面黑了?

    1、
    这时候个人处理方式是,可以在暂停的时候,通过TextureView.getBitmap(point.x, point.y);获取到暂停的画面,用ImageView显示它,在onSurfaceTextureUpdated的时候隐藏ImageView,来实现画面的衔接。

    2、暂停时绘制静态画面多TextureView的Surface上,详细参考GSYVideoPlayer。

    5、一些视频返回码

    int MEDIA_INFO_VIDEO_RENDERING_START = 3;//视频准备渲染
    int MEDIA_INFO_BUFFERING_START = 701;//开始缓冲
    int MEDIA_INFO_BUFFERING_END = 702;//缓冲结束
    int MEDIA_INFO_VIDEO_ROTATION_CHANGED = 10001;//视频选择信息
    int MEDIA_ERROR_SERVER_DIED = 100;//视频中断,一般是视频源异常或者不支持的视频类型。
    int MEDIA_ERROR_IJK_PLAYER = -10000,//一般是视频源有问题或者数据格式不支持,比如音频不是AAC之类的
    int MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK = 200;//数据错误没有有效的回收
    
    

    6、某些视频在SeekTo的时候,会跳回到拖动前的位置,这是因为视频的关键帧的问题,通俗一点就是FFMPEG不兼容,视频压缩过于厉害,seek只支持关键帧,出现这个情况就是原始的视频文件中i 帧比较少,可开启以下来解决:

    setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "enable-accurate-seek", 1);
    

    7、下载速度可以通过IjkMediaPlayer的getTcpSpeed获取。

    8、高分辨率开启硬解码,不支持的话会自动切换到软解,就算开启mediacodec,如果设备不支持,显示的解码器也是avcodec软解。

    9、ijkMediaPlayer.setOption可配置的对应头文件参考:ff_ffplay_options

    10、缓冲进度条不到100,官方表示我就不保证都100,所以一般我都是:

    //95这个数值可能不准确,有些时候可能还需要低一些
    if (secProgress > 95) secProgress = 100;
    

    11、上面1、2、6的问题,在IJK封装的EXOPlayer和MediaPlayer都不会有问题,兼容上确实强过IJKPlayer,但是它们在细节上,却没有IJK处理的好,如EXOPlayer:退到后再回到前台、切换渲染控件的黑屏一段时间问题,除了用seekto之外目前没发现其他办法,这样的体验让我最后还是选择IJKPlayer。

    12、设置cookie 可以通过ijkPlayer的public void setDataSource(String path, Map<String, String> headers) 的header实现设置,参考ijkPlayer的issues-1150,headers也是在内部被转化为何issuses一样的setOption方法

    ** 13、**多个分片播放的功能,请查阅:
    issue64
    issue490
    分片播放资料

    14、硬解码黑屏相关issuse以及建议

    bilibili-issuse-1324

    15、出现声音画面不同步

    1、关了硬解码。

    2、参考如下:

    http://www.jianshu.com/p/a5cf04181f3d
    设置视频的倍速:
    [options setPlayerOptionIntValue:10 forKey:@"framedrop"];
    mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 60);

    16、rtsp播放失败问题

    https://github.com/CarGuo/GSYVideoPlayer/issues/232

    https://github.com/CarGuo/GSYVideoPlayer/issues/207

    17、m3u8拖动seek之后,加载很长时间

    https://github.com/Bilibili/ijkplayer/issues/2874

    https://github.com/CarGuo/GSYVideoPlayer/issues/252

    18、m3u8本地播放问题

    ijkplayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "protocol_whitelist", "crypto,file,http,https,tcp,tls,udp"); 
    

    19、断网自动重新连接
    url前接上ijkhttphook:,如

    String url = "ijkhttphook:http://baobab.wdjcdn.com/14564977406580.mp4";
    

    然后设置

    ((IjkMediaPlayer)mediaPlayer).setOnNativeInvokeListener(new IjkMediaPlayer.OnNativeInvokeListener() {
                @Override
                public boolean onNativeInvoke(int i, Bundle bundle) {
                    return true;
                }
            })
    

    20、url切换400(http与https域名共用)

    ijkplayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "dns_cache_clear", 1);
    

    21、Rtsp优化

    //硬解码:1、打开,0、关闭
    //mMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 1);
    //软解码:1、打开,0、关闭
    //mMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "videotoolbox", 0);
    
    //rtsp设置 https://ffmpeg.org/ffmpeg-protocols.html#rtsp
    mMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "rtsp_transport", "tcp");
    mMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "rtsp_flags", "prefer_tcp");
    
    mMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "allowed_media_types", "video"); //根据媒体类型来配置
    mMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "timeout", 20000);
    mMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "buffer_size", 1316);
    mMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "infbuf", 1);  // 无限读
    mMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "analyzemaxduration", 100L);
    mMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "probesize", 10240L);
    mMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "flush_packets", 1L);
    //  关闭播放器缓冲,这个必须关闭,否则会出现播放一段时间后,一直卡主,控制台打印 FFP_MSG_BUFFERING_START 
    mMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "packet-buffering", 0L);
    mMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 1L);
    

    总的来说,兼容上还是谷歌的强,但是细节上还是IJKPlayer处理的好,一个是播放器兼容视频,一个是视频兼容播放器,看个人喜好吧︿( ̄︶ ̄)︿!

    相关文章

      网友评论

      • Rumbles:老哥,这个SeekTo方法。我怎么 找不到 - -
      • ed72d1277766:断网自动重新连接的问题,楼主提供的方法对mp4可以,如果是hls的,好像不行,有解决办法么?
      • b0c97464d094:楼主我想问一下您说的画面黑的时候用TextureView来暂时显示,能再详细的说一下么?
      • 建斌_b6c3:多谢楼主,参考楼主的RTSP设定,我的UDP播放出画面速度问题得以解决,特注册账号,回复楼主以表感谢,thanks
      • 王_胖胖:怎么设置header,后台能获取 防盗链
        王_胖胖:@恋猫月亮 我的意思是ijk怎么设置header,-(void)setFormatOptionValue: (NSString *)value forKey:(NSString *)key;
        这个方法只传字符串,如果设置@{@“Referer”:@“www.xxxx.com”},我该怎么转化
        恋猫月亮:@王_胖胖 这个问你们后台才对吧…!!
      • 杰瑞_fff3:请问,IjkVideoView在设置rtmp直播流地址后,怎么监听直播流的中断呢,还有主动切断网络,IjkVideoView会走什么回调方法呢?
      • S_ZY:大神缓存的实现 怎么能支持seek到哪里就从哪里开始缓存而不是像videoCache那样只能从头开始缓存
      • 不会游泳的飞鱼:您好,我想请问一下,iOS该怎么设置cookie,是不是通过setOptions
        不会游泳的飞鱼:@恋猫月亮 谢谢大佬我去试一下
        恋猫月亮:@不会游泳的飞鱼 在header里,如https://github.com/Bilibili/ijkplayer/issues/2879
      • 97f98be4c18b:您好,我问下rtsp流的播放,能控制延迟在500毫秒左右么,我的都是一秒左右
        恋猫月亮:@隔壁大佬王 这就很尴尬了,试试其他的配置
        97f98be4c18b:@恋猫月亮 用了这个,延迟是降下来了,但是播放的时候卡的不行:joy:
        恋猫月亮:@隔壁大佬王 21中的buffer_size", 1316);和 mMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "infbuf 这两个吧
      • 润_36c9:你好,高分辨率开启硬解码要怎么开启?
        恋猫月亮:@润_36c9 mediacodec
      • Hanson_HSS:楼主你好,我的是断网30秒+后会直接卡住视频不动了,然后报FFP_MSG_ERROR: 0,请问这个你知道怎么解决吗?
        Hanson_HSS:我的是iOS
      • 安心做个笨男孩:你好,我想问下,视频里面没有音频,不显示进度,这个问题有没有什么解决办法?
        恋猫月亮:@安心做个笨男孩 你可以看看ijk demo中,有对应返回metainfo之类的信息,里面应该可以看到有没,或者看看tracker
        安心做个笨男孩:@恋猫月亮 你好,那有没有什么方法能提前判断flv视频中没有音频,
        恋猫月亮:@安心做个笨男孩 我印象中ijk的同步时钟是音频,这个如果不修改ffmpeg貌似没什么办法
      • shengshenger:请问一下,iOS版本的ijk怎么实现视频1.5倍速度播放?
      • 8ec09d4cb594:求助 rtsp://113.136.42.39:554/PLTV/88888888/224/0/3221225633/iptv61516.smil 无法播放
      • SoulmateA:老哥,iOS第六点怎么解决的呢
      • 45a78c194da0:UP你好,感谢分享!
        想请教一下,开启 enable-accurate-seek 后,HLS的视频seek的时候就会卡很久,已确认网络正常,不知道你有遇到过吗
      • HoQer:我打基本包,一直报C compiler test failed.什么鬼,我前天才成功了,能正常播放,后来整rtsp,搞没了,现在连终端命令基本的步骤都走不通
      • 艾特不出先生:ijkMediaPlayer.setOption方法是默认已经封装好了的吗?为什么我最近编译的没有这个方法?
      • 骑老虎喊救命:你好,在iOS11 系统上,播放期间需要分享跳转到facebook,然后再返回来,这时候黑屏了但是有声音,怎么解决
        骑老虎喊救命:@恋猫月亮 不清楚哪个是渲染层,可以简单贴下代码吗
        恋猫月亮:@骑老虎喊救命 个人觉得是渲染层在不可见的时候销毁了,在返回的时候会重构,需要再次把渲染层设置到ijk中
      • a07e5a5d3bc8:楼主,你好,,,为什么我调用 mNiceVideoPlayer.setSpeed();设置播放速度没有效果呢?我很确定是IjkPlayer播放器。麻烦解答一下 ,谢谢
      • 29ad9853a3f1:大佬问下,ijkplayer无法播放rtsp 返回-10000,看问题是视频源有问题,但是ios也用的ijk是没问题的,用的你的编译的so,
      • overla5:楼主。
        我按照网上的教程,编译让ijk支持 https

        报错
        Setting default whitelist 'http,https,tls,rtp,tcp,udp,crypto,httpproxy'
        2017-11-22 13:38:31.230284+0800 iOSDemo[2217:792734] invalidateRenderBuffer
        2017-11-22 13:38:31.230558+0800 iOSDemo[2217:792777] IJKSDLGLView: setupDisplay not ready
        2017-11-22 13:38:31.240526+0800 iOSDemo[2217:792734] invalidateRenderBuffer
        2017-11-22 13:38:31.240653+0800 iOSDemo[2217:792777] IJKSDLGLView: setupDisplay not ready
        the user-agent option is deprecated, please use user_agent option
        request: GET / HTTP/1.1

        可以解答一下吗
        恋猫月亮:@失格人间 这个是设置ijkplayer的option,代码里设置的
        overla5:@恋猫月亮 。。我第一次搞,不知道在哪里设置:joy:
        恋猫月亮:@失格人间 你就按着这个设置whitelist和user_agent的option试
      • 第信:用demo播放rtsp流媒体sdp实时视频,几秒就播放结束,是需要做什么特别的配置么
        恋猫月亮:@第信 是的~sdp不是很熟悉
        第信:@恋猫月亮 是指ijk的配置吗
        VideoOptionModel videoOptionMode07 = new VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "rtsp_transport", "tcp");
        恋猫月亮: @第信 设置了tcp链接没
      • 1497bf958c79:亲爱的大神,碰到个问题,导入的您的demo没问题,但是我自己的播放例子,mp4有音没图像。代码跟你一致。视频也一样的。。。可能哪里的问题吗?急切得想得到您的回复。
        1497bf958c79:有人碰到这个bug吗?我的视频控件是放到AppBarLayout里面的。
        1497bf958c79: Process: com.mevos.mbeauty, PID: 27260
        java.lang.ClassCastException: android.view.ContextThemeWrapper cannot be cast to android.app.Activity
        at com.shuyu.gsyvideoplayer.video.base.GSYVideoView.prepareVideo(GSYVideoView.java:289)
        1497bf958c79:谢谢大神,这个问题解决了。
      • 7b5d414ca0f9:切换前后台黑屏好几秒,原生的没有问题
        7b5d414ca0f9:没开启过,难道默认开启的么
        恋猫月亮: @苹果新手 关闭硬解码
      • 无名_b1f6:播放不了腾讯视频,如何处理?求教!!!
        恋猫月亮: @无名_b1f6 视频格式是?视屏编码和音频编码是?容器格式是?
      • 谷歌哥哥:楼主,请问直播退到后台一分钟 然后返回前台 怎么播放一分钟后的内容,就是怎么设置追流呢,谢谢了
        谷歌哥哥:@恋猫月亮 退到后台就让暂停的,没有设置方法,回到前台 让他追流吗
        恋猫月亮: @谷歌哥哥 可以后台一直播放,不断开只是静音😂😂😂,其实吧,后台时间长了,最简单就是重建链接了。
      • 可爱的巴顿将军:我在整合这个播放器到我的工程中,遇到个问题
        我这边要实现一个双屏异显的功能,即在副屏上,播放视频,可是,总是报错
        Caused by: java.lang.ClassCastException: android.app.Presentation$1 cannot be cast to android.app.Activity
        从字面上来看,要实现播放,必须要继承Activity,可是,我要实现双屏异显,必须要继承Presentation,请问怎么办?难道无解吗?
        恋猫月亮: @可爱的巴顿将军 这个就不是很清楚了,你可以看看代码中Cotext相关的,有一些强制转化
      • 无名_b1f6:请教一下如何包房本地视频,我使用的StandardGSYVideoPlayer播放器,使用如下本地url地址,为什么没反应呢?这个地址是我通过通过adb找到的视频路径,是不是格式不对?在线等,急,谢谢!!!
        final String url = "/storage/emulated/0/DCIM/Camera/VID_20170617_233809.mp4";
        gsyVideoPlayer.setUp(url, false , null, "这是title");
        恋猫月亮: @无名_b1f6 大家都正常呀,你播放之前判断下本地路径是否存在先。如果不行那么就看看视频的编码格式和音频编码格式是什么。
        无名_b1f6:@恋猫月亮 我就是下载的Demo,用本地地址替换url运行的,没效果,你知道怎么回事?你有没有试过播放本地视频,本地视频的url格式是怎么样的的?
        恋猫月亮: @无名_b1f6 你把demi中的url换成你的本地地址试试
      • 最后还是个农:请教下播放不了avi rmvb格式,怎么解决?
        最后还是个农:@恋猫月亮 export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=avi"
        export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=rmvp"
        可否?
        最后还是个农:非常感谢,刚刚找到了module.sh文件,但是无从下手,很无助,我需要如何添加?
        恋猫月亮:@最后还是个农 重新编译so,在module.sh中加上avi,rmvb格式支持
      • 60e35d540284:http://player.youku.com/embed/XMjUxOTAxNDc1Ng==.html 优酷视频播放错误返回码-10000
        ffmpeg就是不支持这种类型视频源嘛
      • hfk:我想问下怎么设置断线重连
      • cfe1c1fef66e:作者 我爱上你了 请教一个问题哈 项目同样使用的是ijk,但是每次播放到某个视频80%的时候会自动跳到下一个视频 (网络环境极好)
        cfe1c1fef66e:@恋猫月亮 我之前一直在想是不是关键帧的问题 现在还是要调试下上层逻辑啦
        cfe1c1fef66e:@恋猫月亮 嗯啊 太感谢了 我再调试下 :kissing_heart:
        恋猫月亮: @ceycochen 感觉这个不像是ijk底层的问题,应该是上层判断逻辑的问题吧。
      • 福特go:播放rtsp黑屏,so库是自己编译的,没有配置任何option,用vlc测试流是好的
      • sharlley:如何设置ijkPlayer不要缓冲啊?
        恋猫月亮:@sharlley 如果需要这个,我印象中是需要修改ijk中的so
      • e71e6f155983:朋友,在电视盒上开硬解,黑屏有声,视频源MP4(软解正常), 是因为lib没有配置mpeg4么? 重新编译可行?您说的第二点
        5f170790a503:@pandans 大兄弟 问个问题额 电视盒子的,有时候第一次一直缓冲你遇到过没有
        恋猫月亮: @LTF 下载ijk源码,修改module.sh
        LTF:怎么编译支持其他格式
      • a7f8ea65d28c:private void setVideoURI(Uri uri) {
        Map<String,String> headers = new HashMap<>();
        headers.put("Range"," bytes=0-55084477");
        setVideoURI(uri, headers);
        }

        请问,iOS怎么设置请求头,options参数中好像没有Range,现在公司项目在播放搜狐视频,安卓因为设置了以上参数可是播放,iOS设置后没有效果,请大神赐教!!
        恋猫月亮:@懒羊羊非常懒 这个是java的····你oc里面也有配置option的。
        a7f8ea65d28c:@恋猫月亮 ijkmediaplayer.setOption(1, "headers", “xxxxxxx");这是OC的语法吗?还是swift的?多谢大神。:smile:
        恋猫月亮:@懒羊羊非常懒 header在option中对应的应该是OPT_CATEGORY_FORMAT,也就是1,也就是 ijkmediaplayer.setOption(1, "headers", “xxxxxxx");
      • 西木柚子:第一个能具体解释下怎么操作吗? 正好遇到这个问题,ios录制的视频总是会旋转了90度。非常感谢
        Mr_Me:@西木柚子 mediacodec是对android硬解码的设置
        西木柚子: IJKFFOptions *options = [IJKFFOptions optionsByDefault];
        [options setOptionValue:@"1" forKey:@"mediacodec" ofCategory:kIJKFFOptionCategoryPlayer];
        [options setOptionValue:@"1" forKey:@"mediacodec-auto-rotate" ofCategory:kIJKFFOptionCategoryPlayer];
        [options setOptionValue:@"1" forKey:@"mediacodec-handle-resolution-change" ofCategory:kIJKFFOptionCategoryPlayer];
        self.player = [[IJKFFMoviePlayerController alloc] initWithContentURL:self.url withOptions:options];

        我这样设置还是不起作用
      • 054d8001b759:请问设置硬解码支持rmvb,但是ijk要如何才能硬解码播放得了rmvb?在线等。
      • 果皮儿:学习了
      • miaoyongjun:希望继续更新
        恋猫月亮:@miaoyongjun 会的~如果遇到问题了,会相应更新
      • csycc:getTcpSpeed 只在初始化的时候不是0,后面一直是0。请问楼主,这个怎么处理?
        恋猫月亮:@csycc 没遇到过,我这边一直获取是正常的
        csycc:@恋猫月亮 应该不是,后面一直是0,不可能一直不缓冲。
        恋猫月亮: @csycc 0代表着没网速或者缓冲完成了吧
      • 东之城:问题下 IJK 怎么样配置网络请求超时时间
      • 815d19942012:你好,我加载网络视频,在开始播放前会黑屏几秒钟才开始出画面,请问这个怎么解决呢?望回复 谢谢
        恋猫月亮:@菜鸟小白 不配置option才是正解
        815d19942012:@菜鸟小白 嗯嗯,ijk。我好像是开启硬解码了,我将mediacodec配置成0或者1都会出现这种情况的,好烦躁啊
        恋猫月亮:@菜鸟小白 是用哪个?IJK吗?那确定你是不是开启硬解码了,开启了硬解码很容易出现这种情况。

      本文标题:IJKPlayer问题集锦之不定时更新

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