Qt on android 播放视频的实现

Posted smartvxworks

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt on android 播放视频的实现相关的知识,希望对你有一定的参考价值。

Qt on android 播放视频的实现
本文介绍的是使用QML进行视频的播放,可以直接编译为APK在android上运行。

QML中对多媒体的处理提供了很多方便的组件,对于播放音频、视频都很方便。这些多媒体组件属于Qt Multimedia 模块,在介绍视频的播放之前先简单了解一下Qt Multimedia模块。

一、Qt Multimedia 模块
Qt多媒体是必不可少的一个模块,处理多媒体内容提供了一组丰富的QML类型和C++类。它还提供了必要的接口访问的摄像头和无线功能。包括QT音频引擎提供3D定位音频播放和管理类型。

1、QML中的类型

Audio:用于播放音频

Camera:提供访问设想头的功能

MediaPlayer:提供了播放媒体的功能,其实就是比方的音频,可以和VideoOutput结合实现视频的播放

Radio:提供无线电广播的功能

video:提供了视频播放的方法,是结合了MediaPlayer 和VideoOutput,提供了一种简单的视频播放的方法

2、在C++中类

QAudioOutput、QCamera、QCameraImageCapture、QMediaPlayer、QRadioTuner、QVideoRendererControl

二、视频播放
QML提供了很方便的组件实现了多媒体的播放,所以对于播放视频也是很简单,下面介绍两种播放视频的方法

1、使用MediaPlay和VideoOutput实现视频的播放

(1)MediaPlayer介绍
MediaPlayer可以单独播放音频文件,也可以和VideoOutput结合共同完成视音视频的播放,MediaPlayer提供非常方便的处理音频的接口和属性

属性:

autoLoad :: 控制是否立即加载媒体资源,默认为true,如果设置为false 在开始播放之前不会加载媒体资源

autoPlay : 设置在启动之后是否立即进行播放,默认为false,如果设置为true时,自动把autoLoad设置为true

availability:只读属性,保存着当前播放器的可用性有四个取值:Available 当前可用 Busy 被其他的进程占用 Unavailable 当前不可用 ResourceMissing 缺少资源 稍后再时

bufferProgress:保存着当前缓冲区被占用的比值 0~1

error :保存错误状态 NoError 、ResourceError、FormatError、NetworkError、AccessDenied、ServiceMissing,也可以直接使用errorString 直接获取错误信息

hasAudio:媒体中是否有音频

hasVideo:媒体中是否有视频

loops:控制播放的循环次数,默认为1 设置为MediaPlayer.Infinite 可以实现无限循环

metaData.albumArtist :获取音频中包含的专辑作者

metaData.albumTitle:获取专辑名称

metaData.audioBitRate:获取音频的比特率

metaData.audioCodec:获取音频的编码

metaData.author:获取作者

metaData.averageLevel:获取音量的级别

metaData.category:获取音频的风格

metaData.channelCount:获取通道数

metaData.chapterNumber:获取章节数

metaData.comment :获取音频的描述

position:当前播放的位置

seekable:是否可以进行偏移

source:媒体的URL,播放的音频源

status:媒体的加载状态,取值参考帮助

volume:控制播放的音量,取值0~1

还有很多的属性可以获取音频中包含的哦信息,可以参考QT的帮助

提供的对外接口有

pause()

play()

seek(offset)

stop()

seek需要说一下,值当当seekable属性为true时,才可以进行seek,offset为毫秒。seek函数是个异步的操作,所以可能不会立即响应

信号

当发生错误的时候发出error信号,当被暂停的时候发出paused信号,当播放的状态发生改变的时候发出playbackstateChanged信号,当播放的时候发出playing成功时信号,当被停止时发出stopped信号

paused、playing、stopped信号我们可以用来判断暂停、播放、停止是否成功

(2)VideoOutput
VideoOutput支持原画面、拉伸、平均铺平等方式播放视频。

VideoOutput后端支持QVideoRendererControl 或QVideoWindowControl。当后端为QVideoWindowControl的时候视频渲染重叠到一个QtQuick的窗口上,由于重叠实现,所以有一下功能不能实现,例如:一些变换旋转操作、当有另一个QtQuickItem在这个窗口之上的时候。

提供的属性

autoOrientation:控制是否自动根据屏幕的方向匹配视频流的方向,默认为disabled

contentRect:::控制进行视频播放的坐标区域

fillMode:控制视频的填充模式

Stretch:视频进行缩放以适应窗口的大小

PreserveAspectFit:视频进行等比例的缩放,不出现裁剪

PreserveAspectCrop:视频均匀的缩放,必要的时候继续裁剪

source:视频流源,指定的时候注意:需在路径之前加file:///

import QtQuick 2.4
import QtQuick.Window 2.2
import QtMultimedia 5.4
import QtQuick.Controls 1.3
Window {
visible: true
width: 320
height: 480
property bool isPlay: true
MediaPlayer {
id: mediaplayer
source: “file:///I:/video.wmv”
autoPlay: true
volume: 0.5
}
VideoOutput {
anchors.fill: parent
source: mediaplayer
}

Image{
    id:playImage
    width: 64
    height: 64
    anchors.centerIn: parent
    source: "qrc:///play.png"
    visible: false
}
MouseArea
{
    anchors.fill: parent
    onClicked: {
        if(isPlay == true)
        {
           mediaplayer.pause()
            isPlay = false
            playImage.visible = true
        }
        else
        {
            mediaplayer.play()
            isPlay = true
            playImage.visible = false
        }
    }
}

}
在指定source的数据源时,路径前面需要加上file:///,明确为文件路径

MediaPlayer实现了播放视频流中的音频,VideoOutput使用了MediaPlayer为资源继续播放视频,从而实现了音视频的同步

VideoOutput通常使用一个对象作为视频源,不能直接指定一个视频文件,通常是MediaPlayer或Camera

2、使用Video
使用video就更加简单,video直接就实现了音视频的播放

video提供的属性和方法和MediaPlayer的大致一样,可参考MediaPlayer的属性含义

import QtQuick 2.4
import QtQuick.Window 2.2
import QtMultimedia 5.4
import QtQuick.Controls 1.3
Window {
visible: true
width: 320
height: 480
property bool isPlay: true

Video{
    id:video
    anchors.fill: parent
    autoPlay: true
    source: "file:///I:/video.wmv"
}

Image{
    id:playImage
    width: 64
    height: 64
    anchors.centerIn: parent
    source: "qrc:///play.png"
    visible: false
}
MouseArea
{
    anchors.fill: parent
    onClicked: {
        if(isPlay == true)
        {
           mediaplayer.pause()
            isPlay = false
            playImage.visible = true
        }
        else
        {
            mediaplayer.play()
            isPlay = true
            playImage.visible = false
        }
    }
}

}
运行效果图:
在这里插入图片描述

以上是关于Qt on android 播放视频的实现的主要内容,如果未能解决你的问题,请参考以下文章

当替换片段视频仍在android中播放背景时

Android 7 上的 VideoView 错误

Qt编写的RTSP播放器+视频监控(android版本)

Android:如何从资产中播放视频?

Qt-FFmpeg开发-视频播放

Qt视频播放器[QMediaPlayer+QVideowidget]