FFmpeg获取视频旋转角度rotate获取不到的问题解决
来源:互联网 发布:飞控软件下载 编辑:程序博客网 时间:2024/04/28 01:18
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:0Key: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获取不到的问题解决
- FFmpeg获取视频的旋转角度rotate函数,一定能获取!(要放在解析视频流的时候才能获取)
- ffmpeg 获取和设置视频旋转角度
- ffmpeg 获取和设置视频旋转角度
- IOS获取ALAsset里面的视频的旋转角度
- 获取视频旋转角度,并对视频进行旋转
- 如何通过js获取到CSS3里面transform rotate旋转角度的度数,matrix解析
- 如何通过js获取到CSS3里面transform rotate旋转角度的度数,matrix解析
- android获取图片的旋转角度
- 获取当前按钮旋转的角度
- ios获取视频宽高比分辨率以及旋转角度
- iOS10 IDFA 获取不到问题解决
- FFmpeg获取是视频的关键帧
- FFmpeg获取视频信息的对应字段
- andorid 获取图片的exif的旋转角度
- unity rotate 旋转物体 限制物体旋转角度 的大坑
- CodeIgniter RestServer中put请求获取不到参数的问题解决
- ffmpeg 获取视频关键帧
- 模糊匹配查询 hql
- Cstring转int型问题(error C2664: “atoi”: 不能将参数 1 从“CString”转换为“const char *”))
- Objective-C中@property与@synthesize配对使用
- android学习之CheckBox
- 航行时,计算地球上2个位置的距离,方位角度程序
- FFmpeg获取视频旋转角度rotate获取不到的问题解决
- c++中的包含保护符
- Windows Sockets 基础
- windows xp开机提示系统资源不够 无法完成api
- 构建微服务-第一章-什么是微服务_004部署和组织协调
- Linux查看真实内存使用率
- 如何创建一个android的react-native组件(二)
- Unix网络编程(一):套接字地址结构
- 第三方进度显示器MBProgressHUD的使用