* 2024-05-25 ** 13:30 Aerial spincity Step 3 : Réponse du master.json : - vidéo : plusieurs format de qualité disponible (différents width et height) et plusieurs segment pour chaque - audio : 1 seul format, plusieurs segments #+begin_src json { "clip_id": "f4f7374a-e8fb-4d45-a20b-a00e159df3c7", "base_url": "../", "video": [ { "id": "3a1c3cf2", "avg_id": "", "base_url": "3a1c3cf2/chop/", "format": "mp42", "mime_type": "video/mp4", "codecs": "avc1.640020", "bitrate": 522000, "avg_bitrate": 464000, "duration": 61.68, "framerate": 25, "width": 1280, "height": 720, "max_segment_duration": 7, "init_segment": "AAAAHGZ0eXBpc281AAACAGlzbzVpc282bXA0MQAAAyttb292AAAAbG12aGQAAAAAAAAAAAAAAAAAAAPoAAAAAAABAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACLXRyYWsAAABcdGtoZAAAAAMAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAFAAAAAtAAAAAAACRlZHRzAAAAHGVsc3QAAAAAAAAAAQAAAAAAAAQAAAEAAAAAAaVtZGlhAAAAIG1kaGQAAAAAAAAAAAAAAAAAADIAAAAAAFXEAAAAAAAtaGRscgAAAAAAAAAAdmlkZQAAAAAAAAAAAAAAAFZpZGVvSGFuZGxlcgAAAAFQbWluZgAAABR2bWhkAAAAAQAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybCAAAAABAAABEHN0YmwAAADEc3RzZAAAAAAAAAABAAAAtGF2YzEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAFAALQAEgAAABIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY//8AAAA3YXZjQwFkACD/4QAbZ2QAIKzZgFAFumoCAgKAAAADAIAAABkHjBjNAQAFaOl7LIv9+PgAAAAAE2NvbHJuY2x4AAEAAQABAAAAABRidHJ0AAAAAAAHCQwABwkMAAAAEHN0dHMAAAAAAAAAAAAAABBzdHNjAAAAAAAAAAAAAAAUc3RzegAAAAAAAAAAAAAAAAAAABBzdGNvAAAAAAAAAAAAAAAobXZleAAAACB0cmV4AAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAYnVkdGEAAABabWV0YQAAAAAAAAAhaGRscgAAAAAAAAAAbWRpcmFwcGwAAAAAAAAAAAAAAAAtaWxzdAAAACWpdG9vAAAAHWRhdGEAAAABAAAAAExhdmY2MC4xNC4xMDA=", "segments": [ { "start": 0, "end": 6.08, "url": "segment-1.m4s?r=dXM%3D", "size": 342561 }, { "start": 6.08, "end": 12.16, "url": "segment-2.m4s?r=dXM%3D", "size": 252435 }, { "start": 12.16, "end": 18.24, "url": "segment-3.m4s?r=dXM%3D", "size": 282162 }, { "start": 18.24, "end": 24.32, "url": "segment-4.m4s?r=dXM%3D", "size": 368524 }, { "start": 24.32, "end": 30.4, "url": "segment-5.m4s?r=dXM%3D", "size": 325848 }, { "start": 30.4, "end": 36.48, "url": "segment-6.m4s?r=dXM%3D", "size": 356835 }, { "start": 36.48, "end": 42.56, "url": "segment-7.m4s?r=dXM%3D", "size": 410271 }, { "start": 42.56, "end": 48.64, "url": "segment-8.m4s?r=dXM%3D", "size": 316171 }, { "start": 48.64, "end": 54.72, "url": "segment-9.m4s?r=dXM%3D", "size": 434367 }, { "start": 54.72, "end": 61.68, "url": "segment-10.m4s?r=dXM%3D", "size": 504195 } ] }, { "id": "66c64221", "avg_id": "", "base_url": "66c64221/chop/", "format": "mp42", "mime_type": "video/mp4", "codecs": "avc1.64001F", "bitrate": 330000, "avg_bitrate": 288000, "duration": 61.68, "framerate": 25, "width": 960, "height": 540, "max_segment_duration": 7, "init_segment": "AAAAHGZ0eXBpc281AAACAGlzbzVpc282bXA0MQAAAy5tb292AAAAbG12aGQAAAAAAAAAAAAAAAAAAAPoAAAAAAABAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACMHRyYWsAAABcdGtoZAAAAAMAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAADwAAAAhwAAAAAACRlZHRzAAAAHGVsc3QAAAAAAAAAAQAAAAAAAAQAAAEAAAAAAahtZGlhAAAAIG1kaGQAAAAAAAAAAAAAAAAAADIAAAAAAFXEAAAAAAAtaGRscgAAAAAAAAAAdmlkZQAAAAAAAAAAAAAAAFZpZGVvSGFuZGxlcgAAAAFTbWluZgAAABR2bWhkAAAAAQAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybCAAAAABAAABE3N0YmwAAADHc3RzZAAAAAAAAAABAAAAt2F2YzEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAADwAIcAEgAAABIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY//8AAAA6YXZjQwFkAB//4QAdZ2QAH6xWJA8BF+5qDAwMgAAAAwCAAAAZB4wYxMABAAZo6I7LIsD9+PgAAAAAE2NvbHJuY2x4AAYABgAGAAAAABRidHJ0AAAAAAAEV24ABFduAAAAEHN0dHMAAAAAAAAAAAAAABBzdHNjAAAAAAAAAAAAAAAUc3RzegAAAAAAAAAAAAAAAAAAABBzdGNvAAAAAAAAAAAAAAAobXZleAAAACB0cmV4AAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAYnVkdGEAAABabWV0YQAAAAAAAAAhaGRscgAAAAAAAAAAbWRpcmFwcGwAAAAAAAAAAAAAAAAtaWxzdAAAACWpdG9vAAAAHWRhdGEAAAABAAAAAExhdmY2MC4xNC4xMDA=", "segments": [ { "start": 0, "end": 6.08, "url": "segment-1.m4s?r=dXM%3D", "size": 223095 }, { "start": 6.08, "end": 12.16, "url": "segment-2.m4s?r=dXM%3D", "size": 185250 }, { "start": 12.16, "end": 18.24, "url": "segment-3.m4s?r=dXM%3D", "size": 196287 }, { "start": 18.24, "end": 24.32, "url": "segment-4.m4s?r=dXM%3D", "size": 219609 }, { "start": 24.32, "end": 30.4, "url": "segment-5.m4s?r=dXM%3D", "size": 186746 }, { "start": 30.4, "end": 36.48, "url": "segment-6.m4s?r=dXM%3D", "size": 193337 }, { "start": 36.48, "end": 42.56, "url": "segment-7.m4s?r=dXM%3D", "size": 232346 }, { "start": 42.56, "end": 48.64, "url": "segment-8.m4s?r=dXM%3D", "size": 177085 }, { "start": 48.64, "end": 54.72, "url": "segment-9.m4s?r=dXM%3D", "size": 275456 }, { "start": 54.72, "end": 61.68, "url": "segment-10.m4s?r=dXM%3D", "size": 343015 } ] }, { "id": "d935b08f", "avg_id": "", "base_url": "d935b08f/chop/", "format": "mp42", "mime_type": "video/mp4", "codecs": "avc1.64001E", "bitrate": 192000, "avg_bitrate": 159000, "duration": 61.68, "framerate": 25, "width": 640, "height": 360, "max_segment_duration": 7, "init_segment": "AAAAHGZ0eXBpc281AAACAGlzbzVpc282bXA0MQAAAy1tb292AAAAbG12aGQAAAAAAAAAAAAAAAAAAAPoAAAAAAABAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACL3RyYWsAAABcdGtoZAAAAAMAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAACgAAAAWgAAAAAACRlZHRzAAAAHGVsc3QAAAAAAAAAAQAAAAAAAAQAAAEAAAAAAadtZGlhAAAAIG1kaGQAAAAAAAAAAAAAAAAAADIAAAAAAFXEAAAAAAAtaGRscgAAAAAAAAAAdmlkZQAAAAAAAAAAAAAAAFZpZGVvSGFuZGxlcgAAAAFSbWluZgAAABR2bWhkAAAAAQAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybCAAAAABAAABEnN0YmwAAADGc3RzZAAAAAAAAAABAAAAtmF2YzEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAACgAFoAEgAAABIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY//8AAAA5YXZjQwFkAB7/4QAdZ2QAHqzZQKAv+WagwMDIAAADAAgAAAMBkHixbLABAAVo6+yyLP34+AAAAAATY29scm5jbHgABgAGAAYAAAAAFGJ0cnQAAAAAAAJepQACXqUAAAAQc3R0cwAAAAAAAAAAAAAAEHN0c2MAAAAAAAAAAAAAABRzdHN6AAAAAAAAAAAAAAAAAAAAEHN0Y28AAAAAAAAAAAAAAChtdmV4AAAAIHRyZXgAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAABidWR0YQAAAFptZXRhAAAAAAAAACFoZGxyAAAAAAAAAABtZGlyYXBwbAAAAAAAAAAAAAAAAC1pbHN0AAAAJal0b28AAAAdZGF0YQAAAAEAAAAATGF2ZjYwLjE0LjEwMA==", "segments": [ { "start": 0, "end": 6.08, "url": "segment-1.m4s?r=dXM%3D", "size": 128004 }, { "start": 6.08, "end": 12.16, "url": "segment-2.m4s?r=dXM%3D", "size": 100161 }, { "start": 12.16, "end": 18.24, "url": "segment-3.m4s?r=dXM%3D", "size": 106016 }, { "start": 18.24, "end": 24.32, "url": "segment-4.m4s?r=dXM%3D", "size": 115763 }, { "start": 24.32, "end": 30.4, "url": "segment-5.m4s?r=dXM%3D", "size": 97812 }, { "start": 30.4, "end": 36.48, "url": "segment-6.m4s?r=dXM%3D", "size": 103428 }, { "start": 36.48, "end": 42.56, "url": "segment-7.m4s?r=dXM%3D", "size": 119141 }, { "start": 42.56, "end": 48.64, "url": "segment-8.m4s?r=dXM%3D", "size": 91711 }, { "start": 48.64, "end": 54.72, "url": "segment-9.m4s?r=dXM%3D", "size": 156183 }, { "start": 54.72, "end": 61.68, "url": "segment-10.m4s?r=dXM%3D", "size": 217687 } ] }, { "id": "f9e1a649", "avg_id": "", "base_url": "f9e1a649/chop/", "format": "mp42", "mime_type": "video/mp4", "codecs": "avc1.640028", "bitrate": 1659000, "avg_bitrate": 1259000, "duration": 61.68, "framerate": 25, "width": 1920, "height": 1080, "max_segment_duration": 7, "init_segment": "AAAAHGZ0eXBpc281AAACAGlzbzVpc282bXA0MQAAAy1tb292AAAAbG12aGQAAAAAAAAAAAAAAAAAAAPoAAAAAAABAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACL3RyYWsAAABcdGtoZAAAAAMAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAHgAAABDgAAAAAACRlZHRzAAAAHGVsc3QAAAAAAAAAAQAAAAAAAAQAAAEAAAAAAadtZGlhAAAAIG1kaGQAAAAAAAAAAAAAAAAAADIAAAAAAFXEAAAAAAAtaGRscgAAAAAAAAAAdmlkZQAAAAAAAAAAAAAAAFZpZGVvSGFuZGxlcgAAAAFSbWluZgAAABR2bWhkAAAAAQAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybCAAAAABAAABEnN0YmwAAADGc3RzZAAAAAAAAAABAAAAtmF2YzEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAHgAQ4AEgAAABIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY//8AAAA5YXZjQwFkACj/4QAdZ2QAKKzZgHgCJ+WagICAoAAAAwAgAAAGQeMGM0ABAAVo6Xssi/34+AAAAAATY29scm5jbHgAAQABAAEAAAAAFGJ0cnQAAAAAABMU2QATFNkAAAAQc3R0cwAAAAAAAAAAAAAAEHN0c2MAAAAAAAAAAAAAABRzdHN6AAAAAAAAAAAAAAAAAAAAEHN0Y28AAAAAAAAAAAAAAChtdmV4AAAAIHRyZXgAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAABidWR0YQAAAFptZXRhAAAAAAAAACFoZGxyAAAAAAAAAABtZGlyYXBwbAAAAAAAAAAAAAAAAC1pbHN0AAAAJal0b28AAAAdZGF0YQAAAAEAAAAATGF2ZjYwLjE0LjEwMA==", "segments": [ { "start": 0, "end": 6.08, "url": "segment-1.m4s?r=dXM%3D", "size": 588275 }, { "start": 6.08, "end": 12.16, "url": "segment-2.m4s?r=dXM%3D", "size": 379804 }, { "start": 12.16, "end": 18.24, "url": "segment-3.m4s?r=dXM%3D", "size": 457445 }, { "start": 18.24, "end": 24.32, "url": "segment-4.m4s?r=dXM%3D", "size": 1234896 }, { "start": 24.32, "end": 30.4, "url": "segment-5.m4s?r=dXM%3D", "size": 1157323 }, { "start": 30.4, "end": 36.48, "url": "segment-6.m4s?r=dXM%3D", "size": 1260831 }, { "start": 36.48, "end": 42.56, "url": "segment-7.m4s?r=dXM%3D", "size": 1365076 }, { "start": 42.56, "end": 48.64, "url": "segment-8.m4s?r=dXM%3D", "size": 1136642 }, { "start": 48.64, "end": 54.72, "url": "segment-9.m4s?r=dXM%3D", "size": 1241404 }, { "start": 54.72, "end": 61.68, "url": "segment-10.m4s?r=dXM%3D", "size": 858353 } ] } ], "audio": [ { "id": "3a1c3cf2", "avg_id": "", "base_url": "../audio/3a1c3cf2/chop/", "format": "mp42", "mime_type": "audio/mp4", "codecs": "mp4a.40.2", "bitrate": 139000, "avg_bitrate": 139000, "duration": 61.696, "channels": 2, "sample_rate": 48000, "max_segment_duration": 7, "init_segment": "AAAAHGZ0eXBpc281AAACAGlzbzVpc282bXA0MQAAAt5tb292AAAAbG12aGQAAAAAAAAAAAAAAAAAAAPoAAAAAAABAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAB4HRyYWsAAABcdGtoZAAAAAMAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAACRlZHRzAAAAHGVsc3QAAAAAAAAAAQAAAAAAAAAAAAEAAAAAAVhtZGlhAAAAIG1kaGQAAAAAAAAAAAAAAAAAALuAAAAAAFXEAAAAAAAtaGRscgAAAAAAAAAAc291bgAAAAAAAAAAAAAAAFNvdW5kSGFuZGxlcgAAAAEDbWluZgAAABBzbWhkAAAAAAAAAAAAAAAkZGluZgAAABxkcmVmAAAAAAAAAAEAAAAMdXJsIAAAAAEAAADHc3RibAAAAHtzdHNkAAAAAAAAAAEAAABrbXA0YQAAAAAAAAABAAAAAAAAAAAAAgAQAAAAALuAAAAAAAAzZXNkcwAAAAADgICAIgABAASAgIAUQBUAAAAAAhczAAIXMwWAgIACEZAGgICAAQIAAAAUYnRydAAAAAAAAhczAAIXMwAAABBzdHRzAAAAAAAAAAAAAAAQc3RzYwAAAAAAAAAAAAAAFHN0c3oAAAAAAAAAAAAAAAAAAAAQc3RjbwAAAAAAAAAAAAAAKG12ZXgAAAAgdHJleAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAGJ1ZHRhAAAAWm1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAG1kaXJhcHBsAAAAAAAAAAAAAAAALWlsc3QAAAAlqXRvbwAAAB1kYXRhAAAAAQAAAABMYXZmNjAuMTQuMTAw", "segments": [ { "start": 0, "end": 6.08, "url": "segment-1.m4s?r=dXM%3D", "size": 105434 }, { "start": 6.08, "end": 12.16, "url": "segment-2.m4s?r=dXM%3D", "size": 105432 }, { "start": 12.16, "end": 18.24, "url": "segment-3.m4s?r=dXM%3D", "size": 105428 }, { "start": 18.24, "end": 24.32, "url": "segment-4.m4s?r=dXM%3D", "size": 105433 }, { "start": 24.32, "end": 30.4, "url": "segment-5.m4s?r=dXM%3D", "size": 105428 }, { "start": 30.4, "end": 36.48, "url": "segment-6.m4s?r=dXM%3D", "size": 105428 }, { "start": 36.48, "end": 42.56, "url": "segment-7.m4s?r=dXM%3D", "size": 105433 }, { "start": 42.56, "end": 48.64, "url": "segment-8.m4s?r=dXM%3D", "size": 105428 }, { "start": 48.64, "end": 54.72, "url": "segment-9.m4s?r=dXM%3D", "size": 106167 }, { "start": 54.72, "end": 61.696, "url": "segment-10.m4s?r=dXM%3D", "size": 120203 } ], "audio_primary": true } ] } #+end_src Step 4 requêtes pour chaque segmenet (audio + vido + vidéo ??) GET https://vod-adaptive-ak.vimeocdn.com/exp=1716640194~acl=%2Ff4f7374a-e8fb-4d45-a20b-a00e159df3c7%2F%2A~hmac=6db962b252f357e7917026efd7cb50a0642b2349b11109e2e767d3a7ad4efe94/f4f7374a-e8fb-4d45-a20b-a00e159df3c7/sep/audio/3a1c3cf2/chop/segment-1.m4s?r=dXM= avec comme headers - Origin https://player.vimeo.com - Referer https://player.vimeo.com/ Donc la syntaxe pour un fragment est https://vod-adaptive-ak.vimeocdn.com/exp=1716640194~acl=%2F + clip_id + %2F%2A~hmac=6db962b252f357e7917026efd7cb50a0642b2349b11109e2e767d3a7ad4efe94/ + clip_id + /sep/audio/ + base_url + / + segment avec clip_id, base_url et segment dans le json Ce qui n'est pas clair : exp= ? hmac = ? On peut les avoir avec l'URL du master.json (qui contient d'ailleurs les dientifiants des différents video) >>> masterURL 'https://vod-adaptive-ak.vimeocdn.com/exp=1716654963~acl=%2F080566f2-f1d5-4339-a0a1-a529f0d3ac82%2F%2A~hmac=effc64a71f57c3ad83754e7250e05dee24fd786c42e78efed7c0eb22954d9c38/080566f2-f1d5-4339-a0a1-a529f0d3ac82/sep/video/37b9284e,4957af49,6cb18bda,93cc92d4,9ba8dbe2/master.json?base64_init=1' Le plus simple: prendre l'URL de master.json jusque "sep/video" inclus et rajouter / + json['video']['id'] + / + segment['url'] https://stackoverflow.com/questions/69574227/how-to-merge-init-mp4-m4s-files ** 18:34 Aerial spincity Comment concaténer les fragments ? Il y a un "init_segment" dans le json et une liste de m4s (video et audio séparé) Enregistre un m4s ne le reconnati que comme data Dans firefox, il y a 2 video pour le segment1 Si on enregistre la réponse d'une requête depuis l'inspecteur de firefox, la concaténation avec ffmpeg dit "unknown keyword 4sidx", "invalid data" Solution: il faut bien écire le init_segment dans le json puis concaténer séparement l'audio et video avec ffmpeg.