Как извлечь информацию о ориентации из видео?
После просмотра большого количества документации в Интернете кажется, что 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 (через серверную часть командной строки)
- рубин
Любая помощь будет оценена.
Ответы
Ответ 1
Поскольку большинство камер сохраняют свою вращение/ориентацию в exif-метаданных, я бы предложил использовать exifttool
и драгоценный камень ruby wrapper называемый 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
веселит
Ответ 2
Из того, что я нашел до сих пор, ffmpeg не имеет возможности определять ориентацию iPhone. Но библиотека с открытым исходным кодом, mediainfo может. Пример командной строки:
$ mediainfo test.mp4 | grep Rotation
Rotation : 90°
Еще пример вывода из одного и того же видео iphone:
Video
ID : 1
Format : AVC
Format/Info : Advanced Video Codec
Format profile : [email protected]
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
Ответ 3
Как и для ответа @HdN8, но без регулярного выражения python:
$ 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 (или другой формат вывода).
Ответ 4
Я извлек iOS, используя AVAssetExportSession, AVMutableComposition и входную AVAssetTrack preferredTransform. Я соединяю предпочтительное преобразование с преобразованием для заполнения целевого размера.
После экспорта в файл я загружаю с помощью ASIHTTPRequest на мой сервер rails и отправляю данные на Amazon S3 с помощью paperclip.
Ответ 5
Вы можете использовать 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": [
{
}
]
}
]
Ответ 6
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]
Я havent попробовал это с широким спектром видео, только пара .movs, записанная с iphone5, с использованием ffmpeg версии 1.0. Но пока все хорошо.