一app开发,火急火燎的拿来一个视频,说录制的视频播放角度都不正常。拿过来一看,确实,角度是歪的,用系统的mediaplayer一试,是正常的。把视频放到ffmpeg中,可以看到视频metadata下视频旋转角度是90度。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k794Sepj-1597211746055)(https://note.youdao.com/yws/api/personal/file/E49561CBC4B44D7584D7F229A786E104?method=download&shareKey=368ac70fb9c45ff121dfed2f8c1a8fa8)]
ijk中有提供视频角度旋转的接口:

 //开启自动旋转,这里旋转的是视频
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-auto-rotate", 1);//关闭自动旋转
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-auto-rotate", 0);

那么我们看下这个接口做了什么呢?
这个在recreate_format_l/ffpipenode_android_mediacodec_vdec.c函数中

//获取视频旋转角度rotate_degrees = ffp_get_video_rotate_degrees(ffp);//如果上层开启旋转,也就是上面设置的2个接口,同时视频角度不为0if (ffp->mediacodec_auto_rotate &&rotate_degrees != 0 &&SDL_Android_GetApiLevel() >= IJK_API_21_LOLLIPOP) {ALOGI("amc: rotate in decoder: %d\n", rotate_degrees);opaque->frame_rotate_degrees = rotate_degrees;//把获取的视频角度设置给mediaformatSDL_AMediaFormat_setInt32(opaque->input_aformat, "rotation-degrees", rotate_degrees);//通知上层,视频角度改变了ffp_notify_msg2(ffp, FFP_MSG_VIDEO_ROTATION_CHANGED, 0);} else {ALOGI("amc: rotate notify: %d\n", rotate_degrees);ffp_notify_msg2(ffp, FFP_MSG_VIDEO_ROTATION_CHANGED, rotate_degrees);}

看一下获取视频角度ffp_get_video_rotate_degrees/ff_ffplay.c函数:

//获取视频角度
int ffp_get_video_rotate_degrees(FFPlayer *ffp)
{VideoState *is = ffp->is;if (!is)return 0;
//获取的角度%360度,不足的还是原来的值int theta  = abs((int)((int64_t)round(fabs(get_rotation(is->video_st))) % 360));switch (theta) {//如果角度是0 90 180 270度,则不处理,直接跳出来case 0:case 90:case 180:case 270:break;//如果角度是360度,则置0case 360:theta = 0;break;default://或者置0ALOGW("Unknown rotate degress: %d\n", theta);theta = 0;break;}return theta;
}

继续跟踪函数get_rotation/ff_cmdutils.c函数

double get_rotation(AVStream *st)
{
//从metadata的rotate获取视频旋转角度AVDictionaryEntry *rotate_tag = av_dict_get(st->metadata, "rotate", NULL, 0);uint8_t* displaymatrix = av_stream_get_side_data(st,AV_PKT_DATA_DISPLAYMATRIX, NULL);double theta = 0;if (rotate_tag && *rotate_tag->value && strcmp(rotate_tag->value, "0")) {char *tail;theta = av_strtod(rotate_tag->value, &tail);if (*tail)theta = 0;}if (displaymatrix && !theta)theta = -av_display_rotation_get((int32_t*) displaymatrix);theta -= 360*floor(theta/360 + 0.9/360);if (fabs(theta - 90*round(theta/90)) > 2)av_log(NULL, AV_LOG_WARNING, "Odd rotation angle.\n""If you want to help, upload a sample ""of this file to ftp://upload.ffmpeg.org/incoming/ ""and contact the ffmpeg-devel mailing list. (ffmpeg-devel@ffmpeg.org)");return theta;
}

那么从上面我们就可以知道,视频的整个旋转流程就是从metadata中获取rotate,也就是拿到视频的角度,然后在创建mediaformat的时候,设置给mediaformat。这样就改变了视频的旋转角度。那么应用上层做了针对重力的视频旋转,这个有没有问题呢?目前没收到反馈。

ijkplayer-旋转角度实现相关推荐

  1. Android 实现视屏播放器、边播边缓存功能、外加铲屎(IJKPlayer)

    hello,大家好,我就是那个会掀桌子的话唠,刚刚结束两篇关于音频播放与录制的文章,旧坑未埋就挖新坑,还望多多关照.最近累趴了,周末果断休假. </p> 快看,用力戳它:https://g ...

  2. ijkplayer打造完美视频播放器

    1.ijkplayer简介 ijkplayer是一个基于FFmpeg的轻量级Android/iOS视频播放器.FFmpeg的是全球领先的多媒体框架,能够解码,编码, 转码,复用,解复用,流,过滤器和播 ...

  3. android 基于ijkplayer项目进行的播放器

    jjdxm_ijkplayer 项目地址:jjdxm_ijkplayer 简介:基于 ijkplayer 简单的 UI 界面 当前项目是基于 ijkplayer 项目进行的播放器界面 UI 封装. 是 ...

  4. Android 实现视屏播放器、边播边缓存功能、外加铲屎(IJKPlayer)(转载)

    转载自:<Android 实现视屏播放器.边播边缓存功能.外加铲屎(IJKPlayer)> hello,大家好,我就是那个会掀桌子的话唠,刚刚结束两篇关于音频播放与录制的文章,旧坑未埋就挖 ...

  5. ijkPlayer播放器快速集成使用

    jjdxm_ijkplayer 项目地址: jjdxm_ijkplayer 简介:基于 ijkplayer 简单的 UI 界面 当前项目是基于 ijkplayer 项目进行的播放器界面 UI 封装. ...

  6. UIView旋转角度

    2019独角兽企业重金招聘Python工程师标准>>> 最近做一个视图的旋转.放大.拖动.拉伸,其他的都慢慢解决了,就是旋转之后各种问题不好处理,最终归结到旋转角度的不能获取,纠结了 ...

  7. android ijkplayer使用_Ijkplayer、ExoPlayer、VLC播放器综合比较

    VLC Media Player VLC 是VideoLAN 计划所研发的工程,最早预1996年开始,是一个完全的跨平台播放器,适合Windows.Mac OS.Linux.Android.iOS等系 ...

  8. androidstudio集成ijkplayer教程

    介绍 ijkplayer是一款非常火的开源视频播放器,android和IOS通用.关于怎么编译怎么导入android Studio中自己的项目,其中坑很多,本篇记录下自己的操作记录.ijkplayer ...

  9. 开源播放器 ijkplayer (四) :Ijkplayer切换网络时停止播放的问题处理

    问题起因: 在进行ijkplayer播放器的测试时,发现ijkplayer播放器在切换网络时出现直播画面停止的问题. 问题分析: 抓取日志发现:tv.danmaku.ijk.media.player. ...

  10. opencvsharp_基于轮廓的形状匹配中匹配坐标与旋转角度

    本篇博客不讲理论! 需要看理论的这里附上三个博客: ① 一步一步实现多尺度多角度的形状匹配算法(C++版本) ② 图像的矩,以及利用矩求图像的重心,方向 ③ OpenCV学习(十九) :图像的矩:mo ...

最新文章

  1. 【CTF】实验吧 古典密码
  2. 获取手机上的相关参数方法
  3. Laravel的请求声明周期
  4. noip提高组2000 乘积最大
  5. 别人家的孩子!高校博士实现Nature、Science双发!
  6. python安装vtk_python - 安装VTK for Python - SO中文参考 - www.soinside.com
  7. mysql dbo_mysql-双重分组
  8. 如何用 javascript 做一个高逼格的进度条
  9. Eclipse 工程迁移到 Android Studio
  10. PHP查询函数调用堆栈
  11. 恩智浦智能车入门——一定避免那些坑
  12. 数字图像处理(2): 颜色空间/模型—— RGB, CMY/CMYK, HSI, HSV, YUV
  13. CART算法的原理以及实现
  14. win7计算机管理员与超级,win7系统家庭版开启Administrator超级管理员帐户的详细技巧...
  15. 烤地瓜(PYTHON 学习类和对象)
  16. 智能管家---4.Log封装
  17. 轻松学会WiFi模块(ESP8266)—基于STM32,学到就是赚到!
  18. Docker容器之Docker Swarm集群详解(上)
  19. mt4登录下方显示没有服务器,FXCM福汇MT4登录没有FXCM-USDReal07服务器怎么办,登录不了...
  20. 你觉得java与嵌入式学哪个好?

热门文章

  1. PHP开发者最好的学习资源收集
  2. LINQ to XML 操作XML文档
  3. 解决上左右页面框架中iframe的引起的滚动条问题
  4. UVA763 LA5339 Fibinary Numbers【大数】
  5. Bailian2720 大象喝水【模拟】
  6. 51NOD-1029 大数除法【大数】
  7. NUC1333 Knight Moves【DFS】
  8. HDU1087 Super Jumping! Jumping! Jumping!【最长上升子序列+DP】
  9. UVA494 Kindergarten Counting Game【输入输出+水题】
  10. Logistic Regression 的简单推导