FFmpeg获取视频旋转角度rotate获取不到的问题解决
ffmpeg获取视频旋转角度,这个主要是在ios或者安卓手机拍照出来的视频,一般是高比宽大。
那么在我们自己用ffmpeg处理视频的时候,比如获取YUV的时候,其实倒立着的。即使你以后处理了,比如做水印什么,估计就做的不对了。并且我们自己用ffmpeg的框架代码来写相关的东西,也需要获取这个视频的旋转角度。
网上这个方面的资料很少,很多方法都获取不到。我也是早前弄了很久,没搞定,后来因为项目搞其他的去了。
今天搞定了其他项目,回过头来折腾ffmpeg的事情,也许灵感一来,就先通过本地的ffmpeg -i test.mp4,信息显示如下:
lunildeMacBook-Air:Desktop lunil-air$ ffmpeg -i tempvideo.mp4
ffmpeg version 2.8.2 Copyright (c) 2000-2015 the FFmpeg developers
built with Apple LLVM version 7.0.0 (clang-700.1.76)
configuration: --enable-libfaac --enable-nonfree
libavutil 54. 31.100 / 54. 31.100
libavcodec 56. 60.100 / 56. 60.100
libavformat 56. 40.101 / 56. 40.101
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 40.101 / 5. 40.101
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 2.101 / 1. 2.101
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'tempvideo.mp4':
Metadata:
major_brand : qt
minor_version : 0
compatible_brands: qt
creation_time : 2016-01-18 15:09:43
Duration: 00:00:04.08, start: 0.000000, bitrate: 18005 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080, 17926 kb/s, 24.01 fps, 24 tbr, 600 tbn, 1200 tbc (default)
Metadata:
rotate : 90
creation_time : 2016-01-18 15:09:43
handler_name : Core Media Data Handler
encoder : H.264
Side data:
displaymatrix: rotation of -90.00 degrees
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 63 kb/s (default)
Metadata:
creation_time : 2016-01-18 15:09:43
handler_name : Core Media Data Handler
Stream #0:2(und): Data: none (mebx / 0x7862656D), 0 kb/s (default)
Metadata:
creation_time : 2016-01-18 15:09:43
handler_name : Core Media Data Handler
Stream #0:3(und): Data: none (mebx / 0x7862656D), 0 kb/s (default)
Metadata:
creation_time : 2016-01-18 15:09:43
handler_name : Core Media Data Handler
其中红色的部分就是Metadata,但是通过如下代码:
tag = av_dict_get(pFormatCtx->metadata, "rotate", tag, 0);if (tag==NULL){printf("==========tag is null \n" );
// printf("Option %s not found.\n", tag->key);m_Rotate = 0;}else{int angle = atoi(tag->value);printf("===========angle==:%d\n",angle);angle %= 360;if (angle == 90){m_Rotate = MT_VIDEO_ROTATE_90;}else if (angle == 180){m_Rotate = MT_VIDEO_ROTATE_180;}else if (angle == 270){m_Rotate = MT_VIDEO_ROTATE_270;}else{m_Rotate = MT_VIDEO_ROTATE_0;}}return m_Rotate;
无论如何都获取不了,因为对视频是新手,不了解这个格式。后来我打算把AVDictionaryEntry
打印出来看看,看看tag里面都有什么东西,于是就跑到AVDictionaryEntry的结构去看看,它是一个key,value的存储方式。那就比较简单了,于是写一下如下的循环:
AVDictionaryEntry *m = NULL;while((m=av_dict_get(pFormatCtx->metadata,"",m,AV_DICT_IGNORE_SUFFIX))!=NULL){printf("Key:%s ===value:%s\n", m->key,m->value);}
遍历一下这个东西,就能打出结果如下:
Key:major_brand ===value:qt
Key:minor_version ===value:0
Key:compatible_brands ===value:qt <p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; font-family: Menlo;"><strong>Key:creation_time ===value:2016-01-18 15:09:43</strong></p>
这个Metadata对应了最上面的一个红色Metadata,因为我这个循环是放在: avformat_open_input 的后面。
这就说明我需要找到下面的一个Metadata,我估计是需要用到视频数据的时候,就能够打出rotate来。
后来在下面的代码后面跑,就出现rotate了:
if ((ret = av_read_frame(pFormatCtx, &packet)) < 0)break;if (packet.stream_index == video_stream_index) {
读取帧,然后判断是不是视频流,如果是,再打印metadata,果然就出现了。
AVStream *stream=pFormatCtx->streams[packet.stream_index];AVDictionaryEntry *m = NULL;while((m=av_dict_get(stream->metadata,"",m,AV_DICT_IGNORE_SUFFIX))!=NULL){printf("22222222====Key:%s ===value:%s\n", m->key,m->value);}
打印的结果如下:
22222222====Key:rotate ===value:90
22222222====Key:creation_time ===value:2016-01-18 15:09:43
22222222====Key:language ===value:und
22222222====Key:handler_name ===value:Core Media Data Handler
22222222====Key:encoder ===value:H.264
FFmpeg获取视频旋转角度rotate获取不到的问题解决相关推荐
- python ffmpeg 获取视频信息_ffmpeg获取视频信息
php使用ffmpeg获取视频信息可以获取到视频的分辨率.文件大小.播放时长.编码格式.视频格式.音频编码.音频采样频率.等..... 废话不多说,直接上代码.../** * Name: ffmpeg ...
- ffmpeg系列-视频旋转角度实现
一app开发,火急火燎的拿来一个视频,说录制的视频播放角度都不正常.拿过来一看,确实,角度是歪的,用系统的mediaplayer一试,是正常的.把视频放到ffmpeg中,可以看到视频metadata下 ...
- 获取视频旋转角度,并对视频进行旋转
Android平台上录制视频时,如果是横屏录制(手机逆时针旋转90度),则录制的视频时不带角度的.如果是竖屏录制(正常的拿手机的姿势),此时的录制的视频的旋转角度是90度.如果再旋转90度,此时一般音 ...
- java 获取视频信息_Java获取视频参数信息
Java获取视频参数信息 资料收集 经过搜索常用的处理视频的方式有两种:xuggler 和 ffmpeg 因ffmpeg 需要使用JNI调用,这里采用xuggler方式 使用xuggler获取视频宽. ...
- C++ - 使用ffmpeg读取视频旋转角度并使用OpenCV根据旋转角度对视频进行旋转复原
1 视频中的旋转信息以及为什么会有旋转信息 Android或者ios等手机上录制视频时,由于重力感应或者录制视频的摆放方式的问题会导致录制的视频拥有旋转信息.如果是横屏录制(手机逆时针旋转90度),则 ...
- java 获取视频时间_java 获取视频时间
//先将视频保存到项目生成临时文件,获取时长后删除临时文件 //使用fastdfs进行文件上传 @RequestMapping("/uploadVideoToFast") @Res ...
- android 获取视频大小,Android 获取视频缩略图(获取视频每帧数据)的优化方案
速度对比 左边的图片是通过方式1 右边的图片是通过方式2 speed.gif 速度优化,效果拔群. 在缩小2倍的Bitmap输出情况下 使用MediaMetadataRetriever 抽帧的速度,每 ...
- ffmpeg获取视频时长和分辨率
文章目录 ffmpeg获取视频文件时长和分辨率 获取视频时长 获取视频分辨率 ffmpeg获取视频文件时长和分辨率 获取视频时长 import os import subprocess# video_ ...
- Linux下通过v4l2获取视频设备名、支持的编解码及视频size列表实现
早些时候给出了在Windows下通过dshow获取视频设备信息的实现,包括获取视频设备名.获取每种视频设备支持的编解码格式列表.每种编解码格式支持的video size列表,见:https://blo ...
最新文章
- tkinter实现弹出输入对话框并获取输入对话框中的值
- python 处理excel
- 5G NR RLC:PDU Parameters
- 快速解码base64和utf-8的ASCII编码和URL解码
- pip安装的库导入pycharm中
- tfs 未能在以下位置创建报表文件夹 /TfsReports: 授予的权限不足,无法执行此操作
- 外媒:ATT宣布加入SD-WAN阵营
- mac版本的pycharm如何设置成中文
- C# 调用控制台应用程序及传参
- 使用Racket语言给图片添加文字logo
- 永不消失的电波 2020.12.07
- as打包app连不上网络_1000M光纤到户RT-AC68U配单只Lyra Trio织女星家庭AiMesh网络搭建...
- MongoDB系列之添加账号和密码
- termux上的c语言编译器,Termux 与 C 基础
- 刷题记录:牛客NC16122郊区春游
- Android软件开发环境搭建
- 求1的阶乘+2的阶乘+3的阶乘+4的阶乘+…+n的阶乘
- amr转wav java,Android系统wav和amr的互转
- Python爬虫实战之爬取糗事百科段子
- maven依赖asm_maven 导入asm的依赖 、 简单入门
热门文章
- ariang修改默认服务器,Mac小技巧之AriaNg Native配置
- 购物网站的推荐算法-个性化推荐算法中如何处理买了还推
- 微软office在线文档_如何使用Microsoft Office密码保护文档和PDF
- 解决“你的许可证不是正版,并且你可能是盗版软件的受害者。使用正版Office,避免干扰并保护你的文件安全。”
- 【产业互联网周报】容联云下周纽交所挂牌;声网Agora因Clubhouse股价周内涨超30%;贝索斯将卸任亚马逊CEO...
- sap外币重估流程图_SAP外币评估配置及操作OK
- 1285. 四的乘方
- NGFW module恢复密码操作方法
- 如何快速、有效地管理海量的、分散的数据?佳农靠它实现数智化
- Kubernetes资源平台--ratel