最简单的让IjkPlayer自动旋转带有rotation视频的方法

霸气de小男生 提交于 2019-12-02 14:43:19

问题

在项目里面我们使用了ijkplayer0.8.8版本去播放网络视频,发现有一些视频播放时被拉伸了。如下图:
这里写图片描述
把视频抓下来查明原因,发现是视频metadata里面带了rotation信息,而视频的宽高被调换了。

解决方法

官方的解决方法是给一个ROTATION_CHANGE的回调给上层,然后上层去把View做旋转。这样实在是太麻烦。我但是很奇怪的是ijkplayer本身是基于ffplay做的,而ffplay本身是支持这一类视频的旋转播放的。看了一下ijkplayer的代码,在ff_play.c里面发现如下代码:

if (ffp->autorotate) {
        double theta  = get_rotation(is->video_st);
        if (fabs(theta - 90) < 1.0) {
            INSERT_FILT("transpose", "clock");
        } else if (fabs(theta - 180) < 1.0) {
            INSERT_FILT("hflip", NULL);
            INSERT_FILT("vflip", NULL);
        } else if (fabs(theta - 270) < 1.0) {
            INSERT_FILT("transpose", "cclock");
        } else if (fabs(theta) > 1.0) {
            char rotate_buf[64];
            snprintf(rotate_buf, sizeof(rotate_buf), "%f*PI/180", theta);
            INSERT_FILT("rotate", rotate_buf);
        }
    }

原来ffplay本身确实有手动做过transpose的逻辑,但是这个逻辑在ijkplayer里面并没有生效,在ijkmedia/ijkplayer/config.h文件里面CONFIG_AVFILTER选项被关闭了。于是把这个选项打开之后重新编译,视频的播放终于自动旋转了。需要注意的是如果ffmpeg选项里面没有打开avfilter,则需要先去编译打开avfilter的ffmpeg到项目中才行。
这里写图片描述

总结

本来我一开始是准备在渲染的部分去对MVP做矩阵旋转。这样基本不会增加任何的CPU消耗,不过修改成本比较高一些,而且需要自己维护,考虑到这一类视频本身很少,所以这个成本也就忽略了。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!