File size: 2,903 Bytes
a92043d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import gradio as gr
from spatialmedia import metadata_utils
import os
import shutil

def console_print(message):
    print(message)

def inject_360_metadata(input_video, stereo_mode, spatial_audio, crop):
    if input_video is None:
        return None

    base_dir = "processed_videos"
    os.makedirs(base_dir, exist_ok=True)
    input_video_path = os.path.join(base_dir, "input_video.mp4")
    output_video_path = os.path.join(base_dir, "output_video.mp4")
    
    with open(input_video_path, 'wb') as f:
        f.write(input_video)

    metadata = metadata_utils.Metadata()
    metadata.video = metadata_utils.generate_spherical_xml(stereo_mode, crop)
    
    if spatial_audio:
        parsed_metadata = metadata_utils.parse_metadata(input_video_path, console_print)
        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:
                raise ValueError("Audio has %d channel(s) and isn't a supported spatial audio format." % (parsed_metadata.num_audio_channels))

    if metadata.video:
        metadata_utils.inject_metadata(input_video_path, output_video_path, metadata, console_print)
        return output_video_path
    else:
        raise ValueError("Failed to generate metadata.")

def update_output(output_file_path):
    if output_file_path and os.path.exists(output_file_path):
        return output_file_path
    else:
        return None

def main():
    with gr.Blocks(theme='JohnSmith9982/small_and_pretty') as demo:
        gr.Markdown("This space adds appropriate metadata to 360° equirectangular videos so they can be recognized as such. The audio checkbox option is only viable if your video has spatial audio in ambiX ACN/SN3D with head-locked stereo")
        with gr.Row():
            video_input = gr.File(label="Select video file", type="binary")
            stereo_dropdown = gr.Dropdown(choices=["none", "top-bottom", "left-right"], label="Stereo Mode")
            spatial_audio_checkbox = gr.Checkbox(label="Spatial Audio")
            crop_input = gr.Textbox(label="Crop Region (w:h:f_w:f_h:x:y)- Optional")
            submit_btn = gr.Button("Inject 360° Metadata")
        
        output_file = gr.File(label="Download Injected Video", type="filepath", visible=True)
        
        submit_btn.click(
            fn=inject_360_metadata,
            inputs=[video_input, stereo_dropdown, spatial_audio_checkbox, crop_input],
            outputs=output_file,
            postprocess=update_output
        )

    demo.launch(share=True)

if __name__ == "__main__":
    main()