Как извлечь фото / видео компонент MVIMG? - PullRequest
0 голосов
/ 01 ноября 2018

Google Pixel 2 и, возможно, другие телефоны с тех пор имеют возможность покрытия "Motion Photos" Они сохраняются как MVIMG и сравнительно большие.

Я ищу способ удалить / извлечь видео.

Пока я нашел многообещающий тег exif

$ exiftool -xmp:all MVIMG_123.jpg
XMP Toolkit                     : Adobe XMP Core 5.1.0-jc003
Micro Video                     : 1
Micro Video Version             : 1
Micro Video Offset              : 4032524

Я думал, что видео может присутствовать в указанном смещении, но это не работает:

$ dd if=MVIMG_123.jpg of=video.mp4 bs=4032524 skip=1
$ file video.mp4
video.mp4: data

Есть ли какие-либо ресурсы, которые документируют встраивание? Есть ли вообще инструменты для удаления / извлечения видео?

Ответы [ 3 ]

0 голосов
/ 01 декабря 2018

Приведенное выше предложение с использованием grep -F --byte-offset ... и dd не работает для меня в macOS High Sierra, так как /usr/bin/grep выводит неправильное смещение - я думаю, что это смещение "строки", которая содержит слово ftypmp4 , т.е. позиция предыдущего символа LF плюс один. Я могу ошибаться, но в любом случае, это мое решение:

for i in MVIMG*.jpg; do \
    perl -0777 -ne 's/^.*(....ftypmp4.*)$/$1/s && print' "$i" >"${i%.jpg}.mp4"; \
done

При этом используется perl возможность одновременно обрабатывать целый файл и рассматривать его как одну большую строку. Если нет ftypmp4 с хотя бы четырьмя старшими байтами, создается пустой файл, если присутствует несколько, извлекается последний.

Аналогично, чтобы удалить видео из всех файлов:

for i in MVIMG*.jpg; do \
    perl -0777 -pi -e 's/^(.*?)....ftypmp4.*$/$1/s' "$i"; \
done

Используется функция редактирования на месте perl. Все после первого появления ftypmp4 с четырьмя старшими байтами обрезается. Если вхождений нет, файл перезаписывается с неизменным содержимым.

(Можно или не нужно устанавливать PERLIO = raw в среде и / или сбрасывать переменные, связанные с локалью, чтобы избежать интерпретации UTF-8, что может не сработать для двоичных файлов, которые содержат последовательности байтов, которые нарушают UTF- 8. Правила составления. В моих тестах с различными файлами MVIMG таких проблем не возникало.)

0 голосов
/ 16 декабря 2018

Тег EXIF ​​полезен, но смещение относительно конца файла. Файл mp4 внедрен в:

[file_size-micro_video_offset, file_size)

Например:

$ exiftool -xmp:all MVIMG_123.jpg
XMP Toolkit                     : Adobe XMP Core 5.1.0-jc003
Micro Video                     : 1
Micro Video Version             : 1
Micro Video Offset              : 2107172
Micro Video Presentation Timestamp Us: 966280
$ python -c 'import os; print os.path.getsize("MVIMG_123.jpg") - 2107172'
3322791
$ dd if=MVIMG_123.jpg of=video.mp4 bs=3322791 skip=1
$ file video.mp4 
video.mp4: ISO Media, MP4 v2 [ISO 14496-14]
0 голосов
/ 01 ноября 2018

Я нашел https://github.com/cliveontoast/GoMoPho, который сканирует заголовок mp4, а затем выводит видео.

Мы можем сделать то же самое, сканируя для ftypmp4 из заголовка MP4 (фактический файл начинается на 4 байта раньше):

Таким образом, чтобы извлечь видео:

for i in MVIMG*.jpg; do \
  ofs=$(grep -F --byte-offset --only-matching --text ftypmp4 "$i"); \
  ofs=${ofs%:*}; \
  [[ $ofs ]] && dd "if=$i" "of=${i%.jpg}.mp4" bs=$((ofs-4)) skip=1; \
done

И для удаления видео:

for i in MVIMG*.jpg; do \
  ofs=$(grep -F --byte-offset --only-matching --text ftypmp4 "$i"); \
  ofs=${ofs%:*}; \
  [[ $ofs ]] && truncate -s $((ofs-4)) "$i"; \
done
...