ijkplayer-旋转角度实现
一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-旋转角度实现相关推荐
- Android 实现视屏播放器、边播边缓存功能、外加铲屎(IJKPlayer)
hello,大家好,我就是那个会掀桌子的话唠,刚刚结束两篇关于音频播放与录制的文章,旧坑未埋就挖新坑,还望多多关照.最近累趴了,周末果断休假. </p> 快看,用力戳它:https://g ...
- ijkplayer打造完美视频播放器
1.ijkplayer简介 ijkplayer是一个基于FFmpeg的轻量级Android/iOS视频播放器.FFmpeg的是全球领先的多媒体框架,能够解码,编码, 转码,复用,解复用,流,过滤器和播 ...
- android 基于ijkplayer项目进行的播放器
jjdxm_ijkplayer 项目地址:jjdxm_ijkplayer 简介:基于 ijkplayer 简单的 UI 界面 当前项目是基于 ijkplayer 项目进行的播放器界面 UI 封装. 是 ...
- Android 实现视屏播放器、边播边缓存功能、外加铲屎(IJKPlayer)(转载)
转载自:<Android 实现视屏播放器.边播边缓存功能.外加铲屎(IJKPlayer)> hello,大家好,我就是那个会掀桌子的话唠,刚刚结束两篇关于音频播放与录制的文章,旧坑未埋就挖 ...
- ijkPlayer播放器快速集成使用
jjdxm_ijkplayer 项目地址: jjdxm_ijkplayer 简介:基于 ijkplayer 简单的 UI 界面 当前项目是基于 ijkplayer 项目进行的播放器界面 UI 封装. ...
- UIView旋转角度
2019独角兽企业重金招聘Python工程师标准>>> 最近做一个视图的旋转.放大.拖动.拉伸,其他的都慢慢解决了,就是旋转之后各种问题不好处理,最终归结到旋转角度的不能获取,纠结了 ...
- android ijkplayer使用_Ijkplayer、ExoPlayer、VLC播放器综合比较
VLC Media Player VLC 是VideoLAN 计划所研发的工程,最早预1996年开始,是一个完全的跨平台播放器,适合Windows.Mac OS.Linux.Android.iOS等系 ...
- androidstudio集成ijkplayer教程
介绍 ijkplayer是一款非常火的开源视频播放器,android和IOS通用.关于怎么编译怎么导入android Studio中自己的项目,其中坑很多,本篇记录下自己的操作记录.ijkplayer ...
- 开源播放器 ijkplayer (四) :Ijkplayer切换网络时停止播放的问题处理
问题起因: 在进行ijkplayer播放器的测试时,发现ijkplayer播放器在切换网络时出现直播画面停止的问题. 问题分析: 抓取日志发现:tv.danmaku.ijk.media.player. ...
- opencvsharp_基于轮廓的形状匹配中匹配坐标与旋转角度
本篇博客不讲理论! 需要看理论的这里附上三个博客: ① 一步一步实现多尺度多角度的形状匹配算法(C++版本) ② 图像的矩,以及利用矩求图像的重心,方向 ③ OpenCV学习(十九) :图像的矩:mo ...
最新文章
- 【CTF】实验吧 古典密码
- 获取手机上的相关参数方法
- Laravel的请求声明周期
- noip提高组2000 乘积最大
- 别人家的孩子!高校博士实现Nature、Science双发!
- python安装vtk_python - 安装VTK for Python - SO中文参考 - www.soinside.com
- mysql dbo_mysql-双重分组
- 如何用 javascript 做一个高逼格的进度条
- Eclipse 工程迁移到 Android Studio
- PHP查询函数调用堆栈
- 恩智浦智能车入门——一定避免那些坑
- 数字图像处理(2): 颜色空间/模型—— RGB, CMY/CMYK, HSI, HSV, YUV
- CART算法的原理以及实现
- win7计算机管理员与超级,win7系统家庭版开启Administrator超级管理员帐户的详细技巧...
- 烤地瓜(PYTHON 学习类和对象)
- 智能管家---4.Log封装
- 轻松学会WiFi模块(ESP8266)—基于STM32,学到就是赚到!
- Docker容器之Docker Swarm集群详解(上)
- mt4登录下方显示没有服务器,FXCM福汇MT4登录没有FXCM-USDReal07服务器怎么办,登录不了...
- 你觉得java与嵌入式学哪个好?
热门文章
- PHP开发者最好的学习资源收集
- LINQ to XML 操作XML文档
- 解决上左右页面框架中iframe的引起的滚动条问题
- UVA763 LA5339 Fibinary Numbers【大数】
- Bailian2720 大象喝水【模拟】
- 51NOD-1029 大数除法【大数】
- NUC1333 Knight Moves【DFS】
- HDU1087 Super Jumping! Jumping! Jumping!【最长上升子序列+DP】
- UVA494 Kindergarten Counting Game【输入输出+水题】
- Logistic Regression 的简单推导