Kapitel 27. Multimedia

Dieses Kapitel zeigt, wie Multimedia in Qt6 aufhört, “Magie” zu sein und zu einem kontrollierbaren Werkzeug wird: Sie werden unerwartete Nuancen niedriger Latenz, asynchroner Dauer und korrekter Komponentenverkettung entdecken, die professionelle Entwickler nutzen, um keine Stunden mit “warum spielt es nicht” zu verschwenden.

Hier werden 3 Schlüsselkomponenten eingesetzt — QSoundEffect für sofortige Effekte, QMediaPlayer + QAudioOutput für Musik/Streaming und QVideoWidget für Video, plus sorgfältige Fehlerbehandlung über errorOccurred() und praktische Lambda-Verbindungen.

Dieses Kapitel zu überspringen bedeutet, erneut in die typischen Qt6-Multimedia-Fallen zu tappen, wenn das Projekt schon kurz vor dem Release steht.

Das Kapitel enthält Code-Beispiele, die sofort einsatzbereit sind.

Selbstüberprüfung zum Kapitel

Warum kann man in Qt6 nicht duration() direkt nach setSource() in QMediaPlayer aufrufen?Antwort
Richtige Antwort: Die Dauer wird asynchron ermittelt, um die Effizienz zu steigern und das Blockieren der Anwendung beim Laden von Dateien zu vermeiden. Das Signal durationChanged() muss verwendet werden, um den Wert korrekt zu erhalten.
Warum kann QMediaPlayer in Qt6 keinen Sound ohne zusätzliche Objekte abspielen?Antwort
Richtige Antwort: QMediaPlayer spielt allein keinen Sound ab — er benötigt zwingend QAudioOutput, der über setAudioOutput() gesetzt wird. Dies ist eine architektonische Änderung in Qt6 für mehr Flexibilität bei der Ausgabesteuerung.
In welchen Einheiten wird die Lautstärke in der Methode QAudioOutput::setVolume() in Qt6 gemessen, und warum ist das wichtig zu beachten?Antwort
Richtige Antwort: Die Lautstärke wird von 0.0 bis 1.0 (Gleitkommazahl) angegeben, nicht von 0 bis 100. Bei der Übergabe von Werten von Steuerelementen (QDial) muss durch 100.0 geteilt werden, damit es korrekt funktioniert.
Wodurch unterscheidet sich die Klasse QSoundEffect von QMediaPlayer hinsichtlich der Anwendung?Antwort
Richtige Antwort: QSoundEffect ist für die schnelle Wiedergabe kurzer Soundeffekte (Benachrichtigungen, Klicks) mit geringer Latenz konzipiert und unterstützt nur WAV. QMediaPlayer ist für die vollwertige Wiedergabe von Audio/Video verschiedener Formate mit erweiterter Steuerung gedacht.
Warum werden in Qt6 zwei separate Signale verwendet: playbackStateChanged() und mediaStatusChanged()?Antwort
Richtige Antwort: playbackStateChanged() verfolgt den Wiedergabestatus (play/pause/stop), während mediaStatusChanged() die Phasen des Medienladens (Laden, Puffern, Beenden) überwacht. Dies ermöglicht die separate Behandlung der Wiedergabesteuerung und des Inhaltsladeprozesses.
Was passiert, wenn man versucht, ein Dateiformat abzuspielen, für das im System kein Codec vorhanden ist?Antwort
Richtige Antwort: QMediaPlayer erzeugt einen FormatError über das Signal errorOccurred(), da die Wiedergabefähigkeiten durch die Codecs des Betriebssystems begrenzt sind. Eine korrekte Fehlerbehandlung ist notwendig, um den Benutzer zu informieren.
Warum erbt der Videoplayer im Beispiel von der Klasse des Audioplayers, anstatt von Grund auf neu erstellt zu werden?Antwort
Richtige Antwort: QMediaPlayer ist eine High-Level-Klasse, die sowohl Audio als auch Video unterstützt. Um Videofähigkeiten hinzuzufügen, reicht es aus, QVideoWidget zu erstellen und über setVideoOutput() zu setzen; alle Steuerelemente bleiben identisch.
Welche Rolle erfüllt QMediaCaptureSession bei der Arbeit mit der Kamera?Antwort
Richtige Antwort: QMediaCaptureSession koordiniert die Medienerfassung vom Gerät (Kamera) und sendet sie zur Ausgabe (QVideoWidget). Er verbindet die Quelle (QCamera) mit dem Ziel und verwaltet den Datenfluss zwischen ihnen.
Warum wird in der Methode slotPlay() eine Switch-Konstruktion mit Überprüfung von playbackState() verwendet?Antwort
Richtige Antwort: Eine Taste erfüllt zwei Funktionen: Sie startet die Wiedergabe und pausiert sie. Die Statusüberprüfung ermöglicht den Aufruf von pause() bei Wiedergabe und play() in allen anderen Fällen, was ein bequemes Umschalten gewährleistet.
Warum kann man sich nicht vollständig auf Sound als einziges Mittel zur Benutzerbenachrichtigung in einer Anwendung verlassen?Antwort
Richtige Antwort: Der Sound am Computer ist oft vom Benutzer deaktiviert, daher müssen kritisch wichtige Informationen visuell dupliziert werden. Sound sollte als zusätzlicher Kanal verwendet werden, aber nicht als einzige Kommunikationsmöglichkeit.
Welche drei Objekte müssen erstellt werden, um Video von der Kamera in eine Datei aufzunehmen?Antwort
Richtige Antwort: QCamera (Erfassung von der Kamera), QMediaCaptureSession (Koordination des Datenflusses) und QMediaRecorder (Kodierung und Aufzeichnung in eine Datei). QMediaRecorder wird über setRecorder() an die Session gebunden.
Was muss in QMediaRecorder vor Beginn der Aufnahme konfiguriert werden, um die Qualität der Ausgabedatei zu steuern?Antwort
Richtige Antwort: Dateiformat und Codecs über QMediaFormat (Container, Video-/Audio-Codecs), Kodierungsparameter über EncodingParameters (Auflösung, fps, Bitrate) und Speicherort über setOutputLocation().
Warum speichert die Klasse SoundPlayer einen Zeiger auf QVBoxLayout als Klassenmitglied?Antwort
Richtige Antwort: Für die Möglichkeit der Schnittstellenerweiterung in abgeleiteten Klassen. Zum Beispiel fügt VideoPlayer diesem Layout das QVideoWidget-Widget hinzu, ohne die gesamte Elementanordnungsstruktur neu zu schreiben.
Warum wird im Audioplayer-Beispiel eine Lambda-Funktion zur Verarbeitung der Lautstärkeänderung verwendet?Antwort
Richtige Antwort: Zur Wertekonvertierung: QDial übergibt int (0-100), während QAudioOutput::setVolume() float (0.0-1.0) akzeptiert. Lambda ermöglicht die Division durch 100.0 direkt in connect() ohne Erstellung eines separaten Slots.
Welchen Vorteil bietet die Verwendung von QSoundEffect::Infinite für setLoopCount()?Antwort
Richtige Antwort: Bietet endlose Schleifenwiedergabe des Sounds (z.B. für Hintergrundmusik oder kontinuierliche Effekte) ohne manuelle Neustart der Wiedergabe über Beendigungssignale.

