Как извлечь информацию об ориентации из видео? - PullRequest
18 голосов
/ 13 марта 2011

После просмотра тонны документации в Интернете кажется, что iPhone всегда снимает видео с соотношением сторон 480x360 и применяет матрицу преобразования к видеодорожке. (480x360 может измениться, но это всегда то же самое для данного устройства)

Вот способ изменения источника ffmpeg в проекте iOS и доступа к матрице http://www.seqoy.com/correct-orientation-for-iphone-recorded-movies-with-ffmpeg/

Вот более чистый способ поиска матрицы преобразования в iOS-4. Как определить (iPhone SDK), был ли видеофайл записан в книжной или альбомной ориентации.

Как можно извлечь ориентацию видео в одном из следующих вариантов -
- iOS 3.2
- ffmpeg (через серверную строку командной строки)
- рубин

Любая помощь будет оценена.

Ответы [ 6 ]

11 голосов
/ 04 июля 2011

Поскольку большинство камер хранят свое вращение / ориентацию в exif-метаданных, я бы предложил использовать exifttool и гем рубиновой оболочки mini_exiftool, который активно поддерживается .

Установить exiftool:

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

или используйте любой доступный менеджер пакетов

Установить mini_exiftool:

gem install mini_exiftool

Попробуйте:

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

ура

10 голосов
/ 03 июля 2011

Из того, что я нашел до сих пор, ffmpeg не имеет возможности определять ориентацию iPhone.Но, библиотека с открытым исходным кодом, mediainfo может.Пример командной строки:

$ mediainfo test.mp4 | grep Rotation
Rotation                         : 90°

Дополнительные примеры вывода из того же видео на iphone:

Video
ID                               : 1
Format                           : AVC
Format/Info                      : Advanced Video Codec
Format profile                   : Baseline@L3.0
Format settings, CABAC           : No
Format settings, ReFrames        : 1 frame
Codec ID                         : avc1
Codec ID/Info                    : Advanced Video Coding
Duration                         : 7s 941ms
Bit rate mode                    : Variable
Bit rate                         : 724 Kbps
Width                            : 480 pixels
Height                           : 360 pixels
Display aspect ratio             : 4:3
Rotation                         : 90°
Frame rate mode                  : Variable
Frame rate                       : 29.970 fps
Minimum frame rate               : 28.571 fps
Maximum frame rate               : 31.579 fps
Color space                      : YUV
Chroma subsampling               : 4:2:0
Bit depth                        : 8 bits
Scan type                        : Progressive
Bits/(Pixel*Frame)               : 0.140
Stream size                      : 702 KiB (91%)
Title                            : Core Media Video
Encoded date                     : UTC 2011-06-22 15:58:25
Tagged date                      : UTC 2011-06-22 15:58:34
Color primaries                  : BT.601-6 525, BT.1358 525, BT.1700 NTSC, SMPTE 170M
Transfer characteristics         : BT.709-5, BT.1361
Matrix coefficients              : BT.601-6 525, BT.1358 525, BT.1700 NTSC, SMPTE 170M
7 голосов
/ 23 декабря 2016

Вы можете использовать ffprobe.Нет необходимости в grep, каких-либо дополнительных процессах или операциях регулярного выражения для анализа выходных данных, как показано в других ответах.

Если вы хотите повернуть метаданные:

Команда:

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

Пример вывода:

90

Если вы хотите, чтобы данные стороны вращения матрицы дисплея:

Команда:

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

Пример вывода:

-90

Если вам нужна матрица дисплея:

Команда:

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

Пример вывода:

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

Что заЗначения опций

  • -loglevel error Опустить заголовок и другую информацию из вывода.

  • -select_streams v:0 Обрабатывать только первый поток видео и игнорировать всеостальное.Полезно, если ваш вход содержит несколько видеопотоков, и вам нужна информация только от одного.

  • -show_entries stream_tags=rotate Выбирает вывод тега rotate из видеопотока.

  • -of default=nw=1:nk=1 Использовать по умолчанию формат вывода , но не указывать обертки верхнего / нижнего колонтитула раздела и каждый ключ поля.

Формат вывода

Вывод ffprobe может быть отформатирован несколькими способами .Например, JSON:

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

                }
            ]
        }
    ]
4 голосов
/ 09 января 2013

ffmpeg сообщает метаданные со значением поворота для файлов .mov:

ffmpeg -i myrotatedMOV.mov

....

Duration: 00:00:14.31, start: 0.000000, bitrate: 778 kb/s
    Stream #0:0(und): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p, 480x360, 702 kb/s, 29.98 fps, 30 tbr, 600 tbn, 1200 tbc
    Metadata:
      rotate          : 180
      creation_time   : 2013-01-09 12:47:36
      handler_name    : Core Media Data Handler
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, s16, 62 kb/s
    Metadata:
      creation_time   : 2013-01-09 12:47:36
      handler_name    : Core Media Data Handler

В моем приложении я извлекаю его с помощью регулярных выражений, т.е. вpython:

import subprocess, re    
cmd = 'ffmpeg -i %s' % pathtofile

p = subprocess.Popen(
    cmd.split(" "),
    stderr = subprocess.PIPE,
    close_fds=True
)
stdout, stderr = p.communicate()

reo_rotation = re.compile('rotate\s+:\s(?P<rotation>.*)')
match_rotation = reo_rotation.search(stderr)
rotation = match_rotation.groups()[0]

Я не пробовал это с широким спектром видео, только несколько .movs, записанных с iphone5, с использованием ffmpeg версии 1.0.Но пока все хорошо.

3 голосов
/ 04 марта 2014

Аналогично ответу @ HdN8, но без регулярного выражения в питоне:

$ ffprobe   -show_streams any.MOV  2>/dev/null  | grep rotate
TAG:rotate=180

Или JSON:

$ ffprobe -of json  -show_streams IMG_8738.MOV  2>/dev/null  | grep rotate
"rotate": "180",

Или вы можете проанализировать JSON (или другой выходной формат).

2 голосов
/ 29 июня 2011

Я извлек на iOS с использованием AVAssetExportSession, AVMutableComposition и предпочитаемого Transransform входного AVAssetTrack. Я объединяю предпочтительное преобразование с преобразованием, чтобы заполнить целевой размер.

После экспорта в файл я загружаю с помощью ASIHTTPRequest на свой сервер rails и отправляю данные в Amazon S3 с помощью скрепки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...