{"id":192,"date":"2018-11-29T20:45:42","date_gmt":"2018-11-29T18:45:42","guid":{"rendered":"http:\/\/hinterdemnebel.de\/?p=192"},"modified":"2018-11-30T08:25:36","modified_gmt":"2018-11-30T06:25:36","slug":"youtube-als-universeller-datenspeicher","status":"publish","type":"post","link":"https:\/\/hinterdemnebel.de\/index.php\/2018\/11\/29\/youtube-als-universeller-datenspeicher\/","title":{"rendered":"Youtube als universeller Datenspeicher"},"content":{"rendered":"<p>Neulich hatte ich mir Gedanken dar\u00fcber gemacht, wie man beliebige Daten in Youtube-Videos kodieren k\u00f6nnte. Immerhin bietet 4K mit 60fps viel Raum und Youtube limitiert nicht den Speicherplatz pro Nutzer. Ich bin darauf verfallen, jedes Bild aus 2\u00d72 Pixeln gro\u00dfen Kacheln aufzubauen, die jeweils mit einer Farbe aus einer Palette von f Farben aufgebaut sind. Ein Wert von 16 f\u00fcr f schien mir angemessen, um trotz Farbverf\u00e4lschungen durch die verlustbehaftete Kompression die Farben noch eindeutig identifizieren zu k\u00f6nnen.<\/p>\n<p>Einen Tag sp\u00e4ter kommt das Fraunhofer Institut <a href=\"https:\/\/www.golem.de\/news\/jab-code-bunter-barcode-gegen-faelschungen-1811-137952.html\">mit einem neuen &#8222;Barcode&#8220; (ist eigentlich keiner) um die Ecke<\/a>, der das gleiche Prinzip nutzt. Aber das nur am Rande, zun\u00e4chst weitere \u00dcberlegungen zum Speichern beliebiger Daten in einem Video.<\/p>\n<p>16 Farben kodieren 4 Bit. Man kann in einem 4K-Bild mit einer Aufl\u00f6sung von\u00a03.840\u00d72.160 Pixeln\u00a02.073.600 solcher Kacheln unterbringen, also eine Informationsmenge von\u00a08.294.400 Bit. Das sind etwa 0,989 MiB (ein <a href=\"https:\/\/de.wikipedia.org\/wiki\/Byte#Vergleich\">MiB<\/a> ist etwa ein Megabyte). Bei 60 fps (Bildern pro Sekunde) sind das etwa 59,33 MiB pro Sekunde Video.<\/p>\n<h1>Die Probleme<\/h1>\n<p>Ich nehme an, dass durch die maximale Bitrate von Youtube alles sehr verschwimmen k\u00f6nnte. Entscheidend bleibt, dass die Kacheln nicht zu sehr verwischen und die Farben unterscheidbar bleiben, auch falls sie deutlich verf\u00e4lscht w\u00fcrden. Sollten die Effekte der verlustbehafteten Kompression zu gro\u00df sein, k\u00f6nnte man die Gr\u00f6\u00dfe der Kacheln und die Anzahl der Farben nat\u00fcrlich beliebig anpassen.<\/p>\n<p>Manchmal komme ich sogar darauf, zu recherchieren, ob andere Leute \u00e4hnliche Ideen hatten. <a href=\"https:\/\/github.com\/razorfinger\/cryptovid\">Das Projekt cryptovid<\/a> nutzt QR-Codes, um die Informationen zu kodieren. Das ist bequem und nutzt verf\u00fcgbare Techniken, hat aber eine geringere Datendichte. <a href=\"https:\/\/github.com\/fangfufu\/Matlab-Data-Video-Converter\">Das Projekt\u00a0Matlab-Data-Video-Converter<\/a>\u00a0nutzt eine andere Technik (dazu unten mehr). Auf der Projektseite wird ein Problem genannt:<\/p>\n<blockquote><p>Note, that parameter that achieves the highest data rate appears to be bs_x = 8, bs_y = 8, repeat = 2. If you set the parameter higher than that, Youtube refuse to accept the video.<\/p><\/blockquote>\n<p>Ich bin nicht sicher, ob der Autor mit &#8222;higher&#8220; wirklich die Gr\u00f6\u00dfe der Parameterwerte meint, oder die erreichbare Anzahl an Bl\u00f6cken und unterschiedlichen Bildern (&#8222;repeat&#8220; bestimmt, wie oft das Bild wiederholt wird, was effektiv die fps mindert), welche zu einer h\u00f6heren Datendichte f\u00fchren w\u00fcrden. Es erscheint jedoch sinnvoll und nicht \u00fcberraschend, dass seitens Youtube Videos, die sich sehr schlecht komprimieren lassen, abgelehnt werden. Der Codec von Youtube ist auf foto-\u00e4hnliches Bildmaterial, nicht auf Grafiken mit zahllosen harten Kanten optimiert.<\/p>\n<h1>Praxistest<\/h1>\n<p>Zum Test habe ich ein frei verf\u00fcgbares <a href=\"https:\/\/pixabay.com\/en\/forest-mist-nature-trees-mystic-931706\/\">Bild von pixabay.com<\/a> mittels Matlab-Data-Video-Converter zu einem Video kodiert. Dieses Projekt verwendet eine schlichte Schwarz-Wei\u00df-Kodierung (1 Bit pro Kachel). Das Bild hat eine Dateigr\u00f6\u00dfe von 731,9 KiB.<\/p>\n<p><a href=\"http:\/\/hinterdemnebel.de\/wp-content\/uploads\/2018\/11\/forest-931706_1920.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-195 aligncenter\" src=\"http:\/\/hinterdemnebel.de\/wp-content\/uploads\/2018\/11\/forest-931706_1920-300x169.jpg\" alt=\"\" width=\"300\" height=\"169\" srcset=\"https:\/\/hinterdemnebel.de\/wp-content\/uploads\/2018\/11\/forest-931706_1920-300x169.jpg 300w, https:\/\/hinterdemnebel.de\/wp-content\/uploads\/2018\/11\/forest-931706_1920-768x432.jpg 768w, https:\/\/hinterdemnebel.de\/wp-content\/uploads\/2018\/11\/forest-931706_1920-1024x576.jpg 1024w, https:\/\/hinterdemnebel.de\/wp-content\/uploads\/2018\/11\/forest-931706_1920.jpg 1920w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Die Kodierung sieht wie folgt aus. Man kann hier die Parameter des Videos erkennen.<\/p>\n<p><a href=\"http:\/\/hinterdemnebel.de\/wp-content\/uploads\/2018\/11\/Selection_063.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-197\" src=\"http:\/\/hinterdemnebel.de\/wp-content\/uploads\/2018\/11\/Selection_063-300x85.png\" alt=\"\" width=\"300\" height=\"85\" srcset=\"https:\/\/hinterdemnebel.de\/wp-content\/uploads\/2018\/11\/Selection_063-300x85.png 300w, https:\/\/hinterdemnebel.de\/wp-content\/uploads\/2018\/11\/Selection_063-768x218.png 768w, https:\/\/hinterdemnebel.de\/wp-content\/uploads\/2018\/11\/Selection_063-1024x291.png 1024w, https:\/\/hinterdemnebel.de\/wp-content\/uploads\/2018\/11\/Selection_063.png 1351w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Das Ergebnis ist ein sehr anstrengendes Video mit einer Dateigr\u00f6\u00dfe von 2,9 MiB.<\/p>\n<div style=\"width: 1920px;\" class=\"wp-video\"><video class=\"wp-video-shortcode\" id=\"video-192-1\" width=\"1920\" height=\"1072\" preload=\"metadata\" controls=\"controls\"><source type=\"video\/mp4\" src=\"http:\/\/hinterdemnebel.de\/wp-content\/uploads\/2018\/11\/forest.mp4?_=1\" \/><a href=\"http:\/\/hinterdemnebel.de\/wp-content\/uploads\/2018\/11\/forest.mp4\">http:\/\/hinterdemnebel.de\/wp-content\/uploads\/2018\/11\/forest.mp4<\/a><\/video><\/div>\n<p>Um zu pr\u00fcfen, ob alles funktioniert hat, gebe ich <em>.\/mp42file.sh forest.mp4 forest_decoded.jpg<\/em> ein. Das Ende der Konsolen-Ausgabe:<\/p>\n<p><a href=\"http:\/\/hinterdemnebel.de\/wp-content\/uploads\/2018\/11\/Selection_065.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-199\" src=\"http:\/\/hinterdemnebel.de\/wp-content\/uploads\/2018\/11\/Selection_065-300x109.png\" alt=\"\" width=\"300\" height=\"109\" srcset=\"https:\/\/hinterdemnebel.de\/wp-content\/uploads\/2018\/11\/Selection_065-300x109.png 300w, https:\/\/hinterdemnebel.de\/wp-content\/uploads\/2018\/11\/Selection_065-768x279.png 768w, https:\/\/hinterdemnebel.de\/wp-content\/uploads\/2018\/11\/Selection_065-1024x372.png 1024w, https:\/\/hinterdemnebel.de\/wp-content\/uploads\/2018\/11\/Selection_065.png 1243w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Eine Sichtpr\u00fcfung der Datei forest_decoded.jpg zeigt, dass es anscheinend funktioniert hat. Den endg\u00fcltigen Beweis liefern die identischen Pr\u00fcfsummen:<\/p>\n<p>md5sum ..\/forest-931706_1920.jpg forest_decoded.jpg<br \/>\nda440a9a369a7808c2abb383123c02d1 ..\/forest-931706_1920.jpg<br \/>\nda440a9a369a7808c2abb383123c02d1 forest_decoded.jpg<\/p>\n<h1>Fazit<\/h1>\n<p>Das Prinzip funktioniert nachweislich. Bei den bestehenden L\u00f6sungen wird jedoch leider Datendichte verschenkt, da die Farbdimension ignoriert wird. Gnadenlose Optimierer w\u00fcrden zus\u00e4tzlich die Tonspur und die Untertitel des Videos in so vielen Sprachen und mit so viel Text wie m\u00f6glich nutzen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Neulich hatte ich mir Gedanken dar\u00fcber gemacht, wie man beliebige Daten in Youtube-Videos kodieren k\u00f6nnte. Immerhin bietet 4K mit 60fps viel Raum und Youtube limitiert&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/hinterdemnebel.de\/index.php\/2018\/11\/29\/youtube-als-universeller-datenspeicher\/\">Weiterlesen<span class=\"screen-reader-text\">Youtube als universeller Datenspeicher<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[25,24],"tags":[],"class_list":["post-192","post","type-post","status-publish","format-standard","hentry","category-informatik","category-verrueckte-idee","entry"],"_links":{"self":[{"href":"https:\/\/hinterdemnebel.de\/index.php\/wp-json\/wp\/v2\/posts\/192","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hinterdemnebel.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hinterdemnebel.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hinterdemnebel.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hinterdemnebel.de\/index.php\/wp-json\/wp\/v2\/comments?post=192"}],"version-history":[{"count":9,"href":"https:\/\/hinterdemnebel.de\/index.php\/wp-json\/wp\/v2\/posts\/192\/revisions"}],"predecessor-version":[{"id":202,"href":"https:\/\/hinterdemnebel.de\/index.php\/wp-json\/wp\/v2\/posts\/192\/revisions\/202"}],"wp:attachment":[{"href":"https:\/\/hinterdemnebel.de\/index.php\/wp-json\/wp\/v2\/media?parent=192"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hinterdemnebel.de\/index.php\/wp-json\/wp\/v2\/categories?post=192"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hinterdemnebel.de\/index.php\/wp-json\/wp\/v2\/tags?post=192"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}