Jeff Tranter

The Qt 5 Multimedia QML Elements

By Jeff Tranter

Introduction

Qt 5 introduced a new set of multimedia APIs. Both C++ and QML APIs are provided. In this blog post, I will give an overview of the QML APIs for multimedia.

Multimedia QML Elements

The QtMultimedia module provides the following QML components:

Name Description
Video A convenience type for showing a specified video
Audio Add audio playback to a scene
MediaPlayer Add media playback to a scene
Camera Access viewfinder frames and take photos and movies
CameraCapture An interface for capturing camera images
CameraExposure An interface for exposure related camera settings
CameraFlash An interface for flash related camera settings
CameraFocus An interface for focus related camera settings
CameraImageProcessing An interface for camera capture related settings
CameraRecorder Controls video recording with the Camera
Radio Access radio functionality
RadioData Access RDS data
Torch Simple control over torch functionality
VideoOutput Render video or camera viewfinder
SoundEffect Provides a way to play sound effects

A related module, QtAudioEngine, provides support for 3D positional audio playback and content management. It defines another nine QML elements. We won't cover that module in this blog post.

How to Use

To use the module, you need to include the QtMultimedia module version 5.0. Typically, you will also need to import QtQuick version 2 or newer, e.g.

    import QtQuick 2.0
    import QtMultimedia 5.0

Qt Multimedia uses each platform's underlying native multimedia system on the back end. It uses DirectShow and WMF on Windows, AVFoundation on Mac and GStreamer on Linux. The audio and video codecs that are supported are determined by what is installed and supported by the back end on your system.

Compatibility with Qt 4

Qt Multimedia in Qt 5 replaces the Qt Multimedia module from Qt 4 and the Qt Multimedia Kit module from Qt Mobility. It is reasonably compatible with Qt Multimedia from Qt 4 at the source level. It is less compatible with Qt Multimedia Kit. The section Changes in Qt Multimedia in the Qt documentation describes the changes in more detail.

Audio

Here is a simple first example that plays a sound file when text is clicked. It uses the Audio element:

import QtQuick 2.0
import QtMultimedia 5.0

Text {
    text: "Press Me!"
    font.pointSize: 24

    Audio {
        id: playMusic
        source: "/usr/share/sounds/pop.wav" // Point this to a suitable sound file
    }
    MouseArea {
        anchors.fill: parent
        onPressed: playMusic.play()
    }
}

The Audio element can play sound files. It provides a number of properties including access to sound metadata, signals that are emitted when events of interest occur (e.g. playbackStateChanged()) and methods to control playback.

A similar element, SoundEffect, can play uncompressed sound files like WAV files and generally has lower latency than the Audio element but can play a smaller range of sound files. Here is the example above done using SoundEffect, the only difference being the Audio element is replaced with SoundEffect:

import QtQuick 2.0
import QtMultimedia 5.0

Text {
    text: "Press Me!"
    font.pointSize: 24

    SoundEffect {
        id: playMusic
        source: "/usr/share/sounds/pop.wav" // Point this to a suitable sound file
    }
    MouseArea {
        anchors.fill: parent
        onPressed: playMusic.play()
    }
}

Video

For video playback, you can use the MediaPlayer element to define and control playback of a video or sound file. It is a non-visual component, so you then need to use a VideoOutput element to render the content to the screen. Here is an example:

import QtQuick 2.0
import QtMultimedia 5.0

Rectangle {
    width: 480
    height: 270

    MediaPlayer {
        id: player
        source: "trailer_1080p.mov" // Point this to a suitable video file
        autoPlay: true
    }

    VideoOutput {
        source: player
        anchors.fill: parent
    }
}

There is also a convenience element Video that combines the functionality of MediaPlayer and VideoOutput that will often suffice when doing simple video playback functionality. Here is an example similar to the previous one but using Video:

import QtQuick 2.0
import QtMultimedia 5.0

Video {
    id: video
    width: 480
    height: 270
    autoPlay: true
    source: "trailer_1080p.mov" // Point this to a suitable video file
}

All of these elements have properties, signals and methods, which allow you to build a more complete media player, for example. You can even use a VideoOutput as the source for graphical effects from the QtGraphicalEffects module.

Camera

Most mobile devices, tablets and even laptops now include cameras. The Camera element allows you to capture images and video from a camera with various capture and processing settings. You can use a VideoOutput with the camera as a source to display live video from the viewfinder in your application.

Here is a simple example that shows live preview from a camera:

import QtQuick 2.0
import QtMultimedia 5.0

Item {
    width: 640
    height: 480

    Camera {
        id: camera
    }

    VideoOutput {
        source: camera
        anchors.fill: parent
    }
}

Here is a more complete example, which shows a preview, captures an image when the preview is clicked, and shows the most recent image captured.

import QtQuick 2.0
import QtMultimedia 5.0

Item {
    width: 320
    height: 510
    Camera {
        id: camera
        imageCapture {
            onImageCaptured: {
                // Show the preview in an Image
                photoPreview.source = preview
            }
            onImageSaved: {
                text.text = qsTr("Last Captured Image (%1):").arg(camera.imageCapture.capturedImagePath)
            }
        }
    }
    Column {
        Text {
            height: 15
            text: qsTr("Preview (Click to capture):")
        }
        VideoOutput {
            source: camera
            focus: visible // To receive focus and capture key events when visible
            width: 320; height: 240
            MouseArea {
                anchors.fill: parent
                onClicked: camera.imageCapture.capture()
            }
        }
        Text {
            id: text
            height: 15
            text: qsTr("Last Captured Image (none)")
        }
        Image {
            id: photoPreview
            width: 320; height: 240
        }
    }
}

Below is a screen shot of the example running.

There are QML types such as CameraFocus and CameraFlash that are available as properties of a Camera element. A separate element, Torch, controls a camera light, which may be present independent of a camera flash.

Radio

The final type of multimedia device supported is a radio tuner, via the Radio QML element. Unlike the hardware described earlier, radio tuners aren't commonly available on desktop system but are present on some tablets and phones.

As well as controlling the radio, on supported hardware the radioData property returns a RadioData element, which provides access to Radio Data System (RDS) information like station and program names for radio stations that broadcast it.

As I don't have any hardware that supports radio, I won't present an example program. The documentation for the Radio element has a simple example you can try if you wish.

Summary

With Qt 5, it is easy to integrate multimedia from within QML applications. The Qt documentation covers all of the QML elements as well as the C++ multimedia APIs. The Qt source also includes a number of QML examples using multimedia. A future blog post may cover the C++ multimedia APIs.