<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Beiträge von Florian Bauer - Mobile USTP MKL</title>
	<atom:link href="https://mobile.fhstp.ac.at/author/it221507/feed/" rel="self" type="application/rss+xml" />
	<link>https://mobile.fhstp.ac.at/author/it221507/</link>
	<description>Die &#34;Mobile Forschungsgruppe&#34; der USTP, sie  sammelt hier alles zu den Themen Design, UX und Entwicklung mobiler Applikationen</description>
	<lastBuildDate>Fri, 08 Mar 2024 09:58:54 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://mobile.fhstp.ac.at/wp-content/uploads/2025/03/icon-120x120.webp</url>
	<title>Beiträge von Florian Bauer - Mobile USTP MKL</title>
	<link>https://mobile.fhstp.ac.at/author/it221507/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Arc Browser &#8211; Der Webbrowser für das aufgeräumte Internet</title>
		<link>https://mobile.fhstp.ac.at/allgemein/arc-browser-der-webbrowser-fuer-das-aufgeraeumte-internet/</link>
		
		<dc:creator><![CDATA[Florian Bauer]]></dc:creator>
		<pubDate>Thu, 07 Mar 2024 08:40:51 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Arc Browser]]></category>
		<category><![CDATA[Webbrowser]]></category>
		<guid isPermaLink="false">https://akirchknopf-21110.php.fhstp.cc/?p=12159</guid>

					<description><![CDATA[<p>Mit dem Webbrowser Arc hat das Start-up The Browser Company eine unkonventionelle Art der Benutzerführung versprochen. Seit einem Jahr steht dieser auf Googles Open-Source-Browser Chromium basierende Browser für alle Apple-Nutzer zum Download bereit. Aktuell befindet sich die Windows-Version noch in der Entwicklung, jedoch haben Interessierte die Möglichkeit, sich bereits auf die Warteliste setzen zu lassen. <a class="read-more" href="https://mobile.fhstp.ac.at/allgemein/arc-browser-der-webbrowser-fuer-das-aufgeraeumte-internet/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/arc-browser-der-webbrowser-fuer-das-aufgeraeumte-internet/">Arc Browser &#8211; Der Webbrowser für das aufgeräumte Internet</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Mit dem Webbrowser Arc hat das Start-up The Browser Company eine unkonventionelle Art der Benutzerführung versprochen. Seit einem Jahr steht dieser auf Googles Open-Source-Browser Chromium basierende Browser für alle Apple-Nutzer zum Download bereit. Aktuell befindet sich die Windows-Version noch in der Entwicklung, jedoch haben Interessierte die Möglichkeit, sich bereits auf die Warteliste setzen zu lassen. In diesem Beitrag gehen wir der Frage nach, welchen innovativen Weg der Arc Browser einschlägt und was genau diese unkonventionelle Benutzerführung auszeichnet.</p>



<h2 class="wp-block-heading">Die Seitenleiste</h2>



<figure class="wp-block-image size-full"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_arc_01.png"><img fetchpriority="high" decoding="async" width="2337" height="1443" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_arc_01.png" alt="" class="wp-image-12172" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2024/03/202403_arc_01.png 2337w, https://mobile.fhstp.ac.at/wp-content/uploads/2024/03/202403_arc_01-1536x948.png 1536w, https://mobile.fhstp.ac.at/wp-content/uploads/2024/03/202403_arc_01-2048x1265.png 2048w" sizes="(max-width: 2337px) 100vw, 2337px" /></a></figure>



<p>Was macht Arc also besonders und unterscheidet ihn von allen anderen Webbrowsern? Arc verabschiedet sich vom herkömmlichen Browser-Interface. Statt einer Reihe von Tabsoben im Browserfenster setzt Arc auf eine praktische Seitenleiste, in der man die Lieblingslinks anheften und durch geöffnete Tabs scrollen können. Der Browser profitiert zudem von einem automatischen Aufräumdienst. Alle 12 Stunden schließt er alle geöffneten Tabs, um Unordnung und Kopfschmerzen zu begrenzen.</p>



<p>Es mag trivial klingen, aber die Seitenleiste bringt Ordnung in das Chaos des Web-Browsing. Oben sehe ich meine &#8220;Favoriten&#8221;, also die Webseiten, die ich am häufigsten nutze, wie zum Beispiel meinen Notiz-Hub in Notion. Favoriten sind in all meinen Bereichen sichtbar.</p>



<p>Darunter habe ich Tabs angeheftet, die für meinen Arbeitsbereich wesentlich sind. Ich habe Arc so eingestellt, dass er alle offenen Tabs alle 12 Stunden archiviert, aber die angehefteten Tabs bleiben geöffnet, bis ich sie manuell schließe.</p>



<p>Bei den anderen Webbrowsern öffnete öffnet man jeden Tag diesen und sah eine Flut von Links aus vergangenen Tagen und Wochen. Die Tabs erinnerten einen daran, wie sehr man im Rückstand lag. Standardmäßig schließt Arc alle geöffneten Tabs alle 12 Stunden. Meiner Meinung nach, wenn ein Tab es wert ist, behalte ich es, indem ich es in den angehefteten Bereich ziehe. Andernfalls kann ich problemlos mit einer sauberen Oberfläche weitersurfen.</p>



<p>Der untere Teil der Seitenleiste ist der Bereich, in dem geöffnete Tabs erscheinen. Ich wechsle zwischen Tabs, indem ich scrolle oder eine Tastenkombination verwende, was das Browsen zum Kinderspiel macht. Und ich muss nicht mehr die Augen zusammenkneifen, um den Titel einer Webseite oben im Fenster zu lesen. Arcs Seitenleiste zeigt mehr vom Titel als ein herkömmlicher Browser, was es einfacher macht, den richtigen Tab zu finden.</p>



<h2 class="wp-block-heading">Spaces</h2>



<figure class="wp-block-video"><video controls src="https://arc.net/space-swiping.webm"></video></figure>



<p>Das wirkliche Werkzeug für fortgeschrittene Anwenderorganisationen ist hier Spaces, das einem ermöglicht, schnell zwischen verschiedenen Modi in Arc zu wechseln. Die Bezeichnung der Spaces erinnert an die virtuelle Desktop-Funktion von Mac, wobei die Arc-Spaces gleichzeitig starke Ähnlichkeiten mit den Tab-Gruppen in Safari aufweisen. Jeder Space kann eine unterschiedliche Auswahl an Pins und Tabs, eine andersfarbige Seitenleiste oder sogar verschiedene Benutzerkonten haben. Wenn man persönliche und berufliche Angelegenheiten getrennt halten möchten, die Idee des offenen Kontextwechsels mögen, mehrere Konten im selben Browser zu verwalten, sind Spaces eine wahre Rettung. Spaces sind eine gute Idee, und Arc setzt sie wirklich gut um. So kann beispielsweise ein Bereich für Reisen und ein anderer für Arbeitsinhalte erstellt werden. Dabei greift Arc das Konzept von dem Webbrowser Vivaldi auf.</p>



<figure class="wp-block-image size-full is-resized"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_arc_boost_01.jpg"><img decoding="async" width="1878" height="897" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_arc_boost_01.jpg" alt="" class="wp-image-12174" style="width:841px;height:auto" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2024/03/202403_arc_boost_01.jpg 1878w, https://mobile.fhstp.ac.at/wp-content/uploads/2024/03/202403_arc_boost_01-1536x734.jpg 1536w" sizes="(max-width: 1878px) 100vw, 1878px" /></a></figure>



<p>Durch die <a href="https://arc.net/boosts">Boost-Funktion</a> können Benutzer:innen verschiedene Schriftarten auf praktisch jeden Text anwenden und Farben für jeden Teil einer Webseite anpassen. Dieser Zustand lässt sich selbstverständlich für spätere Verwendungszwecke speichern. Zusätzlich besteht die Möglichkeit, Abschnitte aus dem Sichtfeld zu entfernen, eine Funktion, die durch Skripte weiter verfeinert werden kann. Weitere nützliche Funktionen von Arc umfassen die Bild-in-Bild-Unterstützung für z.B. Google-Meet-Anrufe sowie ein integriertes Notizen-Tool.</p>



<h2 class="wp-block-heading">Das Betriebssystem für das Internet</h2>



<figure class="wp-block-image size-full"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_arc_02.gif"><img decoding="async" width="1920" height="1200" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_arc_02.gif" alt="" class="wp-image-12176"/></a></figure>



<p>Viele ehemals eigenständige Programme haben ihren Weg in Webbrowser gefunden: E-Mails, Textdokumente, Kalender, Planungstabellen, Content-Management-Systeme. Hinzu kommen Nachrichten, soziale Netzwerke, KI-Chatbots, Videokonferenzen, To-do-Listen und, wenn gewünscht, sogar Videobearbeitung &#8211; alles im Browser. Die Entwickler von Arc und einige andere argumentieren deshalb, dass ein Browser wie ein Betriebssystem für das Internet sein sollte. Konkret bedeutet dies beispielsweise, einen anderen Ansatz für Tabs zu wählen. Die seitliche Anordnung in Arc ermöglicht eine bessere Lesbarkeit des Inhalts eines einzelnen Tabs, selbst wenn viele gleichzeitig geöffnet sind.</p>



<p>Die integrierten Mediensteuerelemente waren das erste Feature von Arc, die beim ersten Blick auch gleich auffallen. Wenn man beispielsweise einen Twitch-Stream oder einen Spotify-Song abspielt und dann zu einem anderen Tab wechselt, erscheint ein kleiner Player unten in der Seitenleiste, der es einem ermöglicht, Titel zu pausieren oder zu überspringen. Ein Klick auf den Player bringt einem direkt zum Tab zurück. Beim Wechsel von Google Meet werden auch Mikrofon- und Lautsprechersteuerelemente in der Seitenleiste angezeigt. So einfach! So hilfreich! So viel besser als das verborgene Menü in Chrome, das man oft vergisst.</p>



<p>Auch der bereits erwähnte Bild-in-Bild-Modus von Arc, der das, was man gerade ansieht, in einem kleinen Overlay-Fenster anzeigt, wenn man zwischen Tabs wechselt oder zu einer anderen App geht. Derzeit ist es ein sehr grundlegendes Werkzeug – es erfasst den Videoplayer und platziert ihn über anderen Tabs – aber The Browser Company hat anscheinend noch große Pläne für dieses Feature. Features wie diese machen Arc eher zu einem Betriebssystem als zu einem Browser.</p>



<p>In naher Zukunft stellt sich das Unternehmen vor, dass alles, was man tun, mit dem Web verbunden sein wird. Selbst die meisten nativen Apps sind jetzt nur Hüllen um Web-Apps. Warum also alles auf dem Desktop verwalten? Deshalb betrachtet Arc die Seitenleiste als einen App-Starter, und deshalb gibt es einen Ort zum Speichern und Durchsuchen der Screenshots und Downloads, damit man mehr erledigen kann, ohne die App zu verlassen. The Browser Company hat sogar zwei neue Apps in Arc integriert: Notes und Easels. Notes sind einfach, nur eine Möglichkeit, schnell eine leere Seite zu öffnen und Dinge aufzuschreiben. Jede Seite erhält ihre eigene URL, damit man sie speichern oder mit anderen teilen können. Easels sind viel leistungsstärker und gewähren einen Einblick in die wahren Ambitionen von Arc. Ein Easel ist im Wesentlichen eine Tafel, ein leerer Raum, auf dem man schreiben, zeichnen oder Bilder und Videos hinzufügen kann. Man kann sogar einen Screenshot durch eine Live-Version jeder Webseite ersetzen und ein Easel in eine Echtzeitansicht von vielen Websites gleichzeitig verwandeln. Jedes Easel ist teilbar und kollaborativ.</p>



<h2 class="wp-block-heading">Arc Search</h2>



<figure class="wp-block-image size-full"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_arc_search_01.jpg"><img loading="lazy" decoding="async" width="1165" height="634" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_arc_search_01.jpg" alt="" class="wp-image-12177"/></a></figure>



<p>Mit Arc Search bringt The Browser Company eine neue iOS-Suchmaschinen-App an den Start. Arc Search kombiniert Browser, Suchfunktionen und Künstliche Intelligenz (KI) zu einer innovativen Suchmaschine. Durch die Funktion &#8220;Browse for me&#8221; erstellt Arc Search eine spezielle Webseite basierend auf der Suchanfrage. Ein Beispiel des US-Technikportals The Verge verdeutlicht dies anhand eines American Football-Spiels. Arc Search durchsuchte das Web und lieferte innerhalb weniger Sekunden eine Vielzahl von Informationen, darunter das Endergebnis, den entscheidenden Spielzug, verwandte Nachrichten, verschiedene Links und weitere kurze Fakten zum Spiel. &#8220;In dieser Idee von The Browser Company steckt die Vorstellung, dass ein Browser, eine Suchmaschine, ein KI-Chatbot und eine Website keine getrennten Elemente sind.&#8221; Es gibt jedoch auch einen Abschnitt namens &#8220;Dive Deeper&#8221; am Ende mit einer Auswahl von Links. Im Gegensatz zu KI-Chatbots mit Webzugang wie Copilot und Perplexity AI stellt sich Arc Search vor, dass die KI Webseiten erkundet, indem sie für jede Suchanfrage eine neue Website erstellt.</p>



<p>Gleichzeitig markiert Arc Search eine bedeutende Veränderung für den Arc-Browser. Im vergangenen Herbst erhielt der Browser neue, KI-basierte Funktionen. Während die bisher nur auf dem iPhone verfügbare mobile App von The Browser Company hauptsächlich als Begleit-App für den Desktop diente – eine Möglichkeit, auf offene Tabs zuzugreifen und nicht viel mehr – bereitet sich das Unternehmen mit der Einführung von Arc für Windows-Nutzer darauf vor, sein eigenes plattformübergreifendes Synchronisierungssystem namens Arc Anywhere einzuführen und einige dieser KI-gesteuerten Funktionen für Arc auf anderen Plattformen verfügbar zu machen, berichtet The Verge. Zukünftig wird Arc Search nur noch als Arc bezeichnet und die einzige mobile App des Unternehmens sein, so der CEO von The Browser Company, Josh Miller, laut The Verge.</p>



<p>Miller zufolge besteht noch viel Potenzial für Arc Search, um noch &#8220;intelligenter&#8221; zu werden. Die zugrunde liegenden KI-Modelle stammen aus einer Mischung von OpenAI und anderen Quellen.</p>



<h2 class="wp-block-heading">Fazit</h2>



<p>Auf gewisse Weise ist Arc eher wie ChromeOS als Chrome. Es versucht, den Browser zu erweitern und zur einzigen App zu machen. In einer Welt, in der alle Apps Webanwendungen sind und alle Dateien URLs sind, wer braucht wirklich mehr als einen Browser? Arc hat recht: Wir brauchen ein Betriebssystem für das Internet, ein Werkzeug, das es uns erleichtert, zwischen Apps zu arbeiten, uns beim Organisieren hilft und einige plattformweite Tools hinzufügt, um alles besser zu machen. Die App wird deutlich nützlicher sein, wenn sie auf Mobilgeräten und Windows verfügbar. Tabs sind passé. Es lebe die Seitenleiste. </p>



<h2 class="wp-block-heading">Zum Weiterschauen</h2>



<ul class="wp-block-list">
<li><a href="https://www.youtube.com/watch?v=WIeJF3kL5ng&amp;t=26s&amp;ab_channel=TheBrowserCompany">Meet Act II of Arc Browser A browser that browses for you | The Browser Company</a></li>



<li><a href="https://www.youtube.com/watch?v=UdopamaLJC8&amp;ab_channel=EnricoTartarotti">Why Everyone Is OBSESSED With Arc Browser | Enrico Tartarotti</a></li>
</ul>



<h2 class="wp-block-heading">Quellen</h2>



<ul class="wp-block-list">
<li><a href="https://arc.net/">https://arc.net/</a></li>



<li><a href="https://www.golem.de/news/arc-browser-chrome-alternative-bietet-viele-vivaldi-komfortfunktionen-2307-176236.html">https://www.golem.de/news/arc-browser-chrome-alternative-bietet-viele-vivaldi-komfortfunktionen-2307-176236.html</a></li>



<li><a href="https://www.theverge.com/23462235/arc-web-browser-review">https://www.theverge.com/23462235/arc-web-browser-review</a></li>



<li><a href="https://www.businessinsider.com/arc-web-browser-review-not-using-chrome-2023-8">https://www.businessinsider.com/arc-web-browser-review-not-using-chrome-2023-8</a></li>



<li><a href="https://vivaldi.com/de/">https://vivaldi.com/de/</a></li>



<li><a href="https://www.zeit.de/digital/internet/2023-10/arc-browser-tabs-ordnung-webbrowser-test">https://www.zeit.de/digital/internet/2023-10/arc-browser-tabs-ordnung-webbrowser-test</a></li>



<li><a href="https://www.heise.de/news/Arc-Search-verspricht-eine-neuartige-Suchmaschinenerfahrung-9612387.html">https://www.heise.de/news/Arc-Search-verspricht-eine-neuartige-Suchmaschinenerfahrung-9612387.html</a></li>



<li></li>
</ul>



<h2 class="wp-block-heading">Fotos/Videos</h2>



<ul class="wp-block-list">
<li>Headerbild &#8211; Logo/Hintegrundbild: <a href="https://arc.net/">https://arc.net/</a></li>



<li>Alle weiteren Artikelfotos: <a href="https://arc.net/">https://arc.net/</a></li>
</ul>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/arc-browser-der-webbrowser-fuer-das-aufgeraeumte-internet/">Arc Browser &#8211; Der Webbrowser für das aufgeräumte Internet</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		<enclosure url="https://arc.net/space-swiping.webm" length="2050830" type="video/webm" />

			</item>
		<item>
		<title>Car Kickers AR</title>
		<link>https://mobile.fhstp.ac.at/allgemein/car-kickers-ar/</link>
		
		<dc:creator><![CDATA[Florian Bauer]]></dc:creator>
		<pubDate>Wed, 06 Mar 2024 21:26:15 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Cross Plattform]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Studium]]></category>
		<category><![CDATA[AR]]></category>
		<category><![CDATA[AR Foundation-Framework]]></category>
		<category><![CDATA[Photon]]></category>
		<category><![CDATA[Unity]]></category>
		<guid isPermaLink="false">https://akirchknopf-21110.php.fhstp.cc/?p=12085</guid>

					<description><![CDATA[<p>Im Zuge der Masterklasse Mobile des Studiengangs Interactive Technologies, haben wir beschlossen zusammen ein AR Multiplayer Game zu entwickeln. Ausschlaggebend dafür war die Vorgabe, dass ein gemeinsames kreatives Projekt mit allen Teammitgliedern erstellt werden soll. Da sich ein Spiel sehr gut in einzelne Bereiche aufteilen lässt und der Umfang angemessen schien, haben wir uns für dieses gemeinsame Projekt entschieden.</p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/car-kickers-ar/">Car Kickers AR</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Die Lehrveranstaltung</h2>



<p>Im Zuge der Masterklasse&nbsp;<em>Mobile</em>&nbsp;des Studiengangs&nbsp;<em>Interactive Technologies</em>, haben wir beschlossen zusammen ein AR Multiplayer Game zu entwickeln. Ausschlaggebend dafür war die Vorgabe, dass ein gemeinsames kreatives Projekt mit allen Teammitgliedern erstellt werden soll. Da sich ein Spiel sehr gut in einzelne Bereiche aufteilen lässt und der Umfang angemessen schien, haben wir uns für dieses gemeinsame Projekt entschieden.</p>



<h2 class="wp-block-heading">Die Idee</h2>



<p>Nach dem Beschluss ein Multiplayer AR Game in Unity realisieren zu wollen, haben wir mit dem Brainstorming begonnen. Schnell haben wir uns für den Tech Stack mit der Game Engine Unity, dem Framework AR Foundation und dem Multiplayer Server Photon entschieden, dazu später mehr. Folgende Spielideen kamen auf:</p>



<ul class="wp-block-list">
<li><strong>ARtillery Game:</strong> Jeder Spieler besitzt eine kanone und muss den richtigen winkel finden, um die anderen zu zerstören, vielleicht unter Beeinflussung von echten Wind (sensoren/mikro?) Beispiel: <a href="https://rb.gy/g377b">https://rb.gy/g377b</a></li>



<li><strong>AR Zombie Apocalypse</strong>, einer ist Zombie und kann andere infizieren. Ziel: Zombies müssen in einem Zeitraum alle anderen infizieren (hide &amp; seek)</li>



<li><strong>AR Treasure Hunt</strong> / Geocaching, Zusammenarbeiten um Rätsel zu lösen und schatz zu finden, oder einer versteckt, anderer sucht usw, z.B.: <a href="https://t.ly/yt6eA">https://t.ly/yt6eA</a></li>



<li><strong>Rube Goldberg Machine</strong>, z.B.: <a href="https://t.ly/0AiCV">https://t.ly/0AiCV</a></li>



<li><strong>Rennspiel:</strong> zufällig generierte strecken in realen Umgebungen, im Stil von Micro Machines (<a href="https://bit.ly/3MsMmnl">https://bit.ly/3MsMmnl</a>)</li>
</ul>



<figure class="wp-block-gallery has-nested-images columns-default wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_ideen-01.jpg"><img loading="lazy" decoding="async" width="1540" height="800" data-id="12138" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_ideen-01-1540x800.jpg" alt="" class="wp-image-12138" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2024/03/202403_ideen-01-1540x800.jpg 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2024/03/202403_ideen-01-770x400.jpg 770w" sizes="auto, (max-width: 1540px) 100vw, 1540px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/journal-inspiration_v1-scaled.jpg"><img loading="lazy" decoding="async" width="1540" height="800" data-id="12145" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/journal-inspiration_v1-1540x800.jpg" alt="" class="wp-image-12145" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2024/03/journal-inspiration_v1-1540x800.jpg 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2024/03/journal-inspiration_v1-770x400.jpg 770w" sizes="auto, (max-width: 1540px) 100vw, 1540px" /></a></figure>
</figure>



<p>Schlussendlich hat der Mehrheit die Idee mit den kleinen Autos, ähnlich zu Micro Machines sehr gefallen und Idee wurde weiter zu einer Art Rocket League in AR mit Modellautos geformt.</p>



<h2 class="wp-block-heading">Das Konzept</h2>



<p>In diesem Multiplayer-Spiel treten 2 vs 2 Spielern gegeneinander an, um mit kleinen Autos den Ball ins gegnerische Tor zu schießen. Das Spielfeld und die anderen Objekten werden in der Realität platziert. Am Spielfeld gibt es zudem eine Bombe von der man sich fernhalten sollte.</p>



<p>Es soll einfach möglich sein, dass jeder mit einem Smartphone, irgendwo in der echten Umgebung ein Spiel erstellen kann und andere Spieler einlädt. Das Spielprinzip sollte leicht zugänglich sein und dennoch durch die Mixed Reality beeindrucken.</p>



<p><strong>Innovative Technologie:</strong> Mit Augmented Reality auf Smartphones nutzt das Spiel eine moderne Technologie, um eine realistische Spielumgebung zu schaffen. Spieler können das Spielfeld in ihrer realen Umgebung platzieren, wobei das Spiel sehr vom Chaosfaktor lebt.</p>



<p><strong>Multiplayer-Erlebnis:</strong> Das Projekt ermöglicht ein intensives Multiplayer-Spiel mit Teams von 2 gegen 2. Dies fördert die soziale Interaktion und den Wettbewerb unter den Spielern, was besonders in der heutigen Gaming-Kultur beliebt ist.</p>



<p><strong>Spannendes Gameplay:</strong> Das Konzept des Spiels, bei dem Spieler mit Autos einen Ball ins Tor schießen, ist einfach zu verstehen und gleichzeitig herausfordernd, was das Spiel für eine breite Zielgruppe zugänglich macht.</p>



<p><strong>Lernpotenzial:</strong> Die Entwicklung eines AR-Multiplayer-Spiels erfordert komplexe Fähigkeiten in Bereichen wie 3D-Modellierung, Netzwerkkommunikation und AR-Technologien. Dieses Projekt bot eine hervorragende Möglichkeit für uns Studenten, wertvolle Erfahrungen und Fähigkeiten zu sammeln.</p>



<p>Insgesamt kombiniert Car Kickers AR auf geschickte Weise Technologie, Wettbewerb und Spaß, was es zu einem simplen und chaosorientierten Projekt für unsere Masterklasse machte.</p>



<h2 class="wp-block-heading">Gruppendynamik</h2>



<p>Erst vergangenes Semester konnten wir erste Erfahrungen zur gemeinsamen Zusammenarbeit in der großen Runde sammeln. Im Zuge einer Extreme Programming Week haben wir eine Progressive Web App entwickelt, mit der man Schnitzeljagden realisieren kann. Das Projekt war herausfordernd und sehr lehrreich, mehr dazu könnt ihr im Blogartikel <em><a href="https://akirchknopf-21110.php.fhstp.cc/development/pingo-oder-die-einwoechige-entstehung-eines-location-based-service/">PinGo – oder die einwöchige Entstehung eines Location-Based-Service</a></em> nachlesen.</p>



<p>Die Personen kannten sich untereinander schon gut und Aufgaben wurden passend je nach Wunsch verteilt. Da jedoch regelmäßige Meetings fehlten und durch den Workload des laufenden Semesters wurden Aufgaben teils aus den Augen verloren. Schnell wurde klar, dass einige mehr Zeit investierten als andere, was jedoch bei solchen Projektarbeiten ein vorhersehbares Phänomen ist.</p>



<h2 class="wp-block-heading">Projektmanagement</h2>



<p>Das Projektmanagement hat Christoph übernommen, da er die Idee einbrachte. Es wurde gemeinsam beschlossen, auf die All-In-One Software Notion zu setzen, welche für Notizen, Aufgaben, Projekte und Zusammenarbeit dient. Darin wurde das gesamte Projektmanagement abgewickelt.</p>



<figure class="wp-block-image size-full is-resized"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_projektmgmt_01-1.png"><img loading="lazy" decoding="async" width="883" height="375" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_projektmgmt_01-1.png" alt="" class="wp-image-12095" style="width:558px;height:auto"/></a></figure>



<p>Das Team wurde in unterschiedliche Aufgabenbereiche eingeteilt:</p>



<p><strong>Development &amp; Physics</strong>: Mindestens ein oder zwei Teammitglieder sollten sich auf AR-Tracking und die grundlegende Spiellogik konzentrieren. Sie würden sich mit AR Foundation beschäftigen und sicherstellen, dass das Spielfeld richtig in die reale Welt projiziert wird.</p>



<p><strong>Game Design</strong>: Diese Abteilung ist für die Konzeption und Gestaltung des Spiels verantwortlich. Game Designer erstellen das Spielszenario, entwerfen die Spielmechanik, Level und Charaktere, und definieren die Spielregeln.</p>



<p><strong>Multiplayer</strong>: Ein oder zeit Teammitglieder sollten sich auf den Multiplayer-Aspekt spezialisieren. Das beinhaltet das Arbeiten mit Photon oder einem ähnlichen Netzwerkdienst, um die Synchronisation zwischen Spielern herzustellen.</p>



<p>Mindestens ein Mitglied sollte sich auch um Backend-Systeme kümmern, die für das Speichern von Spielerdaten, Fortschritten und Ranglisten notwendig sind.</p>



<p><strong>User Interface &amp; Sound Design</strong>: Ein Mitglied sollte sich auf die Benutzeroberfläche (UI) und die User Experience (UX) konzentrieren, um sicherzustellen, dass das Spiel intuitiv und ansprechend ist.</p>



<p><strong>AR Development</strong>: Im Fokus steht hier die Integration der Augmented Reality Funktionalität über das Framework AR Foundation und das Beheben von möglich Problemen des eigentlich Spiels.</p>



<p>Nach der Teameinteilung wurden sämtliche Tasks erstellt, aufgeteilt und priorisiert:</p>



<figure class="wp-block-image size-large"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_projektmgmt_02.jpg"><img loading="lazy" decoding="async" width="1488" height="800" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_projektmgmt_02-1488x800.jpg" alt="" class="wp-image-12096"/></a></figure>



<p>Anfangs wurde noch mit Sprint gearbeitet:</p>



<figure class="wp-block-image size-full"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_projektmgmt_03.png"><img loading="lazy" decoding="async" width="1389" height="326" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_projektmgmt_03.png" alt="" class="wp-image-12098"/></a></figure>



<p>Dies wurde jedoch schnell aus den Augen verloren, da es aufgrund anderer Prioritäten während des Semester unrealistisch war, in regelmäßigen Abständen an dem Spiel zu arbeiten.</p>



<h2 class="wp-block-heading">Die Umsetzung</h2>



<p>Das Softwareprojekt wurde in der Game-Engine Unity umgesetzt. Die AR Aspekte werden mit dem Framework AR Foundation integriert. Das ganze Projekt lässt sich sowohl für Apple als auch Android Geräte bereitstellen.</p>



<p><strong>Unser Tech Stack</strong></p>



<figure class="wp-block-gallery has-nested-images columns-default wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-full"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_unity-04.jpg"><img loading="lazy" decoding="async" width="1916" height="1031" data-id="12135" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_unity-04.jpg" alt="" class="wp-image-12135" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2024/03/202403_unity-04.jpg 1916w, https://mobile.fhstp.ac.at/wp-content/uploads/2024/03/202403_unity-04-1536x827.jpg 1536w" sizes="auto, (max-width: 1916px) 100vw, 1916px" /></a></figure>



<figure class="wp-block-image size-medium"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_tech_stack-asset_forge.jpg"><img loading="lazy" decoding="async" width="770" height="400" data-id="12136" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_tech_stack-asset_forge-770x400.jpg" alt="" class="wp-image-12136"/></a></figure>
</figure>



<p></p>



<figure class="wp-block-table"><table><tbody><tr><td><a href="https://unity3d.com/get-unity/download/archive">Unity3D 2022.3.11 (LTS)</a></td><td>Unser Game Framework für das Cross-Plattform-Development</td></tr><tr><td><a href="https://kenney.nl/tools/asset-forge">Asset Forge</a></td><td>Tool für die Modellierung unserer Fahrzeuge</td></tr><tr><td><a href="https://unity.com/de/unity/features/arfoundation">AR Foundation</a></td><td>AR-Framework für Unity</td></tr><tr><td><a href="https://www.photonengine.com/">Photon</a></td><td>Multiplayer Engine für Unity</td></tr><tr><td><a href="https://www.jetbrains.com/de-de/rider/">IntellJ Rider</a></td><td>Als IDE-Ersatz für das Performance intensive Visual Studio</td></tr></tbody></table></figure>



<p></p>



<p><strong>Szenen</strong></p>



<div class="wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-ad2f72ca wp-block-group-is-layout-flex">
<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_ui-04.png"><img loading="lazy" decoding="async" width="988" height="557" data-id="12100" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_ui-04.png" alt="" class="wp-image-12100"/></a></figure>



<figure class="wp-block-image size-large"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_ui-02.png"><img loading="lazy" decoding="async" width="990" height="553" data-id="12102" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_ui-02.png" alt="" class="wp-image-12102"/></a></figure>



<figure class="wp-block-image size-large"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_ui-05.jpg"><img loading="lazy" decoding="async" width="1021" height="800" data-id="12107" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_ui-05-1021x800.jpg" alt="" class="wp-image-12107"/></a></figure>



<figure class="wp-block-image size-large"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_ui-03.jpg"><img loading="lazy" decoding="async" width="987" height="554" data-id="12103" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_ui-03.jpg" alt="" class="wp-image-12103"/></a></figure>



<figure class="wp-block-image size-large"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_model-spielfeld_v1.png"><img loading="lazy" decoding="async" width="1255" height="771" data-id="12134" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_model-spielfeld_v1.png" alt="" class="wp-image-12134"/></a></figure>



<figure class="wp-block-image size-large"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_ui-01.png"><img loading="lazy" decoding="async" width="985" height="556" data-id="12101" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_ui-01.png" alt="" class="wp-image-12101"/></a></figure>
</figure>
</div>



<p>Die Oberflächen teilen teilt sich auf in:</p>



<ul class="wp-block-list">
<li>Hauptmenü &#8211; Scene_Main_Menu</li>



<li>Quickmatch &#8211; Scene_Lobby</li>



<li>Auto Auswahl &#8211; Scene_Player_Selection</li>



<li>Lobby &#8211; Scene_Lobby</li>



<li>Gameplay &#8211; Scene_Gameplay</li>
</ul>



<figure class="wp-block-image size-full"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_unity-01.png"><img loading="lazy" decoding="async" width="226" height="184" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_unity-01.png" alt="" class="wp-image-12109"/></a></figure>



<p><strong>Player</strong></p>



<p>Das Prefab für den Spieler beinhaltet neben dem eigentlichen 3D-Modell auch das Skript Car Controller, mit dem die Steuerung realisiert wurde, sowie Sound und Animationen:</p>



<figure class="wp-block-gallery has-nested-images columns-default wp-block-gallery-4 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-full"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/journal-cars_v1-scaled.jpg"><img loading="lazy" decoding="async" width="2560" height="1810" data-id="12129" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/journal-cars_v1-scaled.jpg" alt="" class="wp-image-12129" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2024/03/journal-cars_v1-scaled.jpg 2560w, https://mobile.fhstp.ac.at/wp-content/uploads/2024/03/journal-cars_v1-1536x1086.jpg 1536w, https://mobile.fhstp.ac.at/wp-content/uploads/2024/03/journal-cars_v1-2048x1448.jpg 2048w" sizes="auto, (max-width: 2560px) 100vw, 2560px" /></a></figure>



<figure class="wp-block-image size-full"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_unity-02.png"><img loading="lazy" decoding="async" width="331" height="164" data-id="12110" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_unity-02.png" alt="" class="wp-image-12110"/></a></figure>
</figure>



<h2 class="wp-block-heading">Scripts</h2>



<p>Natürlich sind auch sehr viele Scripts entstanden, grob unterteilt wurde hier das Verhalten folgender Aspekte programmiert:</p>



<figure class="wp-block-image size-full"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_unity-03.png"><img loading="lazy" decoding="async" width="111" height="131" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_unity-03.png" alt="" class="wp-image-12111"/></a></figure>



<p></p>



<ul class="wp-block-list">
<li>AR: Marker-Based und Markerless Verhalten</li>



<li>Networking und Spawn Management</li>



<li>Player Movement und Verhalten</li>



<li>UI und Menü</li>
</ul>



<p><strong>Genutzte Tutorials</strong></p>



<p>Folgende Tutorials haben maßgeblich zur Entwicklung beigetragen:</p>



<ul class="wp-block-list">
<li><a href="https://www.udemy.com/course/augmented-reality-101-ar-foundation-basics/learn/lecture/21900656#overview">AR Tutorial #1 (Udemy)</a></li>



<li><a href="https://www.youtube.com/watch?v=FWyTf3USDCQ">AR Tutorial #2 (Youtube)</a></li>



<li><a href="https://github.com/Unity-Technologies/arfoundation-samples/tree/5.0">AR Foundation Examples</a></li>



<li><a href="http://Build on Android Phone: https://www.youtube.com/watch?v=Nb62z3J4A_A">Build forAndroid Phone</a></li>



<li><a href="https://www.youtube.com/watch?v=-Hr4-XNCf8Y">Build for Apple Phone</a> </li>



<li><a href="https://ahmedschrute.medium.com/creating-ar-multiplayer-app-in-unity-da2b165a8921">Medium-Artikel</a></li>



<li><a href="ps://www.udemy.com/course/build-multiplayer-augmented-reality-ar-games-with-photon/">Udemy Kurs #1</a></li>



<li><a href="https://www.udemy.com/course/kompletter-arcore-arkit-spieleentwickler-augmented-reality/learn/lecture/9644848#overview">Udemy Kurs #2</a></li>
</ul>



<h2 class="wp-block-heading">Projektevernissage</h2>



<figure class="wp-block-image size-large"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_projektevernissage_stand.jpeg"><img loading="lazy" decoding="async" width="1280" height="800" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_projektevernissage_stand-1280x800.jpeg" alt="" class="wp-image-12113"/></a></figure>



<p>Auf der Projektevernissage erhielten wir durchweg positives Feedback zu unserem AR-Spiel &#8220;Car Kickers AR&#8221;. Die Besucher:innen fanden den Einsatz von Augmented Reality und den Multiplayer-Aspekt besonders spannend. Dank einer kurzen Erklärung durch unser Team konnten alle schnell ins Spiel einsteigen. Allerdings war die Steuerung der Fahrzeuge mit dem virtuellen Lenkrad aufgrund hoher Sensibilität problematisch, was die Spielerfahrung beeinträchtigte. Ein weiterer Kritikpunkt war, dass die Fahrzeuge gelegentlich am Rand steckenblieben, was das Spielvergnügen einschränkte. Trotzdem wurde die Möglichkeit, vor Ort direkt mit anderen Besucher:innen am virtuellen Spielfeld zu interagieren, als sehr positiv bewertet. Viele zeigten Interesse an der Möglichkeit zum Download des Spiels aus einem App Store, was für die Attraktivität unseres Spiels spricht.</p>



<p>Auf einem Flipchat wurde ganz analog das Feedback der Besucher:innen gesammelt. Unsere Fragen waren folgende:</p>



<p><strong>Wählt euer Lieblingsfahrzeug?</strong></p>



<figure class="wp-block-image size-large"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_projektevernissage_feedback_01.jpg"><img loading="lazy" decoding="async" width="1540" height="800" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_projektevernissage_feedback_01-1540x800.jpg" alt="" class="wp-image-12114" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2024/03/202403_projektevernissage_feedback_01-1540x800.jpg 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2024/03/202403_projektevernissage_feedback_01-770x400.jpg 770w" sizes="auto, (max-width: 1540px) 100vw, 1540px" /></a></figure>



<p>In der Projektevernissage präsentierten wir eine Vielfalt von Designs für auswählbare Fahrzeuge. Besucher:innen wurden aufgefordert, ihre bevorzugten Designs zu wählen, die letztendlich im Spiel integriert werden. Vier Fahrzeuge mit einem eher verspielten Design, darunter Zug- und Schiffautos, kristallisierten sich als besonders beliebt heraus. Dieses Feedback beeinflusst maßgeblich die endgültige Auswahl und Gestaltung der Fahrzeuge im Spiel.</p>



<p><strong>Wie findest du die Steuerung?</strong></p>



<figure class="wp-block-image size-large"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_projektevernissage_feedback_02.jpg"><img loading="lazy" decoding="async" width="1354" height="800" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_projektevernissage_feedback_02-1354x800.jpg" alt="" class="wp-image-12115"/></a></figure>



<p>Unsere eigenen Tests und das Feedback der Besucher:innen zeigten Probleme mit unserer Steuerung. Eine gezeichnete Stimmungsumfrage mit drei Gesichtszuständen – fröhlich, neutral und traurig – ergab im Durchschnitt eher neutrale oder traurige Gesichter. Empfohlen wurde, die Steuerung zu ändern, beispielsweise von einem Lenkrad auf einen Joystick umzusteigen.</p>



<p><strong>Welches Feature würdet ihr euch noch wünschen?</strong></p>



<figure class="wp-block-image size-large"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_projektevernissage_feedback_03.jpg"><img loading="lazy" decoding="async" width="1210" height="800" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_projektevernissage_feedback_03-1210x800.jpg" alt="" class="wp-image-12116"/></a></figure>



<p></p>



<ul class="wp-block-list">
<li>Jedes Fahrzeug hat eine einzigartige Fähigkeit.</li>



<li>Einen Map Marker.</li>



<li>Stats, also ein bestimmter Aspekt eines fiktiven Charakters (Auto) darstellt,</li>



<li>die z.B. durch Zahlen repräsentiert werden.</li>



<li>Zuschauer:innen können während einem Spiel Hindernisse reinwerfen.</li>



<li>Eine Rampe oder Fallen wie eine Banane als Hindernis.</li>



<li>Eine Optionsmöglichkeit, wo man die Geschwindkeit der Fahrzeuge auswählen kann.</li>



<li>Pilze die man sammeln kann um mit einem Fahrzeug schneller fahren zu können.</li>



<li>Der Ball bounced am Rand wieder zurück, damit dieser nicht vom Feld fällt.</li>



<li>Das Fahrzeug soll am Rand nicht stehen können.</li>
</ul>



<p><strong>Ein Demo-Video einer Testrunde bei der Projektevernissage (16.01.2024)</strong></p>



<figure class="wp-block-embed is-type-video is-provider-vimeo wp-block-embed-vimeo wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Car Kickers AR | Demovideo" src="https://player.vimeo.com/video/903590206?h=c4a16bbab7&amp;dnt=1&amp;app_id=122963" width="500" height="281" frameborder="0" allow="autoplay; fullscreen; picture-in-picture; clipboard-write"></iframe>
</div></figure>



<h2 class="wp-block-heading"><strong>Herausforderungen &amp; Learnings</strong></h2>



<figure class="wp-block-image size-large"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_projektevernissage_spielerinnen_01.jpg"><img loading="lazy" decoding="async" width="1540" height="800" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_projektevernissage_spielerinnen_01-1540x800.jpg" alt="" class="wp-image-12117" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2024/03/202403_projektevernissage_spielerinnen_01-1540x800.jpg 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2024/03/202403_projektevernissage_spielerinnen_01-770x400.jpg 770w" sizes="auto, (max-width: 1540px) 100vw, 1540px" /></a></figure>



<p><strong>Augmented Reality</strong>: Die Integration von AR gestaltet sich dank bereits etablierter Frameworks für Unity sehr leicht und ist auch <a href="https://www.udemy.com/course/augmented-reality-101-ar-foundation-basics/learn/lecture/21900656#overview">in kostenlosen Video Tutorials</a> schnell erlernbar. Das Platzieren eines Spielfeld per Marker funktionierte in einem ersten Prototypen problemlos. An der FH wurde dies jedoch schnell zum Problem aufgrund der spiegelnden Untergründe, weshalb die Spielfeld Platzierung von Malek auf ein Marker-based Modell mit QR Code umgebaut wurde.</p>



<p><strong>Multiplayer Game</strong>: Die Integration von Photon lässt sich schnell anhand zahlreicher Tutorials realisieren. Da das manuelle Joinen in Lobbies etwas komplexer ist, haben wir uns vorerst für ein Quickmatch entschieden. Dabei wird automatisch ein Match gehostet, wenn noch keines existiert. Sollte bereits eines bestehen, wird automatisch gejoined und über den SpawnManager der Spieler im entsprechenden Team platziert.</p>



<p><strong>Physik</strong>: Durch AR-Realisierung verhält sich die Skalierung und Physikberechnung von 3D Objekten sehr merkwürdig. Dies hatten wir nicht am Schirm und bedurfte viel Anpassungen und absurden Werten bei Geschwindigkeit und Masse.</p>



<p><strong>Mögliche zukünftige Features</strong></p>



<figure class="wp-block-gallery has-nested-images columns-2 wp-block-gallery-5 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-full"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/journal-cube_game_concept_v1-scaled.jpg"><img loading="lazy" decoding="async" width="2560" height="1810" data-id="12128" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/journal-cube_game_concept_v1-scaled.jpg" alt="" class="wp-image-12128" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2024/03/journal-cube_game_concept_v1-scaled.jpg 2560w, https://mobile.fhstp.ac.at/wp-content/uploads/2024/03/journal-cube_game_concept_v1-1536x1086.jpg 1536w, https://mobile.fhstp.ac.at/wp-content/uploads/2024/03/journal-cube_game_concept_v1-2048x1448.jpg 2048w" sizes="auto, (max-width: 2560px) 100vw, 2560px" /></a></figure>



<figure class="wp-block-image size-full"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/journal-cube_v1-scaled.jpg"><img loading="lazy" decoding="async" width="2560" height="1810" data-id="12130" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/journal-cube_v1-scaled.jpg" alt="" class="wp-image-12130" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2024/03/journal-cube_v1-scaled.jpg 2560w, https://mobile.fhstp.ac.at/wp-content/uploads/2024/03/journal-cube_v1-1536x1086.jpg 1536w, https://mobile.fhstp.ac.at/wp-content/uploads/2024/03/journal-cube_v1-2048x1448.jpg 2048w" sizes="auto, (max-width: 2560px) 100vw, 2560px" /></a></figure>
</figure>



<h2 class="wp-block-heading">Links</h2>



<ul class="wp-block-list">
<li><a href="https://github.com/fhstpoelten-avr21/ar_multiplayer_game/tree/main  https://kenney.nl/">R</a><a href="https://github.com/fhstpoelten-avr21/ar_multiplayer_game">epository für Car Kickers AR</a></li>
</ul>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/car-kickers-ar/">Car Kickers AR</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Flexibles Multimediawerkzeug mit WebAssembly &#038; FFmpeg</title>
		<link>https://mobile.fhstp.ac.at/studium/studium-projekte/flexibles-multimediawerkzeug-mit-webassembly-ffmpeg/</link>
		
		<dc:creator><![CDATA[Florian Bauer]]></dc:creator>
		<pubDate>Wed, 06 Mar 2024 13:13:38 +0000</pubDate>
				<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Studium]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[FFmpeg]]></category>
		<category><![CDATA[WebAssembly]]></category>
		<guid isPermaLink="false">https://akirchknopf-21110.php.fhstp.cc/?p=12066</guid>

					<description><![CDATA[<p>In der Welt der multimedialen Entwicklung ist FFmpeg, der Open-Source-Werkzeugkasten für Multimedia, längst ein bekannter Name. Dieser mächtige Werkzeugkasten ermöglichte bisher mühelos die Umwandlung von Mediendateien von einem Format in ein anderes, sei es per Kommandozeile oder durch die Integration in bestehende Projekte. Einziger Haken: Die Nutzung von FFmpeg im Webbrowser war bisher auf serverseitige <a class="read-more" href="https://mobile.fhstp.ac.at/studium/studium-projekte/flexibles-multimediawerkzeug-mit-webassembly-ffmpeg/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/studium/studium-projekte/flexibles-multimediawerkzeug-mit-webassembly-ffmpeg/">Flexibles Multimediawerkzeug mit WebAssembly &amp; FFmpeg</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>In der Welt der multimedialen Entwicklung ist FFmpeg, der Open-Source-Werkzeugkasten für Multimedia, längst ein bekannter Name. Dieser mächtige Werkzeugkasten ermöglichte bisher mühelos die Umwandlung von Mediendateien von einem Format in ein anderes, sei es per Kommandozeile oder durch die Integration in bestehende Projekte. Einziger Haken: Die Nutzung von FFmpeg im Webbrowser war bisher auf serverseitige Integration beschränkt, bei der Dateien auf dem Server hochgeladen und transkodiert werden. Doch dank der Entwicklung von WebAssembly (wasm) und der Umsetzung eines FFmpeg-Builds steht der Verwirklichung eines serverlosen Multimedia-Transcoders nichts mehr im Wege.</p>



<h2 class="wp-block-heading">WebAssembly</h2>



<p>WebAssembly eröffnet Entwickler:innen die Möglichkeit, leistungsstarke Funktionen aus anderen Sprachen direkt ins Web zu integrieren. In den vergangenen Jahren haben kreative Köpfe diese Möglichkeiten intensiv genutzt, um das volle Potenzial von WebAssembly auszuschöpfen.</p>



<p>WebAssembly ist im Wesentlichen ein binäres Anweisungsformat. Obwohl das zunächst kompliziert klingen mag, lässt es sich als eine gemeinsame Sprache definieren, die von Browsern verstanden und nahezu in nativer Geschwindigkeit ausgeführt werden kann. Im Gegensatz zu JavaScript, das hauptsächlich eine textbasierte Skriptsprache ist, ist WebAssembly als Low-Level-Sprache konzipiert, die es ermöglicht, Hochsprachen wie C, C++ oder Rust in ein binäres Format zu kompilieren, das im Browser ausgeführt werden kann.</p>



<p>Traditionelle Webanwendungen verlassen sich stark auf JavaScript für ihre Funktionalität. Obwohl JavaScript vielseitig und zugänglich ist, hat es bestimmte Einschränkungen bei leistungsintensiven Aufgaben wie 3D-Rendering, Videobearbeitung oder wissenschaftlichen Simulationen.</p>



<p>WebAssembly begegnet diesen Einschränkungen, indem es eine Möglichkeit bietet, solche Aufgaben mit auszuführen. Dies wird erreicht, indem WebAssembly näher am Maschinencode ist und Hardware-Ressourcen effizienter nutzt.</p>



<h2 class="wp-block-heading">Funktionsweise von WebAssembly</h2>



<p>Um WebAssembly besser zu verstehen, werfen wir einen vereinfachten Blick darauf, wie es funktioniert:</p>



<p><strong>Kompilierung:</strong> Wir schreiben einen Code in einer Hochsprache wie C, C++, Rust usw. Dann kompilieren wir diesen Code in eine WebAssembly-Binärdatei (mit der Erweiterung .wasm). Diese Binärdatei ist stark optimiert für eine schnelle Ausführung.</p>



<p><strong>Laden:</strong> Wenn wir eine Webseite laden, die ein WebAssembly-Modul enthält, lädt der Browser die .wasm-Datei genauso wie jede andere Ressource.</p>



<p><strong>Ausführung:</strong> Einmal geladen, wird der WebAssembly-Code von der virtuellen Maschine des Browsers ausgeführt. Er läuft nahezu mit nativer Geschwindigkeit, da er dem Maschinencode näher ist, den die CPU Ihres Computers versteht.</p>



<p><strong>Integration:</strong> WebAssembly kann nahtlos mit JavaScript interagieren. Wire können WebAssembly-Funktionen von JavaScript aus aufrufen und umgekehrt, was eine reibungslose Integration in bestehende Webanwendungen ermöglicht.</p>



<h2 class="wp-block-heading">Vorteile von WebAssembly</h2>



<p><strong>Geschwindigkeit</strong>: Wasm erreicht im Browser nahezu native Leistung, indem es von gängigen Fähigkeiten der Hardware nutzt. Ein weiterer Faktor für die Geschwindigkeit von Wasm ist, dass der Code selbst ein effizientes Binärformat auf niedriger Ebene ist, das schneller von Browsern geladen und ausgeführt werden kann</p>



<p><strong>Sicherheit</strong>: Wasm wird in einer speichersicheren, abgeschotteten Umgebung ausgeführt, die Datenkorruption und Sicherheitsverletzungen verhindern. Wasm gewährt keinen Zugriff auf die Umgebung, in der der Code ausgeführt wird. Wasm kann auf Systemressourcen zugreifen und E/A durchführen, wenn dies erlaubt wird.</p>



<p><strong>Portabilität:</strong> Wasm ist plattformunabhängig, die Architektur von Wasm versucht, keine Annahmen über die zugrunde liegende Hardware zu treffen, auf der es ausgeführt wird. Dies bedeutet, dass Wasm darauf ausgelegt ist, sowohl von gängigen als auch von modernen Hardwarekomponenten zu profitieren. Wasm ist im Web immer verbreiteter geworden, aber es ist möglich, es außerhalb des Webs auszuführen, dank seiner plattformunabhängigen Architektur.</p>



<h2 class="wp-block-heading">ffmpeg.wasm</h2>



<p>Wie auf der GitHub-Seite des Projekts angegeben, ist ffmpeg.wasm eine WebAssembly- und JavaScript-Portierung von FFmpeg. Es handelt sich dabei um eine Open-Source-Software-Suite, die mehrere Bibliotheken und Programme zur Verwaltung von Audio-, Video-, Streams- und anderen Mediendateien enthält. All diese Tools können über die ffmpeg-Befehlszeile aufgerufen und ausgeführt werden. Für einen guten Einstieg in die Welt von FFmpeg kann folgenden Web-Guide der<a href="https://amiaopensource.github.io/ffmprovisr/#basics"> Association of Moving Image Archivists (AMIA) </a>aus Los Angelese empfohlen werden. Hier werden die wichtigsten Bestandteile von FFmpeg anhand von praxistauglichen Beispielen veranschaulicht.</p>



<figure class="wp-block-image size-full"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_ffmpeg_guide.jpg"><img loading="lazy" decoding="async" width="973" height="580" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_ffmpeg_guide.jpg" alt="" class="wp-image-12072"/></a></figure>



<p>FFmpeg ist in C-Code programmiert und kann klarerweise nicht nativ im Browser ausgeführt werden. Wie funktioniert also ffmpeg.wasm? Auf einer höheren Ebene funktioniert ffmpeg.wasm, indem der ursprüngliche C-Code in WebAssembly transpiliert wird. Da WebAssembly im Browser ausgeführt werden kann, bringt es die Medienverarbeitungsfunktionen von FFmpeg direkt zum Client ins Web.</p>



<figure class="wp-block-image size-full"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_ffmpeg_wasm_build.jpg"><img loading="lazy" decoding="async" width="257" height="130" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_ffmpeg_wasm_build.jpg" alt="" class="wp-image-12073"/></a></figure>



<p>Daher ermöglicht ffmpeg.wasm die Verarbeitung von Video- und Audioinhalten in JavaScript-basierten Webanwendungen. Im Detail ermöglicht es Video- und Audioaufzeichnung, Formattranskodierung, Video- und Audio-Bearbeitung sowie Video-Skalierung. Obwohl es eine auf WebAssembly basierende Bibliothek ist, können wir diese in JavaScript-Code genauso verwenden wie jede andere npm-Bibliothek. Das ist die Stärke von Wasm. Da es nach Wasm übersetzt wird, können wir ffmpeg.wasm direkt in Ihrem Browser nutzen, ohne sich um Leistungsprobleme sorgen zu müssen.</p>



<p>Wenn Sie beispielsweise Transcoding-Anwendungen im Browser bereitstellen möchten, müssen Sie die Videoclips jetzt nicht mehr über das Netzwerk an einen Server senden. Stattdessen können Sie dies lokal und sogar ohne Internetverbindung durchführen.</p>



<h2 class="wp-block-heading">Achitektur von ffmpeg.wasm</h2>



<figure class="wp-block-image size-full"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/ffmpegwasm-arch-918a2b3e4629947bae75e8f42a779def.png"><img loading="lazy" decoding="async" width="811" height="483" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/ffmpegwasm-arch-918a2b3e4629947bae75e8f42a779def.png" alt="" class="wp-image-12070"/></a></figure>



<p>Multimedia-Transkodierung ist eine ressourcenintensive Aufgabe, die Sie nicht im Hauptthread ausführen möchten. Daher übertragen wir diese Aufgabe in ffmpeg.wasm standardmäßig an den Web Worker (ffmpeg.worker). Dadurch sind fast alle Funktionsaufrufe in ffmpeg.wasm asynchron, und es wird empfohlen, die Syntax von async/await zu verwenden.</p>



<p>Das Konzept von<code> ffmpeg-core</code> in ffmpeg.wasm ist wie der Motor eines Autos. Es ist nicht nur der wichtigste Teil von ffmpeg.wasm, sondern auch ein austauschbares Bauteil. Derzeit pflegen wir einen Single-Thread-Kern<code> (@ffmpeg/core) </code>und eine Multi-Thread-Version<code> (@ffmpeg/core-mt).</code> Man kann einen eigenen Kern erstellen (z. B. einen Kern nur mit x264-Bibliothek, um die Dateigröße von ffmpeg-core.wasm zu minimieren) mithilfe der Build-Skripte im Repository von ffmpeg.wasm.</p>



<p>ffmpeg.worker lädt den WebAssembly-Code (ffmpeg-core) von CDN herunter und initialisiert ihn in WorkerGlobalScope. Für jede zu verarbeitende Eingabevideodatei müssen wir sie zuerst im Dateisystem von ffmpeg-core platzieren und das Ergebnis auch aus dem Dateisystem von ffmpeg-core lesen, sobald es fertig ist.</p>



<p>Wenn wir eine Multi-Thread-Version von ffmpeg-core verwenden, werden von ffmpeg-core innerhalb von ffmpeg.worker mehr Web Worker erstellt.</p>



<h2 class="wp-block-heading">Die wichtigsten Schritte bei ffmpeg.wasm</h2>



<p>Um ffmpeg.wasm im jeweiligen JavaScript Projekt verwenden zu können, muss das Package @ffmpeg/core per npm oder yarn installiert werden.</p>



<pre class="wp-block-code"><code><code>npm install @ffmpeg/core<br>yarn add @ffmpeg/core</code></code></pre>



<p>Nun kann bereits auf die komplette Funktionalität von ffmpeg.wasm im Projekt zugegriffen werden. Ein kurzes Beispiel dazu, wo eine Videodate „test.avi“ in ein „test.mp4“ mittels JavaScript Code transcodiert wird.</p>



<figure class="wp-block-image size-full"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202404_mw-install_02.jpg"><img loading="lazy" decoding="async" width="630" height="269" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202404_mw-install_02.jpg" alt="" class="wp-image-12069"/></a></figure>



<p><strong>ffmpeg.load()</strong></p>



<p>Ist eine erforderliche API, die zu Beginn aufgerufen werden muss, bevor FFmpeg verwendet wird. Was in dieser API passiert, ist:</p>



<ul class="wp-block-list">
<li>Download von ffmpeg-core.js vom Remote-Server</li>



<li>Instanziierung des wasm-Codes von ffmpeg.wasm.</li>
</ul>



<p>Abhängig von Ihrer Netzwerkgeschwindigkeit und der Hardware der Host-Maschine kann dieser Vorgang mehrere Minuten dauern.</p>



<p><strong>Dateisystem (FS)</strong></p>



<p>Wenn wir uns die API von ffmpeg.wasm ansehn, finden wir z.B. `ffmpeg.FS()`, um Dateisystemoperationen durchzuführen. (In ffmpeg.wasm verwenden wir MEMFS / Memory File System.) Wir können uns dieses FS wie eine virtuelle Festplatte vorstellen, auf der wir die Eingabedatei ablegen und die Ausgabedatei aus dem ffmpeg.wasm-Befehl ziehen können. Dies ist wesentlich, da wir minimale Änderungen am FFmpeg-Quellcode vornehmen und die größtmögliche Ähnlichkeit zur ursprünglichen Befehlszeilenschnittstelle beibehalten möchten. Einige Befehlsoperationen, die man z.B. verwenden kann:</p>



<p><code>ffmpeg.FS('writeFile', 'filename', data)</code></p>



<p>Schreibt eine Datei in das MEMFS als Input für ffmpeg.wasm.</p>



<p><code>ffmpeg.FS('readFile', 'filename')</code></p>



<p>List eine Datei aus MEMFS als Output für ffmpeg.wasm.</p>



<p><code>ffmpeg.wasm ffmpeg.FS('unlink', 'filename')</code></p>



<p>Löscht eine Datei in MEMFS.</p>



<p><code>ffmpeg.FS('readdir', '/')</code></p>



<p>Listet die Dateien innerhalb des angegebenen Pfads.</p>



<p>Die vollständige <a href="https://emscripten.org/docs/api_reference/Filesystem-API.html">Doku der File System API</a> findet man auf emscripten.</p>



<p><strong>Web Workers</strong></p>



<p>Wenn wir `ffmpeg.run()` ausführen, werden möglicherweise viele Web Workers erstellt. Dies ist eine normale Situation, da Web Workers Threads in FFmpeg simulieren, was gut ist, da wir nicht möchten, dass ffmpeg.wasm unseren Hauptthread blockiert.</p>



<p><strong>SharedArrayBuffer</strong></p>



<p>Um das Konzept der Web Worker von ffmpeg.wasm umzusetzen, muss der Speicher gemeinsam genutzt werden. Dazu müssen wir SharedArrayBuffer-Objekte von einem Agenten im Cluster zu einem anderen verwenden (ein Agent ist entweder das Hauptprogramm der Webseite oder einer ihrer Webworker).</p>



<p>SharedArrayBuffer ist ein ziemlich neuer Datentyp in JavaScript, der derzeit von den meisten Browsern aus Sicherheitsgründen noch nicht <a href="https://caniuse.com/sharedarraybuffer">vollständig unterstützt</a> wird. Das ist auch das Problem bei der Verwendung von ffmpeg.was in einer mobilen Umgebung. Um in ffmpeg.wasm pthread / mutli-threading-Unterstützung zu ermöglichen, um die Geschwindigkeit zu erhöhen, ist es ein erforderlicher Datentyp. </p>



<figure class="wp-block-image size-full"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_caniuse_sharedarraybuffer.jpg"><img loading="lazy" decoding="async" width="1367" height="420" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_caniuse_sharedarraybuffer.jpg" alt="" class="wp-image-12071"/></a></figure>



<h2 class="wp-block-heading"><strong>Keine vollständige Nutzung der CPU-Fähigkeiten</strong></h2>



<p>Die meisten Bibliotheken, die mit ffmpeg arbeiten (z. B. x264), verwenden Assemblersprache wie x86, um den Prozess zu beschleunigen. Aber leider kann WebAssembly diesen x86-Assemblercode nicht direkt verwenden, da er nicht kompatibel ist oder bestimmte Anweisungen nicht unterstützt werden. Es ist noch ein langer Weg, da sich ffmpeg.wasm noch in einem frühen Stadium, obwohl es im Vergleich zur ursprünglichen Version noch sehr langsam ist, aber mit dem Wachstum und der Entwicklung von WebAssembly wird es immer nützlicher werden.</p>



<h2 class="wp-block-heading">DIY Web Transcoder für lokale Mediendateien</h2>



<p>Um die beschrieben Funktionalitäten von ffmpeg.wasm etwas praktischer darzustellen, wurde ein kleiner adaptierbarer Web Transcoder für Mediendateien (Audio &amp; Video), die lokal vorhanden sind, umgesetzt. Der gesamte Encodingprozess erfolgt clientseitig vollständig im Browser und dafür wird der Web Assembly Build von FFmpeg.wasm verwendet. Für das Frontend wurde React, Ant Design 4.x (UI) und Next.js verwendet.</p>



<h2 class="wp-block-heading">Metadaten</h2>



<p>Für das Transcoding können jede Art an Audio- und Videodaten (lokal) geladen werden. Die einzige Beschränkung bezieht sich auf die Dateigröße seitens von Web Assembly von 2 GB.&nbsp; Metadaten von der eingelesenen Datei werden mittels einem Web Assembly Build dem Medieninfo Tool ffprobe anzeigt. (Funktioniert leider derzeit nur mit Medien mit dem Container .mov &amp; .mp4).</p>



<figure class="wp-block-image size-full"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_mw-metadaten.png"><img loading="lazy" decoding="async" width="561" height="248" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_mw-metadaten.png" alt="" class="wp-image-12075"/></a></figure>



<h2 class="wp-block-heading">Transcoding</h2>



<p>Mit dem Konfigurator kann der gewünschte Export der Mediendatei durchgeführt werden. Dabei stehen folgende Einstellungsmöglichkeiten zur Verfügung. </p>



<ul class="wp-block-list">
<li>Container der Mediendatei für Audio und Video</li>



<li>Video Codec</li>



<li>Audio Codec</li>
</ul>



<figure class="wp-block-image size-full"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_mw-transcoding.jpg"><img loading="lazy" decoding="async" width="530" height="273" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_mw-transcoding.jpg" alt="" class="wp-image-12076"/></a></figure>



<p>Nach Auswahl der gewünschten Optionen wird das FFmpeg Kommando generiert (siehe Screenshot), transcodiert und nach erfolgreichem Export zum Download angeboten.<em>(Aufgrund von Einschränkungen seitens ffmpeg.wasm funktioniert das Transcoding derzeit nur bei Videos bis zu einer Auflösung von 1920x1080px).</em></p>



<p>Das Projekt &#8220;DIY Web-Transcoder&#8221; kann man hier probieren:</p>



<ul class="wp-block-list">
<li><a href="https://multimedia-wunderwerkzeug.vercel.app/">https://multimedia-wunderwerkzeug.vercel.app/</a></li>



<li><a href="https://github.com/untitled-soundtrack/multimedia_wunderwerkzeug">https://github.com/untitled-soundtrack/multimedia_wunderwerkzeug</a></li>
</ul>



<h2 class="wp-block-heading">Fazit</h2>



<p>Die Unterschiede bei den Transcoding-Zeiten zwischen ffmpeg.wasm und der Standalone-Version von FFmpeg sind derzeit noch enorm groß.</p>



<ul class="wp-block-list">
<li>FFmpeg in Terminal (Standalone): speed=~34.1x</li>



<li>Ffmpeg.wasm im Web Browser: speed=~4.26x (Screenshot darunter)</li>
</ul>



<figure class="wp-block-image size-full"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_mw-transcoding_console-1.jpg"><img loading="lazy" decoding="async" width="1049" height="392" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/202403_mw-transcoding_console-1.jpg" alt="" class="wp-image-12080"/></a></figure>



<p>Derzeit ist außerdem die Verarbeitung von Videos mit einer Auflösung größer als 1920x1080px nicht möglich.</p>



<p>In den kommenden Jahren wird voraussichtlich eine erhebliche Verbesserung erfolgen, da eine große Community an der Entwicklung beteiligt ist.</p>



<p>Trotzdem eignet sich ffmpeg.wasm ideal für eine schnelle und unkomplizierte Umwandlung von Mediendateien, ohne die Notwendigkeit einer aufwendigeren Installation von FFmpeg oder anderer Transcoding-Software. Darüber hinaus ermöglicht es die schnelle Generierung von Transcoding-Presets, um bestimmte Produktionsstandards in einem Unternehmen einzuhalten.</p>



<h2 class="wp-block-heading">Quellen</h2>



<ul class="wp-block-list">
<li><a href="https://webassembly.org/">https://webassembly.org/</a></li>



<li><a href="https://medium.com/appfoster/a-guide-to-webassembly-what-you-need-to-know-319d28bf5195">https://medium.com/appfoster/a-guide-to-webassembly-what-you-need-to-know-319d28bf5195</a></li>



<li><a href="https://ffmpegwasm.netlify.app/">https://ffmpegwasm.netlify.app/</a></li>



<li><a href="https://www.slashcam.de/news/single/FFmpeg-direkt-im-Browser-nutzen---FFMPEG-WASM-17603.html">https://www.slashcam.de/news/single/FFmpeg-direkt-im-Browser-nutzen&#8212;FFMPEG-WASM-17603.html</a></li>



<li><a href="https://amiaopensource.github.io/ffmprovisr/">https://amiaopensource.github.io/ffmprovisr/</a></li>



<li><a href="https://jeromewu.github.io/ffmpeg-wasm-a-pure-webassembly-javascript-port-of-ffmpeg/">https://jeromewu.github.io/ffmpeg-wasm-a-pure-webassembly-javascript-port-of-ffmpeg/</a></li>



<li><a href="https://caniuse.com/sharedarraybuffer">https://caniuse.com/sharedarraybuffer</a></li>



<li><a href="https://ffmpeg.org/ffprobe.html">https://ffmpeg.org/ffprobe.html</a></li>
</ul>



<h2 class="wp-block-heading">Bilder</h2>



<ul class="wp-block-list">
<li><a href="https://www.heritageopendays.org.uk/static/fa462373-3489-439c-8e8cb9e485b77ff3/1105x736_highestperformance__4a7c7e45a350/BFIArchiveTour2019c2DarrenBradeBFI.jpg">https://www.heritageopendays.org.uk/</a> &#8211; Header-Hintergrundbild: BFI / Darren Brade </li>



<li><a href="https://amiaopensource.github.io/ffmprovisr/">https://amiaopensource.github.io/ffmprovisr/</a></li>



<li><a href="https://ffmpegwasm.netlify.app/">https://ffmpegwasm.netlify.app/</a></li>



<li><a href="https://caniuse.com/sharedarraybuffer">https://caniuse.com/sharedarraybuffer</a></li>
</ul>
<p>The post <a href="https://mobile.fhstp.ac.at/studium/studium-projekte/flexibles-multimediawerkzeug-mit-webassembly-ffmpeg/">Flexibles Multimediawerkzeug mit WebAssembly &amp; FFmpeg</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Cypress Testing mit Pingo</title>
		<link>https://mobile.fhstp.ac.at/development/cypress-testing-mit-pingo/</link>
		
		<dc:creator><![CDATA[Florian Bauer]]></dc:creator>
		<pubDate>Wed, 04 Oct 2023 23:23:53 +0000</pubDate>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Studium]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[Cypress]]></category>
		<category><![CDATA[Testing Framework]]></category>
		<guid isPermaLink="false">https://akirchknopf-21110.php.fhstp.cc/?p=11339</guid>

					<description><![CDATA[<p>Im meinem vorherigen Blogbeitrag habe ich über das leistungsstarke JavaScript-Testing-Framework namens Cypress gesprochen, das speziell für Webbrowser-Anwendungen entwickelt wurde. Ich verwende Cypress, um die Zuverlässigkeit unserer neuen Webanwendung namens Pingo sicherzustellen. Pingo ist ein Webprojekt, das innerhalb einer Woche von unserer Masterklasse während der Extreme Programming Week entwickelt wurde. Das Hauptziel von Pingo ist es, <a class="read-more" href="https://mobile.fhstp.ac.at/development/cypress-testing-mit-pingo/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/development/cypress-testing-mit-pingo/">Cypress Testing mit Pingo</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Im meinem <a href="https://akirchknopf-21110.php.fhstp.cc/allgemein/testing-frameworks-universum-fuer-javascript-und-cypress/">vorherigen Blogbeitrag</a> habe ich über das leistungsstarke JavaScript-Testing-Framework namens Cypress gesprochen, das speziell für Webbrowser-Anwendungen entwickelt wurde. Ich verwende Cypress, um die Zuverlässigkeit unserer neuen Webanwendung namens Pingo sicherzustellen.</p>



<p>Pingo ist ein Webprojekt, das innerhalb einer Woche von unserer Masterklasse während der Extreme Programming Week entwickelt wurde. Das Hauptziel von Pingo ist es, unseren Nutzer:innen eine interaktive Karte zur Verfügung zu stellen, auf der sie verschiedene &#8220;Geostops&#8221; erkunden können. Diese Geostops umfassen versteckte Naturjuwelen, kulturelle Highlights und historische Sehenswürdigkeiten. Um sicherzustellen, dass Pingo reibungslos funktioniert und ein großartiges Erlebnis bietet, setze ich Cypress als Testing-Framework ein.</p>



<p>Mit Cypress können wir automatisierte Tests für Pingo erstellen, um sicherzustellen, dass alle Funktionen einwandfrei funktionieren. Das bedeutet, dass wir sicherstellen können, dass die Karte einwandfrei funktioniert, die Geostops korrekt angezeigt werden und die Benutzerfreundlichkeit gewährleistet ist.</p>



<p>Im Vordergrund haben wir Ionic und Angular eingesetzt, um das Frontend zu gestalten und zu steuern. Gleichzeitig haben wir im Backend auf NestJS gesetzt, um die Funktionalitäten unserer Anwendung zu unterstützen und zu erweitern.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><strong>Frontend &amp; Backend</strong></h2>



<p>Ionic und Angular sind bekanntermaßen eine perfekte Kombination, wenn es darum geht, mobile und webbasierte Anwendungen zu entwickeln. Ionic bietet eine umfangreiche Sammlung von UI-Komponenten und Tools, die die Gestaltung und Benutzeroberflächen-Entwicklung erleichtern. Angular hingegen bietet ein solides Framework für die Strukturierung und Organisation des Codes. Die Integration dieser beiden Technologien ermöglichte es uns, eine benutzerfreundliche und ansprechende Oberfläche für Pingo zu erstellen.</p>



<p>Auf der anderen Seite haben wir NestJS im Backend verwendet. NestJS ist ein leistungsstarkes und modulares Framework für die Entwicklung von Node.js-Anwendungen. Es ermöglicht uns, APIs und Backend-Services effizient zu erstellen und zu verwalten. Mit NestJS konnten wir sicherstellen, dass unsere Anwendung zuverlässig und skalierbar ist, was für eine interaktive Karte wie Pingo von großer Bedeutung ist.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Installation</h2>



<p>Um Cypress in unserem Frontend-Ordner zu installieren, verwenden wir den beliebten Package Manager &#8220;yarn&#8221;. Mit nur wenigen Befehlen könnt auch ihr Cypress in eurem Projekt nutzen.</p>



<p>Verwendet den folgenden Befehl, um Cypress in eurem Frontend-Ordner zu installieren:</p>



<p><code>yarn add cypress --dev</code></p>



<p>Dadurch wird Cypress als Entwicklungspaket hinzugefügt, sodass ihr es für eure Tests nutzen könnt.</p>



<p>Nachdem ihr diese Schritte abgeschlossen habt, ist Cypress in eurem Projekt installiert und einsatzbereit.</p>



<p><strong>Typescript</strong></p>



<p>Die Verwendung von TypeScript in unserem Projekt ist eine großartige Möglichkeit, um unseren Code robuster und besser wartbar zu machen. Allerdings erfordert dies auch einige Anpassungen in der <code>tsconfig.json</code>-Datei, um sicherzustellen, dass TypeScript alles korrekt erkennt und funktioniert.</p>



<p>Zuerst einmal müsst ihr sicherstellen, dass ihr die <code>tsconfig.json</code>-Datei eures Projekts öffnet. Diese Datei enthält die Konfigurationseinstellungen für TypeScript.</p>



<p>In der <code>tsconfig.json</code> könnt ihr verschiedene Compiler-Optionen festlegen, die das Verhalten von TypeScript beeinflussen. Zum Beispiel könnt ihr die Zielversion von JavaScript, den Modulstandard und die Ausgabeoptionen festlegen. Hier ist ein einfaches Beispiel:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="942" height="239" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/10/tsconfig_json-einstellungen_01.png" alt="" class="wp-image-11342"/></figure>



<p></p>



<p>Außerdem müssen hier auch etwaige Plugins für Typenerkennung ergänzt werden. Für Pingo habe ich folgende Plugins installiert:</p>



<p><a href="https://github.com/dmtrKovalenko/cypress-real-events">Cypress Real Events </a><br>Cypress Standard-Ereignisse werden simuliert. Das bedeutet, dass alle Ereignisse wie cy.click oder cy.type von Javascript abgefeuert werden. Deshalb sind diese Ereignisse nicht vertrauenswürdig (event.isTrusted ist falsch) und sie können sich etwas anders verhalten als echte native Ereignisse. In manchen Fällen kann es jedoch unmöglich sein, simulierte Ereignisse zu verwenden, z.B. um eine native Meldung zu füllen oder in die Zwischenablage zu kopieren. Dieses Plugin behebt dieses Problem.</p>



<p><a href="https://www.npmjs.com/package/cypress-plugin-steps">Cypress Steps plugin </a><br>Ein kleines Cypress-Hilfsprogramm, das Ihre Testschritte in die Zeitleiste und die Fehlerprotokolle einfügt.</p>



<p></p>



<p>Diese Optionen können je nach den Anforderungen eures Projekts angepasst werden. Stellt sicher, dass ihr die Datei speichert und euer Projekt neu erstellt oder den TypeScript-Compiler neu startet, damit die Änderungen wirksam werden.</p>



<p><strong>Projektstruktur anpassen</strong></p>



<p>Es ist wichtig, die Projektstruktur anzupassen, damit Cypress die richtigen Dateien und Ordner finden kann. Cypress erstellt automatische eine vordefinierte Ordnerstruktur, diese kann jedoch wie folgt ergänzt werden:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="453" height="377" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/10/cypress-projekt_struktur.png" alt="" class="wp-image-11347"/></figure>



<ul class="wp-block-list">
<li>e2e: Hier kannst du die Testdaten ablegen.</li>



<li>screenshots/videos: Erstellte Fotos/Video von den Testdurchläufen.</li>



<li>support: Dieser Ordner enthält allgemeine Unterstützungsdateien für deine Tests.</li>



<li>commands: Die Konfigurationsdatei für Custom Commands.</li>
</ul>



<p><strong>Cypress starten</strong></p>



<p>Verwende den folgenden Befehl, um das Cypress zu öffnen:</p>



<p><code>yarn cypress open</code></p>



<p>Dieser Befehl startet den Cypress-Testrunner und öffnet ein Fenster, indem du den gewünschten Browser und deine Tests (e2e specs) auswählen und ausführen kannst.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1540" height="719" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/10/cypress-gui_01-1540x719.png" alt="" class="wp-image-11349"/></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Tests schreiben</h2>



<p>Beim erstmaligen Starten von Cypress kann mithilfe der GUI ein Testfile (*.cy.ts) im Ordner cypress/e2e/ erstellt werden. Ein Testbeispielcode für ein Loginversuch mit falschen Daten sieht so aus:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="887" height="248" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/10/cypress-test_case_01.png" alt="" class="wp-image-11350"/></figure>



<p>Um eine große Bandbreite an möglichen Testinputs liefern zu können, können mithilfe der Fixtures (*.json) Objekte für die jeweiligen Testfälle gelesen und abgearbeitet werden. Ein Beispiel dafür <code>station.json</code>:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="513" height="255" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/10/fixture-01.png" alt="" class="wp-image-11351"/></figure>



<p><strong>Custom Commands</strong></p>



<p>Benutzerdefinierte Befehle ermöglichen es dir, häufig verwendete Aktionen oder Funktionen in deinen Tests zu abstrahieren und wiederzuverwenden. Dies ist besonders nützlich, wenn du komplexe Workflows in deinen Tests erstellen möchtest oder wenn du dieselben Aktionen in mehreren Tests ausführst.</p>



<p><strong>Wie erstellt man benutzerdefinierte Befehle?</strong></p>



<p>Die Erstellung von benutzerdefinierten Befehlen in Cypress ist relativ einfach.</p>



<p>In der Regel erstellst du einen Ordner namens commands in deinem Cypress-Verzeichnis, um deine benutzerdefinierten Befehle zu organisieren.&nbsp;</p>



<p>Schreibe deine benutzerdefinierten Befehle: In diesem Ordner kannst du nun TypeScript-Dateien (mit der Endung .ts) erstellen, die deine benutzerdefinierten Befehle definieren. Das Beispiele wäre eine kleine Funktion, die die Cypress get-Funktion erweitert:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1087" height="149" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/10/custom_command-01.png" alt="" class="wp-image-11353"/></figure>



<p>Ergänze außerdem den neuen Command in e2e.ts.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1031" height="612" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/10/e2e.ts_.png" alt="" class="wp-image-11352"/></figure>



<p>Nachdem du deine benutzerdefinierten Befehle erstellt hast, kannst du sie einfach in deinen Tests verwenden, indem du den Befehlsnamen aufrufst. Zum Beispiel:</p>



<p><code>cy.getByDataCy('app-button_profile').click();</code></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">e2e Test Cases</h2>



<p><strong>Login mit falschen und richtigen Userdaten</strong><br>Eine der grundlegenden Funktionen von Pingo ist die Benutzeranmeldung. Daher habe ich umfangreiche Tests entwickelt, um sicherzustellen, dass Benutzer sich problemlos anmelden können, sowohl mit korrekten als auch mit falschen Anmeldeinformationen. Dies stellt sicher, dass unser Anmeldesystem sicher und zuverlässig ist.</p>



<p><strong>Registrierung mit falschen und richtigen Daten</strong><br>Neben der Anmeldung habe ich auch Tests für die Benutzerregistrierung entwickelt. Es wird überprüft, ob die Registrierung mit korrekten Daten erfolgreich ist und ob unser System fehlerhafte oder unzulässige Daten ordnungsgemäß abweist. Dies gewährleistet, dass neue Benutzerkonten korrekt erstellt werden.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1540" height="800" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/10/cypress_test-register_01-1540x800.png" alt="" class="wp-image-11355" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2023/10/cypress_test-register_01-1540x800.png 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2023/10/cypress_test-register_01-770x400.png 770w" sizes="auto, (max-width: 1540px) 100vw, 1540px" /></figure>



<p><strong>Logout des aktuellen Users</strong><br>Das Abmelden ist genauso wichtig wie die Anmeldung.</p>



<p><strong>Aktualisierung der Daten des eingeloggten Users</strong><br>Benutzer müssen in der Lage sein, ihre Profile zu aktualisieren. Die Tests stellen sicher, dass Benutzer ihre Profilinformationen korrekt ändern können und dass diese Änderungen im System gespeichert werden.</p>



<p><strong>Teste Onboarding und Tutorial</strong><br>Ein reibungsloses Onboarding und ein hilfreiches Tutorial sind entscheidend für die Benutzererfahrung.</p>



<p><strong>Erstelle Pingos mit mehreren Stationen</strong><br>Eine der Hauptfunktionen von Pingo ist die Erstellung von &#8220;Pingos&#8221; mit mehreren Stationen und unterschiedlichen Typen. Die Tests stellen sicher, dass Benutzer problemlos komplexe Pingos erstellen können und dass diese auf der Karte korrekt angezeigt werden.</p>



<p><strong>Besuche Pingos und deren Station auf der Karte</strong><br>Dies stellt sicher, dass die Kartendarstellung korrekt funktioniert.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1540" height="800" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/10/cypress_test-map_visit-1540x800.jpg" alt="" class="wp-image-11354" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2023/10/cypress_test-map_visit-1540x800.jpg 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2023/10/cypress_test-map_visit-770x400.jpg 770w" sizes="auto, (max-width: 1540px) 100vw, 1540px" /></figure>



<p><strong>Teste API Calls und deren richtige Darstellung im Frontend</strong><br>Das gewährleistet, dass unsere Anwendung effizient mit dem Backend kommuniziert und die richtigen Informationen bereitstellt.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Fazit</h2>



<p>Abschließend lässt sich sagen, dass Cypress ein äußerst leistungsfähiges Werkzeug für schnelle End-to-End-Tests im Frontend von Ionic- und Angular-Anwendungen ist. Die bemerkenswerte Benutzerfreundlichkeit und die ausgezeichnete Dokumentation auf cypress.io haben den Einstieg in dieses Testing-Framework mühelos gemacht. Ich konnte Tests problemlos erstellen und unsere Anwendungen umfassend überprüfen.</p>



<p>Allerdings möchte ich darauf hinweisen, dass die Nachstellung von Swipe- und Touch-Bewegungen auf der Oberfläche eine Herausforderung darstellte, die Cypress derzeit nicht vollständig abdeckt.</p>



<p>Learning: Dennoch hat Cypress zweifellos meinen Einstieg in die Entwicklung von Testprozessen und Workflows ermöglicht und wird weiterhin eine wertvolle Ressource für Frontend-Testing bleiben.</p>
<p>The post <a href="https://mobile.fhstp.ac.at/development/cypress-testing-mit-pingo/">Cypress Testing mit Pingo</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Testing-Framework Universum für JavaScript und Cypress</title>
		<link>https://mobile.fhstp.ac.at/allgemein/testing-frameworks-universum-fuer-javascript-und-cypress/</link>
		
		<dc:creator><![CDATA[Florian Bauer]]></dc:creator>
		<pubDate>Wed, 04 Oct 2023 21:15:22 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[Cypress]]></category>
		<category><![CDATA[Testing Framework]]></category>
		<guid isPermaLink="false">https://akirchknopf-21110.php.fhstp.cc/?p=11328</guid>

					<description><![CDATA[<p>Von React über Angular bis hin zu Vue.js – die Vielfalt an Frameworks ist schier endlos und wächst stetig. Mit dieser Fülle an Optionen kommen jedoch auch Herausforderungen, insbesondere wenn es um die Qualitätssicherung unserer Webanwendungen geht. In diesem Blogbeitrag tauchen wir in die Welt der Testing-Frameworks ein, beleuchten, warum zuverlässige Tests von entscheidender Bedeutung <a class="read-more" href="https://mobile.fhstp.ac.at/allgemein/testing-frameworks-universum-fuer-javascript-und-cypress/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/testing-frameworks-universum-fuer-javascript-und-cypress/">Testing-Framework Universum für JavaScript und Cypress</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Von React über Angular bis hin zu Vue.js – die Vielfalt an Frameworks ist schier endlos und wächst stetig. Mit dieser Fülle an Optionen kommen jedoch auch Herausforderungen, insbesondere wenn es um die Qualitätssicherung unserer Webanwendungen geht. In diesem Blogbeitrag tauchen wir in die Welt der Testing-Frameworks ein, beleuchten, warum zuverlässige Tests von entscheidender Bedeutung sind, und stellen einige bewährte Testing-Frameworks vor, die dabei helfen, die Stabilität und Performance der Projekte zu gewährleisten.</p>



<p>In diesem Artikel werden wir auch einen Schwerpunkt auf Cypress legen. Wir werden erläutern, warum Cypress eine gute Wahl ist und es mit anderen Frameworks vergleichen. Außerdem werden wir die Testkonzepte beleuchten, die mit Cypress umgesetzt werden können.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Übersicht über Testing Frameworks für JavaScript und Frontend</h2>



<p>Bevor wir uns in die Details vertiefen, werfen wir einen Blick auf einige der gängigsten Testing Frameworks für JavaScript und Frontend-Entwicklung:</p>



<p><strong><a href="https://jestjs.io/">Jest</a></strong><br>Jest ist ein weit verbreitetes JavaScript-Testing-Framework, das sich hervorragend für Unit-Tests eignet. Es wird oft in Kombination mit React-Anwendungen verwendet und bietet eine einfache Syntax und leistungsstarke Testfunktionen.</p>



<p><strong>Unit-Tests (Komponententests)</strong><br>Sind Tests, bei denen einzelne Komponenten oder Units eines Programms isoliert getestet werden. Diese Komponenten können Funktionen, Methoden oder Klassen sein. Das Hauptziel von Unit-Tests besteht darin, sicherzustellen, dass jede einzelne Komponente ordnungsgemäß funktioniert und die erwarteten Ergebnisse liefert, unabhängig von anderen Teilen des Codes.</p>



<p><strong><a href="https://mochajs.org/">Mocha</a></strong><br>Mocha ist ein äußerst flexibles und anpassbares JavaScript-Testframework. Es unterstützt verschiedene Assertion-Libraries wie Chai und kann sowohl für Unit- als auch für Integrationstests verwendet werden.</p>



<p><strong>Integrationstests</strong><br>Sind eine Art von Softwaretests, bei denen mehrere Komponenten oder Module einer Anwendung zusammengeführt und als Einheit getestet werden, um sicherzustellen, dass sie reibungslos miteinander interagieren. Das Hauptziel von Integrationstests besteht darin, sicherzustellen, dass die verschiedenen Teile einer Anwendung korrekt zusammenarbeiten und die erwarteten Ergebnisse liefern, wenn sie zusammengefügt werden.</p>



<p><strong><a href="https://jasmine.github.io/">Jasmine</a></strong><br>Jasmine ist ein Behavior-Driven Development (BDD)-Framework für JavaScript, das klare und leicht verständliche Syntax bietet. Es eignet sich hervorragend für BDD-orientierte Teams und Projekte.</p>



<p><strong><a href="https://www.selenium.dev/">Selenium</a></strong><br>Selenium ist ein plattformübergreifendes Framework zur Browser-Automatisierung und wird oft für End-to-End-Tests eingesetzt. Es unterstützt verschiedene Programmiersprachen, darunter JavaScript, und ermöglicht das Testen in verschiedenen Browsern.</p>



<p><strong><a href="https://www.cypress.io/">Cypress</a></strong><br>Cypress ist ein End-to-End-Testing-Framework, das speziell für moderne Frontend-Entwicklung entwickelt wurde. Es bietet eine einfache Herangehensweise an das Testen von Webanwendungen.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Warum Cypress?</h2>



<p>Cypress sticht aus mehreren Gründen unter den Testing Frameworks hervor und bietet eine Reihe überzeugender Vorteile.</p>



<p><strong>Hauptargumente als Testing-Framework für JavaScript Frameworks</strong></p>



<ul class="wp-block-list">
<li>Ein All-in-One-Test-Framework, Assertion Library, mit Mocking und Stubbing</li>



<li>Schwerpunkt auf E2E- und Komponententests &#8211; Tests unter realen Bedingungen</li>



<li>Läuft im Browser und ist in JavaScript geschrieben</li>



<li>Nativer Zugriff auf das DOM und auf Ihre Anwendung</li>
</ul>



<p><strong>Einfache Installation und Benutzerfreundlichkeit</strong><br>Die Installation von Cypress ist denkbar einfach. Es kann mit npm oder yarn installiert werden und ist in wenigen Minuten einsatzbereit sein. Cypress bietet eine intuitive API und eine klare Syntax, die auch für Entwickler ohne umfangreiche Testing-Erfahrung leicht verständlich ist.</p>



<p><strong>Echtzeit-Reloading</strong><br>Eine der herausragenden Eigenschaften von Cypress ist die Fähigkeit, Tests in Echtzeit zu beobachten, während sie ausgeführt werden. Entwickler können Tests schreiben und gleichzeitig die Anwendung entwickeln, da sie sofortiges Feedback über den Teststatus erhalten.</p>



<p><strong>End-to-End-Testing</strong><br>Cypress wurde speziell für End-to-End-Tests entwickelt und bietet native Unterstützung für verschiedene Browser. Dies ermöglicht es, die Anwendung unter realen Bedingungen zu testen und sicherzustellen, dass sie auf verschiedenen Plattformen einwandfrei funktioniert.</p>



<p><strong>Mächtige Debugging-Tools</strong><br>Cypress verfügt über leistungsstarke Debugging-Tools, darunter die Möglichkeit, Tests schrittweise auszuführen, Screenshots aufzunehmen und den Teststatus in Echtzeit zu überwachen. Dies erleichtert die Fehlerbehebung erheblich.</p>



<p><strong>Community und Erweiterbarkeit</strong><br>Cypress hat eine aktive Community, die eine Fülle von Plugins und Erweiterungen entwickelt hat. Dies ermöglicht es Entwickler:innen, Cypress an ihre speziellen Anforderungen anzupassen und von der Arbeit der Community zu profitieren.</p>



<p><strong>Kontinuierliche Integration</strong><br>Cypress lässt sich nahtlos in gängige CI/CD-Pipelines integrieren. Dadurch können automatisierte Tests in den Entwicklungsprozess integriert werden, um sicherzustellen, dass der Code immer fehlerfrei ist.</p>



<p><strong>Zeitreise</strong><br>Cypress macht Schnappschüsse, während die Tests laufen. Im Befehlsprotokoll sieht man, was bei jedem Schritt passiert ist.</p>



<p><strong><a href="https://www.chaijs.com/">Chai</a></strong><br>Ist ein Assertions-Framework für JavaScript, das in Kombination mit Cypress verwendet werden kann. Es ermöglicht Entwickler:innen, Aussagen (Assertions) in ihren Tests zu formulieren, um zu überprüfen, ob bestimmte Bedingungen erfüllt sind. Diese Bedingungen können sein, dass eine Variable einen bestimmten Wert hat, eine Funktion ohne Fehler ausgeführt wird oder ein Element auf einer Webseite bestimmte Eigenschaften aufweist.</p>



<p><strong>Fehlersuchbarkeit</strong><br>Höre auf zu raten, warum die Tests fehlgeschlagen sind. Debugge direkt aus vertrauten Tools wie den Developer Tools. Die lesbaren Fehler- und Stack-Trace machen das Debugging blitzschnell.</p>



<p><strong>Automatisches Warten</strong><br>Fügen den Tests keine Wartezeiten oder Schlafphasen hinzu. Cypress wartet automatisch auf Befehle und Assertions, bevor es weitergeht.</p>



<p><strong>Spione, Stubs</strong><br>Überprüfe und kontrolliere das Verhalten von Funktionen, Serverantworten.</p>



<p><strong>Screenshots, Videos und Testwiederholung</strong><br>Zeige Screenshots an, die bei Fehlern automatisch erstellt werden, oder Videos, falls aktiviert, von der gesamten Testsuite, wenn diese über die CLI ausgeführt wird.</p>



<p><strong>Browserübergreifende Tests<br></strong>Führe Tests in Browsern der Firefox- und Chrome-Familie (einschließlich Edge und Electron) lokal und optimal in einer Pipeline für die kontinuierliche Integration aus.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Was kann Cypress nicht?</h2>



<ul class="wp-block-list">
<li>Cypress ist keine Universal-Testlösung. Dieses Framework ist speziell für eine Aufgabe konzipiert: End-to-End-Tests während des Entwicklungsprozesses für die Anwendung, nicht nach der Entwicklung.</li>



<li>Cypress ermöglicht keine Tests über mehrere Tabs oder gleichzeitig in verschiedenen Browsern durchzuführen. Die Tatsache, dass &#8220;Cypress innerhalb des Browsers ausgeführt wird&#8221;, bringt zusätzliche Begrenzungen mit sich. Das bedeutet, dass es nicht möglich ist, zu überprüfen, ob beim Klicken auf einen Link ein neuer Tab geöffnet wird.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Cypress im Vergleich zu anderen Frameworks</h2>



<p>Um die Vorzüge von Cypress besser zu verstehen, werfen wir einen kurzen Blick auf die Unterschiede zu anderen Frameworks:</p>



<p><strong>Jest</strong><br>Jest ist hervorragend für Unit-Tests geeignet, während Cypress auf End-to-End-Tests spezialisiert ist. Cypress bietet eine umfassendere Lösung für die Gewährleistung der Funktionsfähigkeit einer Anwendung unter realen Bedingungen.</p>



<p><strong>Mocha</strong><br>Mocha ist äußerst flexibel, aber es fehlen einige der integrierten Funktionen von Cypress, wie das Echtzeit-Reloading und die automatische Wiedergabe von Tests.</p>



<p><strong>Jasmine</strong><br>Jasmine ist ein BDD-Framework und legt den Fokus auf die Spezifikation des Verhaltens der Anwendung. Cypress bietet ähnliche Funktionen, aber mit einem stärkeren Fokus auf End-to-End-Tests.</p>



<p><strong>Selenium WebDriver</strong><br>Während Cypress im Browser ausgeführt werden kann, interagiert WebDriver mit dem Browser über das HTTP-Protokoll, was zu Verzögerungen und unbekannten Warteereignissen bei der Ausführung von Tests. Cypress richtet sich auch an QA- und Entwickler-Teams, die Tests schreiben wollen, ohne sich um die zugrunde liegende Infrastruktur und die Beschränkung auf eine Assertion-Bibliothek und einer Programmiersprache.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Cypress Grundlagen</h2>



<p><strong>describe-Block</strong><br>Die Tests werden in einem describe-Block abgelegt. Dieser Block enthält zwei Argumente. Das erste ist eine Beschreibung dessen, was getestet werden soll. Das zweite ist eine Callback-Funktion für den eigentlichen Tests innerhalb dieses Blocks.</p>



<p><strong>it-Block</strong><br>Innerhalb des Beschreibungsblocks gibt es auch it-Blöck. Diese Blöcke sind einzelne Tests innerhalb einer Gesamttestdatei. Die API für it() ist die gleiche wie die von describe. Das erste Argument ist der Titel eines einzelnen Tests, und das zweite Argument ist eine Callback-Funktion, die den Testcode enthält.</p>



<p><strong>Befehle und Interaktion mit Elementen</strong><br>Cypress stellt verschiedene Befehle zur Verfügung, die beim Testen unterstützen. Man kann diese Befehle auf das cy-Objekt anwenden. Zum Beispiel führt <code>cy.visit('/')</code> den Cypress Runner zu einer gewünschten Seite. Es gibt verschiedene andere Befehle wie<code> cy.click(), cy.type(), cy.check(),</code> usw.</p>



<p><strong>Elemente erhalten</strong><br>Sehr oft gibt es den Fall, wo man ein Element aus dem DOM erhalten möchte und dazu eine eine Art von Behauptung aufstellen möchte. Zum Beispiel soll ein h1-Element einen bestimmten Text beinhalten. Man kann Elemente in Cypress mit der Funktion get abrufen und auch einen CSS-Abfrage-Selektor übergeben.</p>



<p><strong>Command Chaining &amp; Assertions</strong><br>Nachdem man ein Element erhalten haben, möchten man wahrscheinlich etwas mit diesem Element tun, z. B. eine Behauptung aufstellen. Dies kann umgesetzt werden, indem man eine Behauptung anhängen, nachdem man ein Element erhalten hat. Zum Beispiel: <code>get(h1).contains('text').</code> Cypress hat verschiedene Möglichkeiten, eine Behauptung aufzustellen.</p>



<p><strong>Fokussierung auf einen einzigen Test</strong><br>Man kann<code> it.only() </code>verwenden, um einen einzelnen Test durchzuführen.</p>



<p><strong>beforeEach</strong><br>Man kann eine<code> beforeEach</code>-Funktion verwenden, um bestimmte Aktionen vor jedem Test durchzuführen.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Testkonzepte mit Cypress</h2>



<p>Mit Cypress können verschiedene Testkonzepte in der Frontend-Entwicklung umgesetzt werden:</p>



<p><strong>End-to-End</strong><br>Cypress wurde ursprünglich für die Durchführung von End-to-End-Tests (E2E) für alle Anwendungen entwickelt, die in einem Browser laufen. Ein typischer E2E-Test besucht die Anwendung in einem Browser und führt Aktionen über die Benutzeroberfläche aus, wie es ein echter Benutzer tun würde.</p>



<p><strong>Komponente</strong><br>Man kann Cypress auch verwenden, um Komponenten aus unterstützten Web-Frameworks einzubinden und Komponententests durchzuführen.</p>



<p><strong>API</strong><br>API Cypress kann beliebige HTTP-Aufrufe ausführen, so dass Sie es für API-Tests verwenden können.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Best Practices laut cypress.io</h2>



<p><strong>Teste „Unhappy Paths“</strong><br>Teste nicht nur den &#8220;Happy Path“ des Nutzers. Stelle sicher, dass man Nutzer testet, die die App böswillig nutzen oder Aktionen durchführen, die nicht üblich sind.</p>



<p><strong>Stabile Selektoren verwenden</strong><br>Verwende data-*-Attribute, um Ihren Selektoren einen Kontext zu geben und sie von CSS- oder JS-Änderungen zu isolieren. Ziele nicht auf Elemente ab, die auf CSS-Attributen wie id, class, tag basieren. Ziele nicht auf Elemente, die ihren textContent ändern können. Verwende keine zu generischen Selektor (z. B. <code>cy.get(button)</code>).</p>



<p><strong>Keine Rückgabewerte zuweisen</strong><br>Cypress läuft NICHT synchron zueinander.</p>



<p><strong>Teste keine externen Seiten oder Plugins</strong><br>Teste nur Websites oder Plugins, die du direkt kontrollierst. Versuche zu vermeiden, einen Server eines Drittanbieters zu verwenden. Eine Möglichkeit wäre ein API-Call von Cypress mittels <code>cy.request()</code>, um mit Servern von Drittanbietern über deren APIs zu kommunizieren.</p>



<p><strong>Halte Tests untereinander unabhängig</strong><br>Machen einen Test nicht von einem anderen abhängig, dies könnte das Testverhalten und die Logik dahinter nur unnötig beeinflussen.</p>



<p><strong>Bereinige den Zustand vor der Ausführung der Tests</strong><br>Bereinige den Zustand nicht mit <code>after</code> oder <code>afterEach.</code> Ein Vorteil von Cypress ist das inkrementelle Schreiben von Tests und Anwendungscode. Wenn der Zustand nach einem Test nicht aufrechterhalten wird, kann es schwieriger werden, herauszufinden, was als nächstes getestet werden soll. Wenn mitten im Test etwas fehlschlägt, haben die Nachbereinigungsfunktionen keine Chance, ausgeführt zu werden. Cypress bereinigt den Zustand zwischen den Tests bereits, so dass man sich darüber keine Gedanken machen muss.</p>



<h2 class="wp-block-heading">Fazit</h2>



<p>Obwohl es viele gute Alternativen gibt, sticht Cypress hervor, insbesondere wenn es um End-to-End-Tests geht. Mit seiner einfachen Installation, Echtzeit-Reloading, mächtigen Debugging-Tools und der starken Community bietet Cypress alles, was Entwickler- und QA-Teams für zuverlässige Tests benötigen. Wenn man nach einem effektiven und benutzerfreundlichen Testing Framework für JavaScript und Frontend-Entwicklung sucht, ist Cypress zweifellos ein guter Start.</p>



<p>Da ich im Laufe der Masterklasse ein mögliche Spezialisierung Richtung (Software) Testing anstrebe, versuche ich so viel Know-now diesbezüglich zu sammeln. Dafür hab ich eine<a href="https://docs.google.com/spreadsheets/d/1gAD0cBEY6S98zzSQvrpMjfcsPKh6-QqRuXs5hYeKC58/edit?usp=sharing"> kleine Sammlung an nützlichen Links</a> zusammengestellt, diese wird in Zukunft auch weiter ergänzt.</p>



<p>Außerdem werden die ersten Testings-Workflows für ein Ionic-Webprojekt im Rahmen der Mastklasse in Cypress erstellt.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Quellen</h2>



<ul class="wp-block-list">
<li><a href="https://www.cypress.io/">https://www.cypress.io/</a></li>



<li><a href="https://filiphric.com/how-to-structure-a-big-project-in-cypress">https://filiphric.com/how-to-structure-a-big-project-in-cypress</a></li>



<li><a href="https://www.packtpub.com/product/end-to-end-web-testing-with-cypress/9781839213854">https://www.packtpub.com/product/end-to-end-web-testing-with-cypress/9781839213854</a></li>



<li><a href="https://cypress-course.vercel.app/">https://cypress-course.vercel.app/</a></li>
</ul>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/testing-frameworks-universum-fuer-javascript-und-cypress/">Testing-Framework Universum für JavaScript und Cypress</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Remotion &#124; Videos mit Code erstellen</title>
		<link>https://mobile.fhstp.ac.at/allgemein/remotion-videos-mit-code-erstellen/</link>
		
		<dc:creator><![CDATA[Florian Bauer]]></dc:creator>
		<pubDate>Thu, 02 Mar 2023 16:51:59 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[React]]></category>
		<category><![CDATA[remotion]]></category>
		<category><![CDATA[Video-Framework]]></category>
		<guid isPermaLink="false">https://akirchknopf-21110.php.fhstp.cc/?p=10792</guid>

					<description><![CDATA[<p>Remotion ist ein Framework aus Bibliotheken und Tools, das auf React aufbaut und mit dem man seine Webentwicklungsfähigkeiten nutzen kann, um Videos mithilfe von Code zu erstellen, z. B. Erstellung einer Diashow mit den besten Fotos und Videos Remake der Spotify-Kampagne &#8220;Wrapped“ Installation Voraussetzungen: FFMPEG Das Projekt FFmpeg besteht aus einer Reihe von Programmen und <a class="read-more" href="https://mobile.fhstp.ac.at/allgemein/remotion-videos-mit-code-erstellen/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/remotion-videos-mit-code-erstellen/">Remotion | Videos mit Code erstellen</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Remotion ist ein Framework aus Bibliotheken und Tools, das auf React aufbaut und mit dem man seine Webentwicklungsfähigkeiten nutzen kann, um Videos mithilfe von Code zu erstellen, z. B.</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="400" height="400" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/dia-01.png" alt="" class="wp-image-10811" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2023/03/dia-01.png 400w, https://mobile.fhstp.ac.at/wp-content/uploads/2023/03/dia-01-150x150.png 150w, https://mobile.fhstp.ac.at/wp-content/uploads/2023/03/dia-01-120x120.png 120w" sizes="auto, (max-width: 400px) 100vw, 400px" /></figure>



<p><a href="https://www.remotion.dev/showcase#3ZOyZm01dqewQjVUNP02MzqWooJlYJ00cVSLX9WjSwuYjs">Erstellung einer Diashow mit den besten Fotos und Videos</a></p>



<p></p>



<p></p>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="400" height="400" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/wrapped-01.png" alt="" class="wp-image-10812" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2023/03/wrapped-01.png 400w, https://mobile.fhstp.ac.at/wp-content/uploads/2023/03/wrapped-01-150x150.png 150w, https://mobile.fhstp.ac.at/wp-content/uploads/2023/03/wrapped-01-120x120.png 120w" sizes="auto, (max-width: 400px) 100vw, 400px" /></figure>



<p><a href="https://www.remotion.dev/showcase#V5Dpfui9NmUSons5P5VQRbyX5m5011LsRA01f0129CLbHo">Remake der Spotify-Kampagne &#8220;Wrapped“</a></p>
</div>
</div>



<p></p>



<h2 class="wp-block-heading">Installation</h2>



<p>Voraussetzungen:</p>



<ul class="wp-block-list">
<li>Um Remotion zu verwenden, benötigen man mindestens Node 14.</li>



<li>Linux-Benutzer müssen einige zusätzliche Pakete installieren, damit Chrome/Puppeteer korrekt funktioniert.</li>



<li>Remotion benötigt zum Rendern von Videos die Binärdateien ffmpeg und ffprobe (Mindestversion 4.1). Wenn man diese nicht installiert hat, wird Remotion versuchen, FFmpeg zu installieren. Man kann dies überprüfen, indem man den Befehl ffmpeg in der Befehlszeile ausführt. Wenn es installiert ist, sollten man die FFMPEG-Informationen für Ihren Rechner auf der Konsole sehen.</li>
</ul>



<p><strong>FFMPEG</strong></p>



<p>Das Projekt FFmpeg besteht aus einer Reihe von Programmen und Bibliotheken, die es ermöglichen, Video- und Audiodaten aufzunehmen, zu konvertieren, ins Netzwerk zu übertragen (streamen) und abzuspielen. So enthält es unter anderem mit libavcodec eine hoch entwickelte Codec-Zusammenstellung.&nbsp; Aufgrund der Tatsache, dass FFmpeg im Terminal ausgeführt wird, ist es möglich, auch mehrere Dateien zu verarbeiten (&#8220;Stapelverarbeitung&#8221;).</p>



<h2 class="wp-block-heading">Projekterstellung</h2>



<p>Ein neues Remotion-Projekt initialisiert man, indem man folgenden Befehl verwendet:</p>



<p></p>



<pre class="wp-block-code"><code>npm init video</code></pre>



<p>Man wird aufgefordert, das Video zu benennen und eine Vorlage auszuwählen. Wir verwenden die Vorlage &#8220;Blank&#8221;, aber man kann später auch die anderen Vorlagen ausprobieren.</p>



<p><strong>Vorschau der Videos</strong></p>



<p>Als erstes schauen wir uns das Remotion-Vorschau-Tool an. Es wurde praktischerweise als NPM-Startskript hinzugefügt, also führen wir es mal aus.</p>



<pre class="wp-block-code"><code>npm start</code></pre>



<p>Wenn sich das Vorschautool nicht automatisch in einem Browserfenster geöffnet hat, sieht man sich die URL an, die in der Konsole ausgegeben wird, nachdem man den obigen Befehl ausgeführt haben.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="735" height="90" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/demo-04.png" alt="" class="wp-image-10820"/></figure></div>


<p>Mit dem Vorschauwerkzeug kann mit dem Remotion-Video indem Projekt interagieren. Es ist das Hauptentwicklungswerkzeug, das man bei der Erstellung Ihres Videos verwenden werden. Es wird automatisch aktualisiert, wenn maneine Änderung im Quellcode vornehmen. Wir werden uns jetzt einige grundlegenden Funktionen ansehen.</p>



<p>Drücke die Abspieltaste im unteren Teil des Vorschauwerkzeugs. Man sollte sehen, wie sich die Zeitanzeige (der &#8220;Abspielkopf&#8221;) über den unteren Teil des Browserfensters bewegt.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1540" height="800" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/demo-03-1540x800.png" alt="" class="wp-image-10821" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2023/03/demo-03-1540x800.png 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2023/03/demo-03-770x400.png 770w" sizes="auto, (max-width: 1540px) 100vw, 1540px" /><figcaption class="wp-element-caption">Remotion Vorschautool</figcaption></figure>



<p><strong>Projekttour</strong></p>



<p>Die Grundidee hinter Remotion ist, dass wir Ihnen eine Frame-Nummer und eine leere Leinwand geben und man die Freiheit bekommt, alles zu rendern, was man mit React programmieren kann.</p>



<p>Schauen wir uns die Dateien an, die wir in einem Basis-Remotion-Projekt finden, was sie enthalten und was sie tun.&nbsp; Es gibt drei Dateien im src-Ordner:</p>



<ul class="wp-block-list">
<li>index.ts</li>



<li>Root.tsx</li>



<li>Composition.tsx</li>
</ul>



<p><strong>In index.ts sehen wir:</strong></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="435" height="135" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/remotion-demo_05.png" alt="" class="wp-image-10823"/></figure>



<p>registerRoot() ist eine Funktion, die Remotion mitteilt, wo sich das Stammverzeichnis befindet. So wie ReactDOM.createRoot() die Wurzel eines React-Projekts erzeugt, erzeugt registerRoot() die Wurzel eines Remotion-Projekts.</p>



<p>Dann importieren wir die Komponente, die unsere Wurzel enthält, RemotionRoot.</p>



<p>Schließlich verwenden wir registerRoot(RemotionRoot), um die Wurzel zu registrieren. All dies sollte sehr vertraut sein, wenn man React.createRoot() bereits verwendet hat.</p>



<p><strong>In der Datei Root.tsx sehen wir:</strong></p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/remotion-demo_06.png" alt="" class="wp-image-10824" width="576" height="390"/></figure>



<p>Hier exportieren wir eine Komponente, die eine oder mehrere &lt;Komposition/&gt;-Komponenten enthält. Im Moment gibt es nur eine.</p>



<p>Wenn man &#8220;Komposition&#8221; liest, können man genauso gut an &#8220;Video&#8221; denken. Eine Komposition wird zu einem Video, wenn man Remotion anweist, sie zu exportieren. Jede &lt;Komposition/&gt; registriert ein Video in Remotion, und das ermöglicht zwei wichtige Dinge:</p>



<ol class="wp-block-list" type="1">
<li>Man kann das Video im Vorschautool sehen.</li>



<li>Exportieren es mit dem Befehl npx remotion render*.</li>
</ol>



<p>Werfen wir einen Blick auf package.json. Das Build-Skript verwendet remotion render, um das Video zu exportieren.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="550" height="251" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/remotion-demo_07.png" alt="" class="wp-image-10826"/></figure>



<p>Man kann so viele &lt;Composition/&gt; hinzufügen, wie man will, aber nur hier in Root.tsx. Das Video wird anhand seiner Kompositions-ID registriert, und wenn wir uns unsere Datei jetzt ansehen, gibt es nur eine Komposition, und die hat id=&#8221;MyComp&#8221;.</p>



<p>Es gibt noch eine weitere wichtige Eigenschaft in &lt;Composition/&gt;, und zwar die Komponenten-Eigenschaft. Diese Requisite teilt Remotion mit, welche React-Komponente beim Exportieren oder bei der Anzeige im Vorschauwerkzeug verwendet werden soll. Wir verwenden MyComposition aus der Datei Composition.tsx. Wir werden bald sehr viel Zeit in dieser Datei verbringen!</p>



<p>Der Rest von &lt;Composition/&gt; sind andere Einstellungen für Ihr Video. Schauen dir diese gerne an, aber für den Moment belassen wir es bei den Standardwerten.</p>



<p></p>



<p>Ein <strong>Video</strong> ist eine Funktion von Bildern im Zeitverlauf. Wenn man den Inhalt bei jedem Bild ändert, erhaltet man eine Animation. Ein Video hat 4 Eigenschaften:</p>



<ul class="wp-block-list">
<li>Breite in Pixel.</li>



<li>Höhe in Pixel.</li>



<li>durationInFrames: Die Anzahl der Bilder, die das Video lang ist.</li>



<li>fps: Bilder pro Sekunde. Die Dauer in Frames geteilt durch FPS ergibt die Dauer in Sekunden.</li>
</ul>



<p>Diese Eigenschaften sind variabel und man kann eine Komponente mehrfach mit unterschiedlichen Eigenschaften wiederverwenden. Anstatt diese Werte fest zu codieren, können wir sie über den useVideoConfig()-Hook ableiten:</p>



<p>Das erste Bild eines Videos ist 0 und das letzte Bild ist durationInFrames &#8211; 1.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="481" height="135" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/remotion-demo_08.png" alt="" class="wp-image-10829"/></figure>



<p>Die letzte Datei, Composition.tsx, enthält alles, was in dem Video zu sehen sein wird. Es ist deine Leinwand. </p>



<p>Dies ist die Komponente, mit der ein Video registriert wird, damit es gerendert werden kann und in der Seitenleiste der Remotion-Entwicklungsoberfläche angezeigt wird.</p>



<p>Eine Komposition stellt das zu erstellende Video als Sammlung von Clips dar (z. B. mehrere &lt;Sequence&gt;),  um das Video zu bilden.</p>



<p><strong>Frame-by-Frame-Animation mit &#8220;UseCurrentFrame()&#8221;.</strong></p>



<p>Mit deinem React-Kenntnisse kann man sehr einfach Animationen in deinem Video zaubern.</p>



<p>Platziere ein Textelement zentriert in der Mitte des Videos in Composition.tsx. Besser, aber immer noch keine Bewegung. </p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/remotion-demo_09.png" alt="" class="wp-image-10831" width="413" height="360"/></figure>



<p>Lass uns dieses Textelement wackeln lassen. Füge die folgenden Änderungen hinzu, um unser Textelement horizontal wackeln zu lassen.</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/remotion-demo_11.png" alt="" class="wp-image-10833" width="587" height="502"/></figure>



<p>Drücke nun im Vorschautool auf Play. Endlich tut sich etwas!&nbsp; Aber&#8230; wie?&nbsp; Ein Video ist einfach eine Reihe von Bildern. Die Bilder sind fast gleich, aber nicht genau gleich. Wenn man die Bilder nacheinander anzeigen lässt, entsteht die Illusion einer Bewegung.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="509" height="104" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/video-frames-1.png" alt="" class="wp-image-10834"/><figcaption class="wp-element-caption">Videoframes</figcaption></figure></div>


<p>Jedes Bild wird als Einzelbild bezeichnet. Remotion kann uns die aktuelle Bildnummer mit der Funktion useCurrentFrame() mitteilen, die Folgendes zurückgibt:</p>



<ul class="wp-block-list">
<li>0 für das erste Bild,</li>



<li>1 für Bild Nummer zwei,</li>



<li>2 für das dritte Bild usw..</li>
</ul>



<p>Dann liegt es an uns, etwas auf den Bildschirm zu zeichnen (zu rendern). Wenn das Rendering abgeschlossen ist, nimmt Remotion ein Bild auf. Dieser Vorgang wird für jedes Bild wiederholt. Und wenn wir fertig sind, fügt Remotion die Bilder zu einem Video zusammen.&nbsp; Lasst uns die Bildnummer in der Komponente rendern.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="678" height="530" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/remotion-demo_12.png" alt="" class="wp-image-10835"/></figure>



<p>Spiele nun das Video im Vorschautool ab. Man sieht, dass es bei 0 beginnt und mit der Zeit zunimmt.</p>



<p><strong>Animation ist Mathematik</strong></p>



<p>Key Takeaway: Die Platzierung von Dingen auf dem Bildschirm ist reine Mathematik. Vor allem Trigonometrie!</p>



<p>Um das zu sehen, sehen wir uns den Code an, der den Text wackeln lässt.</p>



<ul class="wp-block-list">
<li>Math.sin(frame) wechselt zwischen -1 und 1, wenn der Rahmen größer wird.</li>
</ul>



<p>Um zu sehen, was in unserer CSS-Transformation passiert, listen wir einige Werte für frame auf und sehen, was die Transformation ergibt.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/sin_tabelle-02.png" alt="" class="wp-image-10837" width="441" height="633"/></figure></div>


<p>Wie wir sehen können, wechselt translateX(frame) zwischen positiven und negativen Werten, und der Text bewegt sich zwischen translateX(-1px) und translateX(1px) hin und her.</p>



<p><strong>WICHTIG</strong></p>



<ul class="wp-block-list">
<li>Jede Animation in Remotion muss auf dem Wert basieren, der von useCurrentFrame() zurückgegeben wird. Dies ist eine häufige Quelle der Verwirrung, wenn man frame-basierte Animationen macht. Viele Leute werden versuchen, CSS-Animationen oder bestehende Animationsbibliotheken zu verwenden, aber das wird fast nie funktionieren.</li>



<li>Remotion wird nicht wissen, wann es ein Bild von der Animation machen soll, und die Animation wird flackern, weil sie nicht mit den Frames synchronisiert ist.</li>



<li>Allerdings, wenn die Lösung es ermöglicht, useCurrentFrame() zu verwenden, um die Animation zu steuern, ist alles gut.</li>



<li>Hilfsfunktionen wie useVideoConfig() und useCurrentFrame() sind die Bausteine von Remotion. Sie ermöglichen es uns, Animationen zu erstellen, die mit den Frames des Videos synchronisiert sind.</li>
</ul>



<p><strong>Interpolate Funktion</strong></p>



<p>Wenn wir den Text über 60 Bilder einblenden wollen, müssen wir die Deckkraft schrittweise von 0 auf 1 ändern.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="728" height="594" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/remotion-demo_13.png" alt="" class="wp-image-10840"/></figure>



<p>Die Verwendung der Funktion interpolate() kann die Lesbarkeit von Animationen verbessern. Die Funktion benötigt 4 Argumente:</p>



<ul class="wp-block-list">
<li>Den Eingabewert</li>



<li>Der Wertebereich, den die Eingabe annehmen kann</li>



<li>Der Wertebereich, auf den Sie die Eingabe abbilden möchten</li>



<li>Optionale Einstellungen</li>
</ul>



<p>In diesem Beispiel ordnen wir den Bildern 0 bis 60 ihre Deckkraftwerte zu (0, 0,0166, 0,033, 0,05 &#8230;) und verwenden die Einstellung extrapolateRight, um die Ausgabe so zu begrenzen, dass sie nie größer als 1 wird.</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-video"><video controls src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/animating-properties-left-light.mp4"></video></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-video"><video controls src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/animating-properties-right-light.mp4"></video></figure>
</div>
</div>



<p><strong>In- and Out-Effekte</strong></p>



<p>Wir behalten unseren Einblendungseffekt bei, fügen aber am Ende einen Ausblendungseffekt hinzu. 20 Bilder vor dem Ende des Videos sollte die Deckkraft immer noch 1 sein. Am Ende sollte die Deckkraft 0 sein.</p>



<p>Wir können über mehrere Punkte in einem Durchgang interpolieren und useVideoConfig() verwenden, um die Dauer der Komposition zu bestimmen.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="685" height="556" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/remotion-demo_14.png" alt="" class="wp-image-10845"/></figure>



<p><strong>Easing</strong></p>



<p>Das Easing-Modul implementiert gängige Easing-Funktionen. Diese können mit der interpolate() API verwendet werden. </p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="921" height="611" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/remotion-demo_15.png" alt="" class="wp-image-10846"/></figure>



<p>Visualisierungen einiger gängiger Easing-Funktionen findet man unter: </p>



<ul class="wp-block-list">
<li><a href="http://easings.net/">http://easings.net/</a></li>



<li><a href="https://cubic-bezier.com/">https://cubic-bezier.com/</a></li>



<li><a href="https://www.remotion.dev/docs/easing#bounce">https://www.remotion.dev/docs/easing#bounce</a></li>
</ul>



<p></p>



<p><strong>AbsoluteFill</strong></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="874" height="528" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/remotion-demo_16.png" alt="" class="wp-image-10848"/></figure>



<p>&lt;AbsoluteFill/&gt; ist eine Komponente, die den gesamten Rahmen ausfüllt. Sie ist nützlich für Hintergründe und andere Elemente, die absolut positioniert werden sollen. Es ist dasselbe wie ein Element mit Position: absolut und den Eigenschaften oben, links, rechts und unten auf 0 gesetzt.</p>



<p><strong>Img</strong></p>



<p>&lt;Img/&gt; ist dasselbe wie das reguläre &lt;img/&gt;-Element, aber es wartet, bis das Bild geladen ist, bevor es den Rahmen rendert.</p>



<p><strong>Sequence</strong></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="765" height="416" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/remotion-demo_17.png" alt="" class="wp-image-10849"/></figure>



<p>Durch die Verwendung einer Sequenz kann man die Anzeige der Komponenten oder Teile der Animation im Video zeitlich verschieben.</p>



<ul class="wp-block-list">
<li>Bei allen untergeordneten Komponenten innerhalb einer &lt;Sequence&gt; wird der Wert von useCurrentFrame() um den Wert from verschoben.</li>



<li>Mithilfe der Eigenschaft durationInFrames kann definiert werden, wie lange die Kinder einer &lt;Sequence&gt; eingebunden werden sollen.</li>



<li>Standardmäßig werden die Kinder einer &lt;Sequence&gt; in eine &lt;AbsoluteFill&gt;-Komponente eingepackt. Wenn man dieses Verhalten nicht wünscht, füge layout=&#8221;none&#8221; als Prop hinzu.</li>



<li><strong>from:</strong> Bei welchem Bild sollen die Kinder der Sequenz davon ausgehen, dass das Video beginnt. </li>



<li><strong>durationInFrames:</strong> Für wie viele Bilder die Sequenz angezeigt werden soll. Standardmäßig ist dies Infinity, um die Dauer der Sequenz nicht zu begrenzen.</li>



<li><strong>name: </strong>Man kann der Sequenz einen Namen geben, der dann als Bezeichnung der Sequenz in der Zeitleiste der Remotion-Vorschau angezeigt wird. Diese Eigenschaft dient lediglich dazu, den Überblick über die Sequenzen in der Zeitleiste zu behalten.</li>



<li><strong>layout:</strong> Entweder &#8220;absolute-fill&#8221; (Standard) oder &#8220;none&#8221;. Standardmäßig werden die Sequenzen absolut positioniert, so dass sie sich gegenseitig überlagern. </li>
</ul>



<p><strong>Export</strong></p>



<p>Rendern wir unser Video. Aber zuerst: Haben wir die Kompositions-ID auch angepasst? Wenn wir die Kompositions-ID geändert haben, sollte das Build-Skript in der package.json wie folgt aussehen:</p>



<p>&#8220;build&#8221;: &#8220;remotion render src/index.ts CompName out/video.mp4&#8221;</p>



<pre class="wp-block-code"><code>npm run build</code></pre>



<p>Mit diesem Befehl wird mit dem Remotion-Render-Befehl eine Videodatei im Out-Ordner erstellt.</p>



<p>Ändern Sie sie, um ein anderes Video zum Rendern auszuwählen oder den Ausgabeort zu ändern. Alle Optionen findet man auf der CLI-Referenzseite.</p>



<ul class="wp-block-list">
<li><a href="https://www.remotion.dev/docs/cli">https://www.remotion.dev/docs/cli</a></li>



<li><a href="https://www.remotion.dev/docs/encoding">https://www.remotion.dev/docs/encoding</a></li>
</ul>



<h2 class="wp-block-heading">Fazit</h2>



<p>Mit dem Video-Framework Remotion und einem Grundwissen in React können mit wenigen Zeilen Code dynamisch erzeugte Videos generiert werden ohne einer Verwendung eines Videobearbeitungsprogramme. Ein möglicher Use-Case wäre eine automatisierte Videoerstellung von Video-Content für Digital-Signage-Systemen wie z.B. Videos für Infoscreens in den öffentlichen Verkehrsmitteln.</p>



<p>Ein Beispielsvideo wurde mithilfe der API-Schnittstelle der APA, der Nationale Nachrichtenagentur, generiert. Es wurden dabei die aktuellen Nachrichtenbeiträge plus Beitragsfoto für das animierte Video verwendet.</p>



<figure class="wp-block-video"><video controls poster="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/apa-infoscreen_01.jpg" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/apa-dailynews_108p25_h264.mp4"></video><figcaption class="wp-element-caption">Beispielsvideo | Infoscreen mittels APA-Daten</figcaption></figure>



<h2 class="wp-block-heading">Quellen</h2>



<ul class="wp-block-list">
<li>Remotion Doku | <a href="https://www.remotion.dev/docs/">https://www.remotion.dev/</a></li>



<li>Easing Funktionen | <a href="https://easings.net/">https://easings.net/</a></li>



<li>APA API | <a href="https://api.ots.at/wizard/">https://api.ots.at/wizard/</a></li>
</ul>



<p></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/remotion-videos-mit-code-erstellen/">Remotion | Videos mit Code erstellen</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		<enclosure url="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/animating-properties-left-light.mp4" length="45765" type="video/mp4" />
<enclosure url="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/animating-properties-right-light.mp4" length="27399" type="video/mp4" />
<enclosure url="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/apa-dailynews_108p25_h264.mp4" length="2682410" type="video/mp4" />

			</item>
		<item>
		<title>Flimmerkiste &#124; Semesterprojekt</title>
		<link>https://mobile.fhstp.ac.at/allgemein/flimmerkiste-semesterprojekt/</link>
		
		<dc:creator><![CDATA[Florian Bauer]]></dc:creator>
		<pubDate>Wed, 01 Mar 2023 11:54:39 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Semesterprojekt]]></category>
		<guid isPermaLink="false">https://akirchknopf-21110.php.fhstp.cc/?p=10690</guid>

					<description><![CDATA[<p>Im Rahmen unseres Semesterprojekts (1. Semester) für die Masterklassen-LV &#124; Mobile haben wir eine Android-App mit dem Namen flimmerkiste entwickelt. Das Video-Angebot der großen TV-Sender ist in den letzten Jahren beachtlich gestiegen, dabei verwaltet jeder Sender seine eigene Mediathek.Wir wollen in diesem Mediatheken-Dschungel Orientierung &#38; einen einfachen TV-Konsum schaffen und haben dabei flimmerkiste kreiert. Mit <a class="read-more" href="https://mobile.fhstp.ac.at/allgemein/flimmerkiste-semesterprojekt/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/flimmerkiste-semesterprojekt/">Flimmerkiste | Semesterprojekt</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Im Rahmen unseres Semesterprojekts (1. Semester) für die Masterklassen-LV | Mobile haben wir eine Android-App mit dem Namen flimmerkiste entwickelt. Das Video-Angebot der großen TV-Sender ist in den letzten Jahren beachtlich gestiegen, dabei verwaltet jeder Sender seine eigene Mediathek.<br>Wir wollen in diesem Mediatheken-Dschungel Orientierung &amp; einen einfachen TV-Konsum schaffen und haben dabei flimmerkiste kreiert. Mit flimmerkiste ist es möglich mit nur einer App die Mediatheken der deutschsprachigen öffentlich-rechtlichen Sender zur durchforsten und die einzelnen Videos der Sender abzuspielen.</p>



<p>Im 1. Semester haben wir uns auf die Entwicklung der Android-App konzentriert.</p>



<h2 class="wp-block-heading">Team | Rollen</h2>



<ul class="wp-block-list">
<li>Manuel Hecht<ul><li>Mediathek API (Backend)</li></ul><ul><li>Home Screen mit Sendungsübersicht</li></ul><ul><li>Sendungssuche</li></ul>
<ul class="wp-block-list">
<li>Testen</li>
</ul>
</li>



<li>Mohamed Abd-El-Rehim<ul><li>Userverwaltung | Login &amp; Registrierung</li></ul><ul><li>Firebase Verwaltung</li></ul>
<ul class="wp-block-list">
<li>Testen</li>
</ul>
</li>
</ul>



<ul class="wp-block-list">
<li>Florian Bauer<ul><li>UI-Design der App</li></ul><ul><li>Videoplayer-Integration</li></ul>
<ul class="wp-block-list">
<li>Testen</li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading">Projektorganisation</h2>



<p>Wir verwenden für unsere Projekt GitLab auf dem FH-internen Server.</p>



<p><a href="https://git.nwt.fhstp.ac.at/teledevs/flimmerkiste">GitLab | Flimmerkiste (Link)</a></p>



<p></p>



<h2 class="wp-block-heading">Entwicklung</h2>



<p>Für die Umsetzung von unserem Semesterprojekt haben wir uns für Flutter, das Entwicklungs-Kit von Google entschieden.</p>



<p><strong>Flutter</strong></p>



<p>Flutter ist ein Open-Source-Framework für die Entwicklung mobiler Anwendungen, mit dem Entwickler hochwertige, plattformübergreifende mobile Anwendungen mit einer einzigen Codebasis erstellen können. Das Hauptmerkmal von Flutter ist die Fähigkeit, schöne, reaktionsfähige und schnelle Anwendungen zu erstellen, die einfach zu warten sind.</p>



<p>Wir wollen unsere Anwendung für möglichst viele Plattformen in Zukunft anbieten, diese sollen von Semester zu Semester ergänzt werden.</p>



<p>Das Erlernen einer Cross-Platform-Entwicklungsumgebung war ein wichtiger Entscheidungsgrund für alle Projektmitglieder. Bis vor Projektbeginn hatte kein Mitglied Berührungspunkte mit so einer All-in-One Umgebung.</p>



<p>Der klare Nachteil war die längere Einschulungsphase bei allen Teammitglieder, ein Flutter-Workshop wäre hier hilfreich gewesen. Zum Beispiel konnten gewisse Verhaltensweisen von Flutter nicht nachvollzogen (z.B. States) werden.</p>



<h2 class="wp-block-heading">Design</h2>



<p>Fokussierung des Designs erfolgte fürs 1. Semester auf die Android Variante.</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/figma-flimmerkiste_v2.png" alt="" class="wp-image-10757" width="847" height="313"/><figcaption class="wp-element-caption">Figma |  App Design V1</figcaption></figure>



<p><a href="https://www.figma.com/file/19xa2KyqRajSP30BZGQpEa/flimmerkiste?node-id=0%3A1&amp;t=xnQuSn3OtmFcX5Is-1">Figma-Designentwurf V1</a></p>



<h2 class="wp-block-heading">Backend</h2>



<h3 class="wp-block-heading">Datenbank | Google Firebase</h3>



<p>Für unsere Benutzerverwaltung verwenden wir Google Firebase als Datenbank. Derzeit werden folgende Tabelle/Daten gespeichert:</p>



<ul class="wp-block-list">
<li>Benutzer:innen
<ul class="wp-block-list">
<li>Mail, Name</li>
</ul>
</li>
</ul>



<ul class="wp-block-list">
<li>Favoriten = Sendungen
<ul class="wp-block-list">
<li>Kanal, Sendungstitel</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading">MediathekView API</h3>



<p>Als Datenquelle verwenden wir die API von MediathekView. Diese darf aus rechtlichen Gründen leider nicht auf unserer Seite in einem eigenen Backend abgespeichert werden Aus diesem Grund holen wir uns nur temporär per API-Abfage die jeweiligen benötigten Daten.</p>



<p>MediathekView durchsucht die Online-Mediatheken verschiedener öffentlich-rechtlicher Sender und listet diese gefundenen Sendungen auf. Es werden die Videobeiträge aus den Mediatheken direkt verwendet, das heißt das Hosting findet bei den jeweiligen Sendern statt.</p>



<p>MediathekView kann aus diesem Grund nur Sendungen anzeigen, die in den Mediatheken der Sender selbst noch als Videos angeboten werden.</p>



<p>Die Sendungen vom ORF sind aus rechtlichen Gründen nur aus den letzten sieben Tagen verwendbar.</p>



<p><a href="https://mediathekviewweb.de/">Mediathek View Web (Link)</a></p>



<p></p>



<p>Derzeit werden die Mediatheken der folgenden Sender unterstützt:</p>



<ul class="wp-block-list">
<li>ARD (Das Erste)</li>



<li>Arte (deutsch, englisch, französisch, spanisch, italienisch und polnisch)</li>



<li>alpha</li>



<li>BR (Bayerischer Rundfunk)</li>



<li>HR (Hessischer Rundfunk)</li>



<li>MDR (Mitteldeutscher Rundfunk)</li>



<li>NDR (Norddeutscher Rundfunk)</li>



<li>RBB (Rundfunk Berlin-Brandenburg)</li>



<li>rbtv (radiobremen)</li>



<li>SR (Saarländischer Rundfunk)</li>



<li>SWR (Südwestrundfunk)</li>



<li>WDR (Westdeutscher Rundfunk)</li>



<li>ZDF (Zweites Deutsches Fernsehen)</li>



<li>ZDFinfo</li>



<li>ZDFneo</li>



<li>zdf-tivi</li>



<li>Gemeinschaftsprogramme von ARD und ZDF</li>



<li>3Sat</li>



<li>Funk</li>



<li>Kika (Kinderkanal von ARD und ZDF)</li>



<li>Phoenix</li>



<li>DW TV (Deutsche Welle)</li>



<li>ORF (Österreichischer Rundfunk)</li>



<li>SRF (Schweizer Rundfunk) inkl. Podcasts</li>
</ul>



<p>Eine Abfrage an die MediathekViewWeb API liefert folgende Infos:</p>



<ul class="wp-block-list">
<li>Kanalname (channel)</li>



<li>Sendungsname (topic)</li>



<li>Sendungstitle (title)</li>



<li>Sendungsbeschreibung (description)</li>



<li>Zeitstempel (timestamp,filmlisteTimestamp)</li>



<li>Sendungsdauer (duration)</li>



<li>Dateigröße (size)</li>



<li>Sendungslink auf die Website des jeweiligen Senders (url_website)</li>



<li>Untertitel zur Sendung (url_subtitle)</li>



<li>Videolink in mittlerer Qualität (url_video)</li>



<li>Videolink in niedrigster Qualität (url_video_low)</li>



<li>Videolink in hoher Qualität (url_video_high)</li>



<li>MediathekView-ID (id)</li>
</ul>



<p>Ein Beispiel aus der ARD-Mediathek:</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/mediathekview-blog_01-1540x309.png" alt="" class="wp-image-10758" width="945" height="189" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2023/03/mediathekview-blog_01-1540x309.png 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2023/03/mediathekview-blog_01-1536x306.png 1536w, https://mobile.fhstp.ac.at/wp-content/uploads/2023/03/mediathekview-blog_01.png 1553w" sizes="auto, (max-width: 945px) 100vw, 945px" /></figure>



<p><a href="https://gist.github.com/bagbag/a2888478d27de0e989cf777f81fb33de">MediathekViewWeb API Samplecode (Link)</a></p>



<p>Für unsere jetzige Implementierung verwenden wir zwei verschiedene Queries:</p>



<ul class="wp-block-list">
<li>Query für den Home Screen<ul><li>Abfrage nach allen Videos eines Senders (channel).</li></ul>
<ul class="wp-block-list">
<li>Es werden die aktuellsten 10 Sendungen (DESC) des Kanals als Ergebnis geliefert.</li>
</ul>
</li>
</ul>



<ul class="wp-block-list">
<li>Query für die Suche nach einer Sendung<ul><li>Abfrage erfolgt nach dem Sendungstitle (title).</li></ul>
<ul class="wp-block-list">
<li>Es werden die aktuellsten 10 Sendungen (DESC) mit einer Übereinstimmung des Suchwortes als Ergebnis geliefert.</li>
</ul>
</li>
</ul>



<p>Folgende Felder erhalten wir als Antwort (JSON), die wir für das Frontend weiterverarbeiten.</p>



<ul class="wp-block-list">
<li>Feld &#8220;topic&#8221;:</li>



<li>Feld &#8220;title&#8221;:</li>



<li>Feld &#8220;channel&#8221;:</li>



<li>Feld &#8220;url_video&#8221;:</li>



<li>feld &#8220;filmlisteTimestamp&#8221;:</li>



<li>feld &#8220;duration&#8221;</li>



<li>feld &#8220;description&#8221;</li>
</ul>



<h2 class="wp-block-heading">Funktionen</h2>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/Screenshot_20230226_152933.jpg" alt="" class="wp-image-10760" width="252" height="561" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2023/03/Screenshot_20230226_152933.jpg 1080w, https://mobile.fhstp.ac.at/wp-content/uploads/2023/03/Screenshot_20230226_152933-691x1536.jpg 691w, https://mobile.fhstp.ac.at/wp-content/uploads/2023/03/Screenshot_20230226_152933-922x2048.jpg 922w" sizes="auto, (max-width: 252px) 100vw, 252px" /></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p><strong>Home Screen</strong></p>



<p>Die aktuellsten zehn Sendungen ausgewählter Kanäle werden als scrollbare Listenzeile angezeigt.</p>
</div>
</div>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/Screenshot_20230226_153046.jpg" alt="" class="wp-image-10764" width="257" height="571" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2023/03/Screenshot_20230226_153046.jpg 1080w, https://mobile.fhstp.ac.at/wp-content/uploads/2023/03/Screenshot_20230226_153046-691x1536.jpg 691w, https://mobile.fhstp.ac.at/wp-content/uploads/2023/03/Screenshot_20230226_153046-922x2048.jpg 922w" sizes="auto, (max-width: 257px) 100vw, 257px" /></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p><strong>Suche nach Sendungstitel</strong></p>



<p><span style="font-size: revert; color: initial;">Es werden die zehn neuesten Ergebnisse gezeigt.</span></p>



<p>Bei einem Ergebnisumfang größer zehn, können die Ergebnisse erweitert werden.</p>
</div>
</div>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/Screenshot_20230226_153702.jpg" alt="" class="wp-image-10765" width="270" height="600" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2023/03/Screenshot_20230226_153702.jpg 1080w, https://mobile.fhstp.ac.at/wp-content/uploads/2023/03/Screenshot_20230226_153702-691x1536.jpg 691w, https://mobile.fhstp.ac.at/wp-content/uploads/2023/03/Screenshot_20230226_153702-922x2048.jpg 922w" sizes="auto, (max-width: 270px) 100vw, 270px" /></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p><strong>Benutzerprofil</strong></p>



<p><span style="font-size: revert; color: initial;">Die Flimmerkiste enthält eine Benutzerprofil-Funktion. Mit dieser Funktion kann man sein persönliches Konto in der App erstellen und verwalten. Mit einem Benutzerprofil kann man Lieblingssendungen speichern. Das Profil kann folgende Daten anpassen:</span></p>



<ul class="wp-block-list">
<li>Profilfoto</li>



<li>Mailadresse</li>



<li>Name</li>



<li>Passwort</li>
</ul>



<p>Und es können Sendungen favorisiert werden.</p>
</div>
</div>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"></div>
</div>



<h2 class="wp-block-heading">Video-Player</h2>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/Screenshot_20230226_153258-1.jpg" alt="" class="wp-image-10781" width="280" height="622" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2023/03/Screenshot_20230226_153258-1.jpg 1080w, https://mobile.fhstp.ac.at/wp-content/uploads/2023/03/Screenshot_20230226_153258-1-691x1536.jpg 691w, https://mobile.fhstp.ac.at/wp-content/uploads/2023/03/Screenshot_20230226_153258-1-922x2048.jpg 922w" sizes="auto, (max-width: 280px) 100vw, 280px" /></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p>Der Hauptbestandteil von Flimmerkiste ist das Video-Player, welcher die jeweiligen Sendungsvideos des Kanals abspielt. Um auf die Anforderungen des Players einzugehen, wird zuerst eine Übersicht der Spezifikationen der abzuspielenden Videos aufgelistet.</p>



<p>Alle Videos aus den Mediatheken werden in zwei Varianten (MP4 &amp; HLS-Stream) angeboten.</p>



<p>Encodierung der Videos:</p>



<ul class="wp-block-list">
<li>Container: MPEG-4</li>



<li>Video: AVC (H264)</li>



<li>Audio: AAC LC (Stereo)</li>
</ul>
</div>
</div>



<p><strong>MP4</strong></p>



<p>Niedrige Qualität</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/ard-low.png" alt="" class="wp-image-10773" width="613" height="184"/></figure>



<p>Mittlere Qualität</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/ard-mid.png" alt="" class="wp-image-10774" width="613" height="195"/></figure>



<p>Höchste Qualität</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/ard-hi.png" alt="" class="wp-image-10775" width="623" height="208"/></figure>



<p><strong>HLS-Stream</strong></p>



<p>Videos von ORF und SRF werden nicht als *.mp4 angeboten, sondern nur als HLS-Stream zur Verfügung gestellt. Eine Manifest-Datei (*.m3u8) definiert in welcher Qualität das Video abgespielt wird.</p>



<p></p>



<p>ORF:</p>



<p>Niedrige Qualität</p>



<pre class="wp-block-code"><code>#EXT-X-STREAM-INF:BANDWIDTH=1089858,CODECS="avc1.100.30,mp4a.40.2",RESOLUTION=640x360</code></pre>



<p>Mittlere Qualität</p>



<pre class="wp-block-code"><code>#EXT-X-STREAM-INF:BANDWIDTH=2123246,CODECS="avc1.100.31,mp4a.40.2",RESOLUTION=960x540</code></pre>



<p>Höchste Qualität</p>



<pre class="wp-block-code"><code>#EXT-X-STREAM-INF:BANDWIDTH=3417151,CODECS="avc1.100.31,mp4a.40.2",RESOLUTION=1280x720</code></pre>



<p>SRF:</p>



<p>Die Manifest-Datei (*.m3u8) verweist auf die einzelnen Videosegmente (.ts) in der jeweiligen Qualitätsstufe (Low, Mid, High).</p>



<pre class="wp-block-code"><code>#EXTINF:4.840,

segment-1-f4-v1-a1.ts

#EXTINF:6.000,

segment-2-f4-v1-a1.ts</code></pre>



<p>Der Player muss folgenden Anforderungen in erster Phase erfüllen:</p>



<ul class="wp-block-list">
<li>Abspielen von Videos, die als *.mp4 und *.m3u8 gehostet sind.</li>



<li>Besitzt Basis-Steuerungselemente: Zeitleiste, Lautstärkeregelung, Play-/Pausefunktion und Vollbildmodus</li>



<li>Unterstützung für Android &amp; iOS, idealerweise auch Web</li>



<li>Anpassbare Playerelemente für zukünftige Features wie z.B. die Einstellung der Videoqualität per Steuerungselement, Untertiteleinblendung</li>
</ul>



<p>Die Flutter-Community hat bereits einige nützliche Player-Plugins für Flutter entwickelt. Diese wären:</p>



<p><strong>video_player</strong></p>



<ul class="wp-block-list">
<li><a href="https://pub.dev/packages/video_player">https://pub.dev/packages/video_player</a></li>



<li>Dieser Player ist der stabilste (Version 2.5.2) von allen getesteten Plugins.</li>



<li>Alle notwendigen Plattformen werden unterstützt.</li>



<li>Nur Basisfunktionen verfügbar, kaum angepasste Funktionen verfügbar.</li>



<li>Nur *.mp4 gehostete Videos abspielbar.</li>
</ul>



<p><strong>chewie</strong></p>



<ul class="wp-block-list">
<li><a href="https://pub.dev/packages/chewie">https://pub.dev/packages/video_player</a></li>



<li>Ein Video-Player mit erweiterten Steuerungselementen.</li>



<li>Alle notwendigen Plattformen werden unterstützt.</li>



<li>Erweiterbare Steuerungselemente verfügbar.</li>



<li>HLS-Videostream und MP4-Videos abspielbar.</li>



<li>Das Plugin basiert auf video_player.<br></li>
</ul>



<p><strong>better_player</strong></p>



<ul class="wp-block-list">
<li><a href="https://pub.dev/packages/better_player">https://pub.dev/packages/better_player</a></li>



<li>Instabiler Player-Plugin mit den umfangreichsten Funktionen.</li>



<li>Unterstützung von Android &amp; iOS</li>



<li>Alle Videoformate abspielbar.</li>



<li>Umfangreiches Set an Steuerungselementen.</li>



<li>Das Plugin basiert auf chewie.</li>
</ul>



<p></p>



<p><strong>chewie</strong> wurde als Video-Player für die erste Phase gewählt. Es konnten alle Use-Cases an Mediatheken-Videos damit problemlos abgespielt werden.</p>



<p>Plattform-Verhalten:</p>



<ul class="wp-block-list">
<li>Android: Reibungslose Verwendung</li>



<li>iOS: Konnte derzeit nicht getestet werden</li>



<li>Web: Problem mit Vollbildmodus, beim Verlassen wird Video wieder von Beginn abgespielt</li>
</ul>



<figure class="wp-block-video"><video controls poster="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/flimmerkiste_videoplayer_screen.jpg" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/flimmerkiste_suche_h264_crf18.mp4"></video></figure>



<h2 class="wp-block-heading">Learnings</h2>



<ul class="wp-block-list">
<li>Sammlung erster Erfahrungen mit Cross-Plattform-Entwicklung (Flutter)</li>



<li>Allgemeiner Einstieg in Programmiersprache Dart&nbsp;</li>



<li>State-Management in Flutter, zu Beginn einige Schwierigkeiten mit Verständnis</li>



<li>Vertiefung des Google Firebase Wissen (Auth &amp; Storage)</li>



<li>Videoplayer-Handling auf den verschiedenen Plattformen</li>
</ul>



<h2 class="wp-block-heading">Roadmap</h2>



<ul class="wp-block-list">
<li>Stabile Web-Version</li>



<li>iOS-Version</li>



<li>Videoqualität per Player einstellbar</li>



<li>Einbindungsmöglichkeiten von Untertiteln</li>



<li>Navigation Bar zu einer verbesserten Navigation</li>



<li>Code Abstraktionen</li>



<li>Angepasste Bilder für Sendungen</li>



<li>Auswahl der Sender für Home-Screen</li>



<li>Empfehlungen für Sendungen aufgrund von Favoriten</li>



<li>Erstellen von Playlisten (Watch-Listen)</li>



<li>Verbesserte Suche mit Filtermöglichkeiten</li>
</ul>



<h2 class="wp-block-heading">Fazit</h2>



<p>Die Flimmerkiste ist eine hervorragende Lösung für alle, die in einer App das Videoangebot aller deutschsprachigen öffentlich-rechtlichen TV-Sender sehen wollen. Die Funktionen der App, einschließlich der Wiedergabe eines Videos, eines Benutzerprofils und einer Liste von Kanälen in Kategorien, bietet ein umfassendes und personalisiertes Medienerlebnis. Mit der weiteren Entwicklung der App wird sie zu einem noch wertvolleren Werkzeug für Medienkonsumenten werden.</p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/flimmerkiste-semesterprojekt/">Flimmerkiste | Semesterprojekt</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		<enclosure url="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/03/flimmerkiste_suche_h264_crf18.mp4" length="36322495" type="video/mp4" />

			</item>
	</channel>
</rss>
