{"id":10043,"date":"2016-12-16T09:43:30","date_gmt":"2016-12-16T08:43:30","guid":{"rendered":"https:\/\/www.dreamsworld.it\/emanuele\/?p=10043"},"modified":"2016-12-19T09:33:08","modified_gmt":"2016-12-19T08:33:08","slug":"come-salvare-video-da-segmenti-m4s-mpeg-dash","status":"publish","type":"post","link":"https:\/\/www.dreamsworld.it\/emanuele\/2016-12-16\/come-salvare-video-da-segmenti-m4s-mpeg-dash\/","title":{"rendered":"Come salvare video da segmenti m4s MPEG-DASH."},"content":{"rendered":"<p>Recentemente avevo voglia di conservare un video <strong>presente online in streaming in formato m4s<\/strong>. A differenza dei metodi di pubblicazione fin ora incontrati, questo non prevedeva la presenza di un file contenitore o playlist che teoricamente aiuta ad occultare nel codice la sorgente del file mp4\/mkv. <a id=\"supnote-10043-1\" href=\"#note-10043-1\">[1]<\/a><\/p>\n<p>Il formato <a href=\"https:\/\/en.wikipedia.org\/wiki\/Dynamic_Adaptive_Streaming_over_HTTP\">MPEG-DASH<\/a> prevede la presenza di chunk &#8211; pezzettini di file &#8211; che verranno uniti successivamente dal player integrato nel browser. In questo modo non \u00e8 presente alcun link diretto al file e l&#8217;unico riferimento \u00e8 il percorso (<em>la cartella<\/em>) in cui il player trover\u00e0 i vari chunk. Questa tecnica, oltre a &#8220;<em>nascondere<\/em>&#8221; il video <strong>permette lo streaming adattivo<\/strong>: man mano che il video avanza il player pu\u00f2 decidere, in base al buffer ancora a disposizione, se richiedere il prossimo chunk in alta o bassa qualit\u00e0.<\/p>\n<p>La tecnica, se allargata anche all&#8217;audio separa i due flussi e permette, ad esempio, di mantenere l&#8217;audio in alta qualit\u00e0 ed abbassare il bitrate del solo video. Ovviamente mi trovavo di fronte a quest&#8217;ultimo scenario.<\/p>\n<p><strong>Come procedere per unire i file m4s in un unico video?<\/strong> Per risolvere comodamente avrete bisogno di un download manager e di ffmpeg, il coltellino svizzero della gestione video.<\/p>\n<ol>\n<li>Per prima cosa \u00e8 necessario scaricare tutti i chunk del video <a id=\"supnote-10043-2\" href=\"#note-10043-2\">[2]<\/a>. Io ho utilizzato <a href=\"https:\/\/sourceforge.net\/projects\/invidownloader\/\" target=\"_blank\">InviDownloader<\/a>, attraverso cui si pu\u00f2 indicare il nome dei segmenti e il numero di elementi da scaricare (<em>spesso le cartelle hanno il listing disabilitato e non \u00e8 possibile effettuare un banale browse<\/em>). Se lo streaming audio \u00e8 separato, dovremo scaricare tutti i suoi segmenti.<\/li>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10054\" src=\"https:\/\/www.dreamsworld.it\/emanuele\/wp-content\/uploads\/2016\/12\/2016-12-16_InviDownloader.png\" alt=\"InviDownloader\" width=\"946\" height=\"434\" srcset=\"https:\/\/www.dreamsworld.it\/emanuele\/wp-content\/uploads\/2016\/12\/2016-12-16_InviDownloader.png 946w, https:\/\/www.dreamsworld.it\/emanuele\/wp-content\/uploads\/2016\/12\/2016-12-16_InviDownloader-600x275.png 600w, https:\/\/www.dreamsworld.it\/emanuele\/wp-content\/uploads\/2016\/12\/2016-12-16_InviDownloader-768x352.png 768w\" sizes=\"auto, (max-width: 946px) 100vw, 946px\" \/><\/p>\n<li>Successivamente \u00e8 necessario unire tutti i segmenti in un unico file contenitore mp4. Per far questo, dal prompt dei comandi di Windows basta digitare:<br \/>\n<code>copy \/b init.mp4 +segment_*.m4s video-output.mp4<\/code><\/li>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10055\" src=\"https:\/\/www.dreamsworld.it\/emanuele\/wp-content\/uploads\/2016\/12\/2016-12-16_cmd_copy.png\" alt=\"Prompt CMD Copy\" width=\"534\" height=\"308\" srcset=\"https:\/\/www.dreamsworld.it\/emanuele\/wp-content\/uploads\/2016\/12\/2016-12-16_cmd_copy.png 534w, https:\/\/www.dreamsworld.it\/emanuele\/wp-content\/uploads\/2016\/12\/2016-12-16_cmd_copy-520x300.png 520w\" sizes=\"auto, (max-width: 534px) 100vw, 534px\" \/><\/p>\n<li>Lo stesso faremo con i segmenti dell&#8217;audio. Ci spostiamo nella cartella dove abbiamo salvato i chunk audio e digitiamo:<br \/>\n<code>copy \/b init.mp4 +segment_*.m4s audio-output.mp4<\/code><\/li>\n<li>A questo punto abbiamo due file: <em>video-output.mp4<\/em> e <em>audio-output.mp4<\/em>. Per unirli ci viene incontro ffmpeg. Raggruppiamo <em>ffmpeg.exe<\/em>, <em>video-output.mp4<\/em> e <em>audio-output.mp4<\/em> in un&#8217;unica cartella e da linea di comando eseguiamo:<br \/>\n<code>ffmpeg.exe -i video-output.mp4 -i audio-output.mp4 -c copy output.mkv<\/code><\/li>\n<\/ol>\n<p>Il nostro file <em>output.mkv<\/em> \u00e8 un file video leggibile sia da browser che da VLC. Volendo potremo decidere, successivamente, di convertirlo in mp4, avi e cos\u00ec via&#8230;<\/p>\n<p><strong>Emanuele<\/strong><\/p>\n<p><a id=\"note-10043-1\" href=\"#supnote-10043-1\">[1]<\/a> inefficaci tecniche di <em>security-through-obscurity<\/em> che non servono a nulla se non a far guadagnare qualche euro in pi\u00f9 alle web-agency.<\/p>\n<p><a id=\"note-10043-2\" href=\"#supnote-10043-2\">[2]<\/a> ricordo che MPEG-DASH prevede la prenza di un file <em>init<\/em> e di tanti <em>segmenti.<\/em> Il primo, tra le varie informazioni contiene in formato binario la <em>segment-list<\/em> che il player andr\u00e0 a processare.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Recentemente avevo voglia di conservare un video presente online in streaming in formato m4s. A differenza dei metodi di pubblicazione fin ora incontrati, questo non prevedeva la presenza di un file contenitore o playlist che teoricamente aiuta ad occultare nel &hellip; <a href=\"https:\/\/www.dreamsworld.it\/emanuele\/2016-12-16\/come-salvare-video-da-segmenti-m4s-mpeg-dash\/\">Leggi ancora &rarr;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":"","jetpack_post_was_ever_published":false},"categories":[3],"tags":[653,640,2677,2725,2726,2724,339],"class_list":["post-10043","post","type-post","status-publish","format-standard","hentry","category-computer","tag-guide","tag-how-to","tag-internet","tag-m4s","tag-mp4","tag-mpeg-dash","tag-video"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.dreamsworld.it\/emanuele\/wp-json\/wp\/v2\/posts\/10043","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dreamsworld.it\/emanuele\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dreamsworld.it\/emanuele\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dreamsworld.it\/emanuele\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dreamsworld.it\/emanuele\/wp-json\/wp\/v2\/comments?post=10043"}],"version-history":[{"count":0,"href":"https:\/\/www.dreamsworld.it\/emanuele\/wp-json\/wp\/v2\/posts\/10043\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dreamsworld.it\/emanuele\/wp-json\/wp\/v2\/media?parent=10043"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dreamsworld.it\/emanuele\/wp-json\/wp\/v2\/categories?post=10043"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dreamsworld.it\/emanuele\/wp-json\/wp\/v2\/tags?post=10043"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}