• 开源播放器 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

  • 相关阅读:
    Emacs教程
    华为上机测试 2015
    奇偶排序
    C语言中的EOF和回车不一样
    jquery 使用方法
    1116
    1115
    1109
    Oracle14~23
    get与post的区别
  • 原文地址:https://www.cnblogs.com/renhui/p/6420140.html
Copyright © 2020-2023  润新知