How to extract the Photo/Video component of a MVIMG?
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:
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
And to remove videos:
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
The EXIF tag is useful, but the offset is with the respect to the end of the file. The mp4 file is embedded at:
[file_size-micro_video_offset, file_size)
For example:
$ 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]