zoukankan      html  css  js  c++  java
  • 开源播放器 ijkplayer (一) :使用Ijkplayer播放直播视频

    1、ijkplayer 编码

    IjkPlayer支持硬解码和软解码。 软解码时不会旋转视频角度这时需要你通过onInfowhat == IMediaPlayer.MEDIA_INFO_VIDEO_ROTATION_CHANGED去获取角度,自己旋转画面。或者开启硬解硬解码,不过硬解码容易造成黑屏无声(硬件兼容问题),下面是设置硬解码相关的代码

    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 倍速播放

    目前ijkplayer最新版本支持倍速播放(版本号0.7.7.1)。在早期版本对倍速播放支持的不是很好,只有6.0及以上的手机才能进行倍速播放。但是目前虽然所有的机型都支持倍速,但是6.0以下的手机明显有声调变化,这样用户体验不是很好(针对变调的文章会在以后更新)。下面是最新的倍速设置代码:

    public void setSpeed(float speed) {
        _setPropertyFloat(FFP_PROP_FLOAT_PLAYBACK_RATE, speed);
    }

    老版本代码:

    @TargetApi(Build.VERSION_CODES.M)
        public void setSpeed(float speed) {
            _setPropertyFloat(FFP_PROP_FLOAT_PLAYBACK_RATE, speed);
        }

    老版本代码只能设置速度,不能获取,所以基本上不能用(而且机型方面只支持6.0以上的机型)。


    更新:当前最新版本为0.8.8,倍速功能能够在所有android机型上正常使用,倍速时可能也存在声调问题,但是可以通过设置参数来解决:

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

     此问题,本人也专门写了一篇文章做了详细的说明,文章地址为:https://www.cnblogs.com/renhui/p/6510872.html

    3、ijkplayer的一些重要的视频返回码

    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;//数据错误没有有效的回收

    4、Ijkplayer调用seekTo存在的问题

    ijkplyer 在播放部分视频时,调用seekTo的时候,会跳回到拖动前的位置,这是因为视频的关键帧的问题(GOP导致的),视频压缩比较高,而seek只支持关键帧,出现这个情况就是原始的视频文件中i帧比较少,播放器会在拖动的位置找最近的关键帧。所以,目前针对此问题ijkPlayer无解。

    注:目前最新版0.8.8相对于之前的版本来说,seekTo的问题应该会小很多,但是不可避免的还是会存在。

    相关代码:

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

    5. Ijkplayer音视频不同步问题

    在开始使用过程当中对rtmp视频流进行播放,会出现严重的视频音频不同步现象,并且随着播放的时间越长,视频与音频的差距越大。具体原因是CPU在处理视频帧的时候处理得太慢,默认的音视频同步方案是视频同步到音频, 导致了音频播放过快,视频跟不上。

    { "framedrop",                      "drop frames when cpu is too slow",
            OPTION_OFFSET(framedrop),       OPTION_INT(0, -1, 120) },

    framedrop 控制着允许丢帧的范围。可以通过修改 framedrop 的数值来解决不同步的问题,framedrop 是在视频帧处理不过来的时候丢弃一些帧达到同步的效果。具体设置:

    player.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 5);

    framedrop 的具体大小根据实际情况而定, 一般丢太多帧也不好,会影响用户的观看体验。

    6、如何支持https链接播放?

    如果你的项目要进行加密播放HLS协议的视频,要想支持https,须要在普通编译的基础上,进行一些配置。

    接下来我们来编译openssl

    a). init openssl

    $ cd .. 进入到ijkplayer的目下
    $ ./init-android-openssl.sh 去远程仓库拉取openssl的远程代码,如果是iOS的,这里是init-ios-openssl.h 

    b). compile openssl

    $ cd android/contrib
    $ ./compile-openssl.sh clean
    $ ./compile-openssl.sh all

    经过以上步骤已经编译好openssl了,然后我们执行一下方法

    $./compile-ffmpeg.sh clean
    编译ffmpeg软解码库,这个过程会生成各种架构的ffmpeg 这个过程比较耗时
    $./compile-ffmpeg.sh all

    7、Ijkplayer使用小技巧

    a. 下载速度可以通过IjkMediaPlayer的 getTcpSpeed获取。

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

    c. IjkMediaPlayer.setOption可配置的对应头文件参考:ff_ffplay_options

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

    8、 基于ijkplayer的开源播放器推荐

    GSYVideoPlayer

  • 相关阅读:
    JS站点
    1011 World Cup Betting (20分)
    1007 Maximum Subsequence Sum (25分)(动态规划DP)
    1006 Sign In and Sign Out (25分)
    1005 Spell It Right (20分)
    1004 Counting Leaves (30分)(DFS)
    1003 Emergency (25分)(Dijkstra算法)
    1002 A+B for Polynomials (25分)
    1001 A+B Format (20分)
    canvas
  • 原文地址:https://www.cnblogs.com/renhui/p/6420140.html
Copyright © 2011-2022 走看看