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


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。这样就改变了视频的旋转角度。那么应用上层做了针对重力的视频旋转,这个有没有问题呢?目前没收到反馈。

ffmpeg系列-视频旋转角度实现相关推荐

  1. FFmpeg获取视频旋转角度rotate获取不到的问题解决

    ffmpeg获取视频旋转角度,这个主要是在ios或者安卓手机拍照出来的视频,一般是高比宽大. 那么在我们自己用ffmpeg处理视频的时候,比如获取YUV的时候,其实倒立着的.即使你以后处理了,比如做水 ...

  2. C++ - 使用ffmpeg读取视频旋转角度并使用OpenCV根据旋转角度对视频进行旋转复原

    1 视频中的旋转信息以及为什么会有旋转信息 Android或者ios等手机上录制视频时,由于重力感应或者录制视频的摆放方式的问题会导致录制的视频拥有旋转信息.如果是横屏录制(手机逆时针旋转90度),则 ...

  3. ffmpeg 处理带有旋转角度视频

    1. 查看视频信息,看视频是否带有旋转角度 命令:ffmpeg -i xxxx.mp4 上图中的红框处,可以看出此视频旋转角度为90 通过程序执行命令读流的方式,可以从返回信息中截取此处信息,拼配正则 ...

  4. FFMPEG针对视频操作的基本命令

    1.FFMPEG裁剪视频 命令:ffmpeg -ss START -t DURATION -i INPUT -vcodec copy -acodec copy OUTPUT 其中各参数的说明如下: S ...

  5. 深度探索:使用FFmpeg实现视频Logo的添加与移除

    深度探索:使用FFmpeg实现视频Logo的添加与移除 前言 一.FFmpeg简介(Introduction to FFmpeg) 1.1 FFmpeg的定义(Definition of FFmpeg ...

  6. 使用ffmpeg进行视频文件转换成FLV整理

    本系列文章导航 Windows下FFmpeg快速入门 ffmpeg参数解释 mencoder和ffmpeg参数详解(Java处理视频) Java 生成视频缩略图(ffmpeg) 使用ffmpeg进行视 ...

  7. FastASR+FFmpeg(音视频开发+语音识别)

    想要更好的做一件事情,不仅仅需要知道如何使用,还应该知道一些基础的概念. 一.音视频处理基本梳理 1.多媒体文件的理解 1.1 结构分析 多媒体文件本质上可以理解为一个容器 容器里有很多流 每种流是由 ...

  8. ffmpeg音视频文件音视频流抽取,初步尝试人声分离

    文章目录 ffmpeg抽取音视频文件中的音频流 音频流类型 AAC与m4a的区别 AAC与mp3的区别 用ffmpeg查看视频的信息 用ffmpeg抽取AAC音频流 从AAC文件中获取音轨 音轨是什么 ...

  9. 爬虫案例 b站学习系列视频,番剧,单个视频 下载

    开发原因: 一些脚本可以获得b站视频的下载链接,但下载时没有文件名: 虽然有youtobe-dl,但下载速度较慢,所以想要去写一个自己的程序自己使用,目前脚本自己下载资料时一直使用,顺便解决一下问题. ...

最新文章

  1. list redis 怎样做排行_学 Redis 的 7000 字小结!!!
  2. 安全开发之碰撞检测与伤害计算逻辑
  3. java 限制并发数_限制并发请求数aiohttp
  4. js eval()函数
  5. 顺应大数据时代创新社会治理模式
  6. python-可变循环
  7. 内卷时代,普通测试员的铁饭碗究竟是什么?
  8. Creo:Creo2.0安装实例教程之图文详细攻略
  9. 基于Html的个人展示网站设计与实现
  10. Java 百度ocr文字识别-发票识别,并在页面显示信息
  11. linux下安装drcom方法
  12. React.js+i18next实现国际化
  13. uniapp 下载文件却变成了跳转
  14. 玩转群晖NAS——实现IPV6访问并部署动态域名解析程序(Golang)
  15. 抖音素材哪里收集_抖音短视频的内容素材从哪里来,抖音内容素材哪里收集
  16. 新型时尚壁画挂式生态水族箱尽在海诗景观
  17. 百度关键字SEO排名优化方案与流程
  18. 老程序员来说算法重要不重要
  19. Sql优化一:sql语句优化
  20. 【Metashape精品教程5】影像质量评估

热门文章

  1. SAP 数据表相关信息
  2. HDU2111 Saving HDU【贪心】
  3. AOAPC I: Beginning Algorithm Contests 题解
  4. JSK-389 同因查找【入门】
  5. Bailian2694 逆波兰表达式(POJ NOI0202-1696, POJ NOI0303-1696)【文本】
  6. Bailian3708 1的个数【进制】
  7. POJ NOI MATH-7648 蓄水池水管问题
  8. (操作系统)系统调用
  9. 计算机的组成 —— 主板
  10. 人脑、思维与认知的研究