The Google Pixel 2 and probably other phones since have the capability to cover "Motion Photos". These are saved as MVIMG and comparatively big.
I’m looking for a way to remove/extract the video.
So far I found a promising exif tag
$ 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
I thought the video might be present at the specified offset, but this doesn’t work:
$ dd if=MVIMG_123.jpg of=video.mp4 bs=4032524 skip=1
$ file video.mp4
video.mp4: data
Are there any resources that document the embedding? Are there even any tools to remove/extract the video?
The above suggestion using
grep -F --byte-offset ...
anddd
does not work for me on macOS High Sierra as/usr/bin/grep
outputs a wrong offset — I guess it yields the offset of the "line" which contains the wordftypmp4
, i.e. the position of the previous LF character plus one. I might guess wrong, but anyway, this is my solution:This uses the ability of
perl
to slurp in a whole file at once and treat it as one big string. If noftypmp4
with at least four leading bytes is present, an empty file is created, if multiple are present, the last one is extracted.Similarly, to remove the video from all the files:
This uses the in-place editing feature of
perl
. Everything after the first occurrence offtypmp4
with its four leading bytes is cut off. If there are no occurrences, the file is rewritten with its contents unchanged.(One might or might not need to set PERLIO=raw in the environment and/or unset the locale related variables to avoid UTF-8 interpretation, which could fail for binary files which happen to include byte sequences that violate the UTF-8 composition rules. In my tests with various MVIMG files no such problems occurred though.)
The EXIF tag is useful, but the offset is with the respect to the end of the file. The mp4 file is embedded at:
For example:
I did find https://github.com/cliveontoast/GoMoPho which scans for the mp4 header and then dumps the video.
We can do the same, scanning for
ftypmp4
from the MP4 header (actual file starts 4 bytes earlier):Thus to extract videos:
And to remove videos: