Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to extract orientation information from videos?

After surfing through tons of documentation on the web it seems that the iPhone always shoots the video at a 480x360 aspect ratio and applies a transformation matrix on the video track. (480x360 may change but its always the same for a given device)

Here is a way of modifying the ffmpeg source within a iOS project and accessing the matrix http://www.seqoy.com/correct-orientation-for-iphone-recorded-movies-with-ffmpeg/

Here is a cleaner way of finding the transformation matrix in iOS-4 How to detect (iPhone SDK) if a video file was recorded in portrait orientation, or landscape.

How can the orientation of the video be extracted in either of the options below -
- iOS 3.2
- ffmpeg (through the command line server side)
- ruby

Any help will be appreciated.

like image 412
Sid Avatar asked Mar 13 '11 05:03

Sid


2 Answers

Since most Cameras store their rotation/orientation within the exif-metadata, i would suggest using exifttool and the a ruby wrapper gem called mini_exiftool which is actively maintained.

Install exiftool:

apt-get exiftool || brew install exiftool || port install exiftool

or use what ever package manager is available

Install mini_exiftool:

gem install mini_exiftool

Try it:

irb>
require 'mini_exiftool'
movie = MiniExiftool.new('test_movie.mov')
movie.orientation #=> 90

cheers

like image 119
krichard Avatar answered Oct 16 '22 13:10

krichard


You can use ffprobe. No need for any grep, or any other additional processes, or any regex operations to parse the output as shown in other answers.

If you want the rotate metadata:

Command:

ffprobe -loglevel error -select_streams v:0 -show_entries stream_tags=rotate -of default=nw=1:nk=1 input.mp4

Example output:

90

If you want the display matrix rotation side data:

Command:

ffprobe -loglevel error -select_streams v:0 -show_entries side_data=rotation -of default=nw=1:nk=1 input.mp4

Example output:

-90

If you want the display matrix:

Command:

ffprobe -loglevel error -select_streams v:0 -show_entries side_data=displaymatrix -of default=nw=1:nk=1 input.mp4

Example output:

00000000:            0       65536           0
00000001:       -65536           0           0
00000002:     15728640           0  1073741824

What the options mean

  • -loglevel error Omit the header and other info from output.

  • -select_streams v:0 Only process the first video stream and ignore everything else. Useful if your input contains multiple video streams and you only want info from one.

  • -show_entries stream_tags=rotate Chooses to output the rotate tag from the video stream.

  • -of default=nw=1:nk=1 Use default output format, but omit including the section header/footer wrappers and each field key.

Output format

The output from ffprobe can be formatted in several ways. For example, JSON:

ffprobe -loglevel error -show_entries stream_tags=rotate -of json input.mp4
{
    "streams": [
        {
            "tags": {
                "rotate": "90"
            },
            "side_data_list": [
                {

                }
            ]
        }
    ]
like image 21
llogan Avatar answered Oct 16 '22 13:10

llogan