Praktische Aufgaben

Einfaches Niveau

Soundeffekt für Interface-Ereignisse
Erstellen Sie eine Anwendung mit drei Schaltflächen. Beim Klicken auf jede Schaltfläche soll ein eigener eindeutiger Soundeffekt abgespielt werden (verwenden Sie kurze WAV-Dateien). Fügen Sie einen Schieberegler hinzu, um die Lautstärke aller Soundeffekte gleichzeitig zu regeln.
Hinweise: Verwenden Sie die Klasse QSoundEffect für jeden Sound. Erstellen Sie drei QSoundEffect-Objekte und laden Sie verschiedene WAV-Dateien über setSource(). Verbinden Sie QSlider mit Bereich 0-100 mit einem Slot, der die Lautstärke für alle Effekte setzt, indem der Wert durch 100.0 geteilt wird. Vergessen Sie nicht, play() in den Button-Handlern aufzurufen.

Mittleres Niveau

Mini-Playlist mit automatischer Wiedergabe
Erweitern Sie das Audioplayer-Beispiel aus dem Kapitel: Fügen Sie die Möglichkeit hinzu, mehrere Dateien in eine Liste (QListWidget) zu laden. Nach Beendigung des aktuellen Tracks soll der Player automatisch zum nächsten in der Liste übergehen. Implementieren Sie “Zurück”- und “Weiter”-Schaltflächen für die Navigation in der Playlist.
Hinweise: Verwenden Sie das Signal mediaStatusChanged() mit Statusüberprüfung EndOfMedia, um das Ende des Tracks zu erkennen. Speichern Sie die Dateiliste und den aktuellen Index. Rufen Sie beim Wechsel der Tracks setSource() mit der neuen Datei auf. QListWidget::currentRow() und setCurrentRow() helfen bei der Synchronisierung der Auswahl. Behandeln Sie die Fälle beim Erreichen des Endes/Anfangs der Liste.

Schwieriges Niveau

Einfacher Videoeditor mit Vorschau und Aufnahme
Erstellen Sie eine Anwendung, die Video von der Webcam erfasst, es in Echtzeit anzeigt und das Starten/Stoppen der Aufnahme in eine Datei ermöglicht. Fügen Sie die Möglichkeit hinzu, die letzte Aufnahme über einen eingebauten Videoplayer anzusehen. Implementieren Sie die Einstellung der Aufnahmeauflösung (720p/1080p) und einen Aufnahmezeitindikator.
Hinweise: Verwenden Sie QCamera, QMediaCaptureSession, QVideoWidget für die Vorschau und QMediaRecorder für die Aufnahme. Eine QMediaCaptureSession kann gleichzeitig an QVideoWidget ausgeben und über QMediaRecorder aufzeichnen. Erstellen Sie für die Wiedergabe einen zweiten QMediaPlayer mit separatem QVideoWidget. Verwenden Sie QTimer zur Aktualisierung des Aufnahmezeitcounters. QMediaRecorder::recorderStateChanged() hilft beim Verfolgen des Aufnahmestarts/-endes. Konfigurieren Sie EncodingParameters vor Beginn der Aufnahme.

💬 Treten Sie der Diskussion bei!

Haben Sie Ihren ersten Multimedia-Player erstellt? Sind Fragen zur asynchronen Arbeit mit QMediaPlayer oder zur Videoaufzeichnung aufgetaucht?

Teilen Sie Ihre Erfahrungen bei der Integration von Multimedia in Anwendungen, diskutieren Sie die Feinheiten der Verarbeitung verschiedener Formate oder helfen Sie anderen Lesern, sich mit der Kamera und Aufnahme zurechtzufinden!

Leave a Reply

Your email address will not be published. Required fields are marked *