def action_open(self, file_location): """Triggers open file diaglog, reading a new file's metadata.""" tmp_in_file = file_location if not tmp_in_file: return self.in_file = tmp_in_file print("Current 360 video: %s" % ntpath.basename(self.in_file)) console = Console() parsed_metadata = metadata_utils.parse_metadata( self.in_file, console.append) metadata = None audio_metadata = None if parsed_metadata: metadata = parsed_metadata.video audio_metadata = parsed_metadata.audio for line in console.log: if "Error" in line: print("Failed to load file %s" % ntpath.basename(self.in_file)) self.var_spherical = False self.var_spatial_audio = False return if audio_metadata: print(audio_metadata.get_metadata_string())
def action_open(self): """Triggers open file diaglog, reading a new file's metadata.""" tmp_in_file = tkFileDialog.askopenfilename(**self.open_options) if not tmp_in_file: return self.in_file = tmp_in_file self.set_message("Opened file: %s\n" % ntpath.basename(self.in_file)) console = Console() parsed_metadata = metadata_utils.parse_metadata(self.in_file, console.append) metadata = None audio_metadata = None if parsed_metadata: metadata = parsed_metadata.video audio_metadata = parsed_metadata.audio for line in console.log: if "Error" in line: self.set_error("Failed to load file %s" % ntpath.basename(self.in_file)) self.var_spherical.set(0) self.var_spatial_audio.set(0) self.disable_state() self.button_open.configure(state="normal") self.button_quit.configure(state="normal") return self.enable_state() self.checkbox_spherical.configure(state="normal") infile = os.path.abspath(self.in_file) file_extension = os.path.splitext(infile)[1].lower() self.enable_spatial_audio =\ True if (file_extension == ".mp4") else False if not metadata: self.var_spherical.set(0) self.var_3d.set(0) if not audio_metadata: self.var_spatial_audio.set(0) if metadata: metadata = metadata.itervalues().next() self.var_spherical.set(1) if metadata.get("Spherical", "") == "true": self.var_spherical.set(1) else: self.var_spherical.set(0) if metadata.get("StereoMode", "") == "top-bottom": self.var_3d.set(1) else: self.var_3d.set(0) if audio_metadata: self.var_spatial_audio.set(1) self.options_ambisonics["text"] =\ audio_metadata.get_metadata_string() self.update_state()
def main(): """Main function for printing and injecting spatial media metadata.""" parser = argparse.ArgumentParser( usage= "%(prog)s [options] [files...]\n\nBy default prints out spatial media " "metadata from specified files.") parser.add_argument( "-i", "--inject", action="store_true", help= "injects spatial media metadata into the first file specified (.mp4 or " ".mov) and saves the result to the second file specified") parser.add_argument( "-b", "--show-atoms", action="store_true", help= "Displays the atom layout for the movie. Note the MOV/MP4 format is not self-parsable" "e.g. there is no way to know the containts of a container atom without documentation." ) video_group = parser.add_argument_group("Spherical Video") video_group.add_argument( "-s", "--stereo", action="store", dest="stereo_mode", metavar="STEREO-MODE", choices=["none", "top-bottom", "left-right", "custom"], default=None, help="stereo mode (none | top-bottom | left-right | custom)") video_group.add_argument( "-m", "--projection", action="store", dest="projection", metavar="SPHERICAL-MODE", choices=[ "equirectangular", "cubemap", "mesh", "full-frame", "equi-mesh" ], default=None, help= "projection (equirectangular | cubemap | mesh | full-frame | equi-mesh)" ) video_group.add_argument("-y", "--yaw", action="store", dest="yaw", metavar="YAW", default=0, help="yaw") video_group.add_argument("-p", "--pitch", action="store", dest="pitch", metavar="PITCH", default=0, help="pitch") video_group.add_argument("-r", "--roll", action="store", dest="roll", metavar="ROLL", default=0, help="roll") video_group.add_argument("-d", "--degrees", action="store", dest="degrees", metavar="DEGREES", choices=["180", "360"], default=180, help="degrees") video_group.add_argument( "-c", "--correction", action="store", dest="fisheye_correction", metavar="FISHEYE-CORRECTION", default="0:0:0:0", help= "polynomial fisheye lens correction (n1:n2:n3:n4) e.g 0.5:-0.1:0.2:-0.0005" ) video_group.add_argument( "-v", "--view", action="store", dest="field_of_view", metavar="FIELD-OF-VIEW", default="0x0", help="Field of view for equi_mesh or full frame. e.g. 180x180 or 16x9") video_group.add_argument( "-1", "--force_v1_360_equi_metadata", action="store_true", help="Add v1 metadata as well as v2 metadata to the video." "This is only really valid for 360 equirectangular videos, but some video players only enable VR if they recognise v1 metadata" ) audio_group = parser.add_argument_group("Spatial Audio") audio_group.add_argument( "-a", "--spatial-audio", action="store_true", help="spatial audio. First-order periphonic ambisonics with ACN channel " "ordering and SN3D normalization") parser.add_argument("file", nargs="+", help="input/output files") args = parser.parse_args() if args.inject: if len(args.file) != 2: console( "Injecting metadata requires both an input file and output file." ) return metadata = metadata_utils.Metadata() if args.stereo_mode: metadata.stereo = args.stereo_mode if args.projection: metadata.spherical = args.projection if metadata.spherical == "equirectangular": metadata.clip_left_right = 0 if args.degrees == "360" else 1073741823 if args.spatial_audio: parsed_metadata = metadata_utils.parse_metadata( args.file[0], console) if not metadata.audio: spatial_audio_description = metadata_utils.get_spatial_audio_description( parsed_metadata.num_audio_channels) if spatial_audio_description.is_supported: metadata.audio = metadata_utils.get_spatial_audio_metadata( spatial_audio_description.order, spatial_audio_description.has_head_locked_stereo) else: console("Audio has %d channel(s) and is not a supported " "spatial audio format." % (parsed_metadata.num_audio_channels)) return if args.fisheye_correction: metadata.fisheye_correction = [ float(x) for x in args.fisheye_correction.split(':') ] if args.field_of_view: metadata.fov = [float(x) for x in args.field_of_view.split('x')] if metadata.fov[0] == 0 or metadata.fov[1] == 0: if args.projection == "full-frame": metadata.fov[0] = 16.0 metadata.fov[1] = 9.0 else: metadata.fov[0] = 180 metadata.fov[1] = 180 if args.force_v1_360_equi_metadata: console("generating metadata.") metadata.v1_xml = metadata_utils.generate_spherical_xml( args.stereo_mode) console(metadata.v1_xml) if metadata.stereo or metadata.spherical or metadata.audio: metadata.orientation = { "yaw": args.yaw, "pitch": args.pitch, "roll": args.roll } metadata_utils.inject_metadata(args.file[0], args.file[1], metadata, console, args.force_v1_360_equi_metadata) else: console("Failed to generate metadata.") return if len(args.file) > 0: for input_file in args.file: if args.spatial_audio: parsed_metadata = metadata_utils.parse_metadata( input_file, console) metadata.audio = metadata_utils.get_spatial_audio_description( parsed_metadata.num_channels) metadata_utils.parse_metadata(input_file, console) metadata_utils.show_atoms(input_file, console) return parser.print_help() return
def main(): """Main function for printing and injecting spatial media metadata.""" parser = argparse.ArgumentParser( usage= "%(prog)s [options] [files...]\n\nBy default prints out spatial media " "metadata from specified files.") parser.add_argument( "-i", "--inject", action="store_true", help= "injects spatial media metadata into the first file specified (.mp4 or " ".mov) and saves the result to the second file specified") video_group = parser.add_argument_group("Spherical Video") video_group.add_argument( "-s", "--stereo", action="store", dest="stereo_mode", metavar="STEREO-MODE", choices=["none", "top-bottom", "left-right"], default=None, help="stereo mode (none | top-bottom | left-right)") video_group.add_argument("-m", "--projection", action="store", dest="projection", metavar="SPHERICAL-MODE", choices=["equirectangular", "cubemap"], default=None, help="projection (equirectangular | cubemap)") video_group.add_argument("-y", "--yaw", action="store", dest="yaw", metavar="YAW", default=0, help="yaw") video_group.add_argument("-p", "--pitch", action="store", dest="pitch", metavar="PITCH", default=0, help="pitch") video_group.add_argument("-r", "--roll", action="store", dest="roll", metavar="ROLL", default=0, help="roll") video_group.add_argument("-d", "--degrees", action="store", dest="degrees", metavar="DEGREES", choices=["180", "360"], default=180, help="degrees") audio_group = parser.add_argument_group("Spatial Audio") audio_group.add_argument( "-a", "--spatial-audio", action="store_true", help="spatial audio. First-order periphonic ambisonics with ACN channel " "ordering and SN3D normalization") parser.add_argument("file", nargs="+", help="input/output files") args = parser.parse_args() if args.inject: if len(args.file) != 2: console( "Injecting metadata requires both an input file and output file." ) return metadata = metadata_utils.Metadata() if args.stereo_mode: metadata.stereo = args.stereo_mode if args.projection: metadata.spherical = args.projection if metadata.spherical == "equirectangular": metadata.clip_left_right = 0 if args.degrees == "360" else 1073741823 if args.spatial_audio: metadata.audio = metadata_utils.SPATIAL_AUDIO_DEFAULT_METADATA if metadata.stereo or metadata.spherical or metadata.audio: metadata.orientation = { "yaw": args.yaw, "pitch": args.pitch, "roll": args.roll } metadata_utils.inject_metadata(args.file[0], args.file[1], metadata, console) else: console("Failed to generate metadata.") return if len(args.file) > 0: for input_file in args.file: metadata_utils.parse_metadata(input_file, console) return parser.print_help() return
def action_open(self): """Triggers open file diaglog, reading a new file's metadata.""" tmp_in_file = tkFileDialog.askopenfilename(**self.open_options) if not tmp_in_file: return self.in_file = tmp_in_file self.set_message("Current 360 video: %s" % ntpath.basename(self.in_file)) console = Console() parsed_metadata = metadata_utils.parse_metadata(self.in_file, console.append) metadata = None audio_metadata = None if parsed_metadata: metadata = parsed_metadata.video audio_metadata = parsed_metadata.audio stereo = parsed_metadata.stereo for line in console.log: if "Error" in line: self.set_error("Failed to load file %s" % ntpath.basename(self.in_file)) self.disable_state() self.button_open.configure(state="normal") return self.enable_state() # self.checkbox_spherical.configure(state="normal") infile = os.path.abspath(self.in_file) file_extension = os.path.splitext(infile)[1].lower() # self.var_spherical.set(1) self.enable_spatial_audio = parsed_metadata.num_audio_channels == 4 if not metadata: # self.var_3d.set(0) self.char_degrees.set("180") self.char_layout.set("left-right") if not audio_metadata: self.var_spatial_audio.set(0) if metadata: # metadata here is an dict with a sv3d box metadata = metadata.values()[0] if metadata.clip_left_right > 0 or metadata.projection == "mesh": self.char_degrees.set("180") else: self.char_degrees.set("360") if metadata.projection == "mesh": self.char_format.set("fisheye") elif metadata.projection == "equirectangular": self.char_format.set("equi-rectangular") else: self.char_format.set(metadata.projection) """if metadata.get("Spherical", "") == "true": self.var_spherical.set(1) else: self.var_spherical.set(0) if metadata.get("StereoMode", "") == "top-bottom": self.var_3d.set(1) else: self.var_3d.set(0) """ if stereo: stereo = stereo.values()[0] self.char_layout.set(stereo.stereo_mode_name()); if audio_metadata: self.var_spatial_audio.set(1) print (audio_metadata.get_metadata_string()) self.update_state()
def action_open(self): """Triggers open file diaglog, reading a new file's metadata.""" tmp_in_file = tkFileDialog.askopenfilename(**self.open_options) if not tmp_in_file: return self.in_file = tmp_in_file self.set_message("Current 360 video: %s" % ntpath.basename(self.in_file)) console = Console() parsed_metadata = metadata_utils.parse_metadata( self.in_file, console.append) metadata = None audio_metadata = None if parsed_metadata: metadata = parsed_metadata.video audio_metadata = parsed_metadata.audio for line in console.log: if "Error" in line: self.set_error("Failed to load file %s" % ntpath.basename(self.in_file)) self.var_spherical.set(0) self.var_spatial_audio.set(0) self.disable_state() self.button_open.configure(state="normal") return self.enable_state() self.checkbox_spherical.configure(state="normal") infile = os.path.abspath(self.in_file) file_extension = os.path.splitext(infile)[1].lower() self.var_spherical.set(1) self.enable_spatial_audio = parsed_metadata.num_audio_channels == 4 if not metadata: self.var_3d.set(0) if not audio_metadata: self.var_spatial_audio.set(0) if metadata: metadata = metadata.itervalues().next() if metadata.get("Spherical", "") == "true": self.var_spherical.set(1) else: self.var_spherical.set(0) if metadata.get("StereoMode", "") == "top-bottom": self.var_3d.set(1) else: self.var_3d.set(0) if audio_metadata: self.var_spatial_audio.set(1) print(audio_metadata.get_metadata_string()) self.update_state()
def main(): """Main function for printing and injecting spatial media metadata.""" parser = argparse.ArgumentParser( usage= "%(prog)s [options] [files...]\n\nBy default prints out spatial media " "metadata from specified files.") parser.add_argument( "-i", "--inject", action="store_true", help= "injects spatial media metadata into the first file specified (.mp4 or " ".mov) and saves the result to the second file specified") video_group = parser.add_argument_group("Spherical Video") video_group.add_argument( "-s", "--stereo", action="store", dest="stereo_mode", metavar="STEREO-MODE", choices=["none", "top-bottom", "left-right"], default="none", help="stereo mode (none | top-bottom | left-right)") video_group.add_argument( "-c", "--crop", action="store", default=None, help= "crop region. Must specify 6 integers in the form of \"w:h:f_w:f_h:x:y\"" " where w=CroppedAreaImageWidthPixels h=CroppedAreaImageHeightPixels " "f_w=FullPanoWidthPixels f_h=FullPanoHeightPixels " "x=CroppedAreaLeftPixels y=CroppedAreaTopPixels") audio_group = parser.add_argument_group("Spatial Audio") audio_group.add_argument( "-a", "--spatial-audio", action="store_true", help="spatial audio. First-order periphonic ambisonics with ACN channel " "ordering and SN3D normalization") parser.add_argument("file", nargs="+", help="input/output files") args = parser.parse_args() if args.inject: if len(args.file) != 2: console( "Injecting metadata requires both an input file and output file." ) return metadata = metadata_utils.Metadata() metadata.video = metadata_utils.generate_spherical_xml( args.stereo_mode, args.crop) if args.spatial_audio: metadata.audio = metadata_utils.SPATIAL_AUDIO_DEFAULT_METADATA if metadata.video: metadata_utils.inject_metadata(args.file[0], args.file[1], metadata, console) else: console("Failed to generate metadata.") return if len(args.file) > 0: for input_file in args.file: metadata_utils.parse_metadata(input_file, console) return parser.print_help() return
def main(): """Main function for printing and injecting spatial media metadata.""" parser = argparse.ArgumentParser( usage= "%(prog)s [options] [files...]\n\nBy default prints out spatial media " "metadata from specified files.") parser.add_argument( "-i", "--inject", action="store_true", help= "injects spatial media metadata into the first file specified (.mp4 or " ".mov) and saves the result to the second file specified") video_group = parser.add_argument_group("Spherical Video") video_group.add_argument( "-s", "--stereo", action="store", dest="stereo_mode", metavar="STEREO-MODE", choices=["none", "top-bottom", "left-right", "custom"], default=None, help="stereo mode (none | top-bottom | left-right | custom)") video_group.add_argument( "-m", "--projection", action="store", dest="projection", metavar="SPHERICAL-MODE", choices=[ "equirectangular", "cubemap", "mesh", "full-frame", "equi-mesh" ], default=None, help= "projection (equirectangular | cubemap | mesh | full-frame | equi-mesh)" ) video_group.add_argument("-y", "--yaw", action="store", dest="yaw", metavar="YAW", default=0, help="yaw") video_group.add_argument("-p", "--pitch", action="store", dest="pitch", metavar="PITCH", default=0, help="pitch") video_group.add_argument("-r", "--roll", action="store", dest="roll", metavar="ROLL", default=0, help="roll") video_group.add_argument("-d", "--degrees", action="store", dest="degrees", metavar="DEGREES", choices=["180", "360"], default=180, help="degrees") video_group.add_argument( "-c", "--correction", action="store", dest="fisheye_correction", metavar="FISHEYE-CORRECTION", default="0:0:0:0", help= "polynomial fisheye lens correction (n1:n2:n3:n4) e.g 0.5:-0.1:0.2:-0.0005" ) video_group.add_argument( "-v", "--view", action="store", dest="field_of_view", metavar="FIELD-OF-VIEW", default="0x0", help="Field of view for equi_mesh or full frame. e.g. 180x180 or 16x9") audio_group = parser.add_argument_group("Spatial Audio") audio_group.add_argument( "-a", "--spatial-audio", action="store_true", help="spatial audio. First-order periphonic ambisonics with ACN channel " "ordering and SN3D normalization") parser.add_argument("file", nargs="+", help="input/output files") args = parser.parse_args() if args.inject: if len(args.file) != 2: console( "Injecting metadata requires both an input file and output file." ) return metadata = metadata_utils.Metadata() if args.stereo_mode: metadata.stereo = args.stereo_mode if args.projection: metadata.spherical = args.projection if metadata.spherical == "equirectangular": metdaadata.clip_left_right = 0 if args.degrees == "360" else 1073741823 if args.spatial_audio: metadata.audio = metadata_utils.SPATIAL_AUDIO_DEFAULT_METADATA if args.fisheye_correction: metadata.fisheye_correction = [ float(x) for x in args.fisheye_correction.split(':') ] if args.field_of_view: metadata.fov = [float(x) for x in args.field_of_view.split('x')] if metadata.fov[0] == 0 or metadata.fov[1] == 0: if args.projection == "full-frame": metadata.fov[0] = 16.0 metadata.fov[1] = 9.0 else: metadata.fov[0] = 180 metadata.fov[1] = 180 if metadata.stereo or metadata.spherical or metadata.audio: metadata.orientation = { "yaw": args.yaw, "pitch": args.pitch, "roll": args.roll } metadata_utils.inject_metadata(args.file[0], args.file[1], metadata, console) else: console("Failed to generate metadata.") return if len(args.file) > 0: for input_file in args.file: metadata_utils.parse_metadata(input_file, console) return parser.print_help() return
def main(): """Main function for printing and injecting spatial media metadata.""" parser = argparse.ArgumentParser( usage= "%(prog)s [options] [files...]\n\nBy default prints out spatial media " "metadata from specified files.") parser.add_argument( "-i", "--inject", action="store_true", help= "injects spatial media metadata into the first file specified (.mp4 or " ".mov) and saves the result to the second file specified") video_group = parser.add_argument_group("Spherical Video") video_group.add_argument("-s", "--stereo", action="store", dest="stereo_mode", metavar="STEREO-MODE", choices=["none", "top-bottom", "left-right"], default="none", help="stereo mode (none | top-bottom | left-right)") video_group.add_argument( "-c", "--crop", action="store", default=None, help= "crop region. Must specify 6 integers in the form of \"w:h:f_w:f_h:x:y\"" " where w=CroppedAreaImageWidthPixels h=CroppedAreaImageHeightPixels " "f_w=FullPanoWidthPixels f_h=FullPanoHeightPixels " "x=CroppedAreaLeftPixels y=CroppedAreaTopPixels") audio_group = parser.add_argument_group("Spatial Audio") audio_group.add_argument( "-a", "--spatial-audio", action="store_true", help= "spatial audio. First-order periphonic ambisonics with ACN channel " "ordering and SN3D normalization") parser.add_argument("file", nargs="+", help="input/output files") args = parser.parse_args() if args.inject: if len(args.file) != 2: console("Injecting metadata requires both an input file and output file.") return metadata = metadata_utils.Metadata() metadata.video = metadata_utils.generate_spherical_xml(args.stereo_mode, args.crop) if args.spatial_audio: metadata.audio = metadata_utils.SPATIAL_AUDIO_DEFAULT_METADATA if metadata.video: metadata_utils.inject_metadata(args.file[0], args.file[1], metadata, console) else: console("Failed to generate metadata.") return if len(args.file) > 0: for input_file in args.file: metadata_utils.parse_metadata(input_file, console) return parser.print_help() return