I'm working on a library that injects/embeds/writes metadata into a .mp4 file to allow the video to be displayed correctly as a 360 video. The input file is a standard .mp4 file in the equirectangular format which I need to inject the proper metadata to get it to display as a 360 video. I know tools like Google's Spatial Media Tool exist but if possible I would like to do it with FFmpeg.

The metadata injected by the Spatial Media tool looks like this and is what I am trying to achieve:

<?xml version="1.0"?><rdf:SphericalVideo
xmlns:GSpherical="http://ns.google.com/videos/1.0/spherical/"><GSpherical:Spherical>true</GSpherical:Spherical><GSpherical:Stitched>true</GSpherical:Stitched><GSpherical:StitchingSoftware>Spherical Metadata Tool</GSpherical:StitchingSoftware><GSpherical:ProjectionType>equirectangular</GSpherical:ProjectionType></rdf:SphericalVideo>

These are all the things I have tried which did not work:

Method 1

ffmpeg -i input.mp4 -movflags use_metadata_tags -metadata Spherical=true -metadata Stitched=true -metadata ProjectionType=equirectangular -metadata StitchingSoftware=StreetviewJourney -codec copy output.mp4

I have tried many variations of it like adding GSpherical: and xmp: to the metadata tag.

Method 2

When I extract the metadata using ffmpeg it contains the spherical tag in the logs but not when I output it to a ffmetadata file. This was the command I used: ffmpeg -i injected.mp4 -map_metadata -1 -f ffmetadata data.txt

This is the output of the log:

 fps, 60 tbr, 15360 tbn, 120 tbc (default)
      handler_name    : VideoHandler
    Side data:
      spherical: equirectangular (0.000000/0.000000/0.000000)

Method 3

I also tried to get the metadata using this command: ffprobe -v error -select_streams v:0 -show_streams -of default=noprint_wrappers=1 injected.mp4

This was the logs it outputted:

side_data_type=Spherical Mapping

I then tried to use this command but it didn't work:

ffmpeg -i chapmanspeak.mp4 -movflags use_metadata_tags -metadata side_metadata_type="Spherical Mapping" -metadata projection=equirectangular -metadata yaw=0 -metadata pitch=0 -metadata roll=0 -codec copy output.mp4

Metadata is not the same as frame side data. FFmpeg tool currently cannot do this, you need to program own thing using available API.

| improve this answer | |
  • What C# API can do this? – TrueCP5 Aug 21 '19 at 12:42
  • FFmpeg is written in C, not C#. – Paul B. Mahol Aug 22 '19 at 7:48
  • Of course but you can use FFmpeg in almost any language with a wrapper. But that doesn't answer my question. – TrueCP5 Aug 22 '19 at 8:00
  • Something like this, but note that that may not be really enough at all as relevant stuff in muxer is not implemented by FFmpeg at all: ffmpeg.org/doxygen/3.3/group__lavu__video__spherical.html – Paul B. Mahol Aug 22 '19 at 9:26

you can try something like this if you just want to transcode instead of writing metadata freshly into the file

sudo ffmpeg -i 360video.MP4 -vcodec libx264 -strict unofficial -vprofile high  -acodec aac -f mp4  another.mp4
| improve this answer | |
  • there is no reason to use sudo here. – polemon Jul 20 at 8:33

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.