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




0 0
原创粉丝点击