写好qml播放代码后运行时一直报DirectShowPlayerService::doRender: Unresolved error code 80040218
找到原因是QtMultimedia 使用的系统默认的音视频编/解码器,如果系统没有安装与qt对应的音视频编解码器的话,就会报以上错误。
解决方案:
安装LAVFSplitter-0.3,用管理员权限运行CMD,切换到LAVFSplitter-0.3目录后运行安装安装脚本即可(注意32和64版本问题)。
qml代码:
import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.2
import QtQuick.Dialogs 1.2
import QtMultimedia 5.4
ApplicationWindow {
title: qsTr("LAVPlayer")
width: 640
height: 480
visible: true
Rectangle {
color: "black"
anchors.fill: parent
MediaPlayer {
id: mediaPlayer
source: "file:///e:/dome.mp4"
autoPlay: true
}
VideoOutput {
id: video
anchors.fill: parent
source: mediaPlayer
}
}
//使用Video播放
// Video {
// id: mediaPlayer
// anchors.fill: parent
// source: "file:///e:/dome.mp4"
// MouseArea {
// anchors.fill: parent
// onClicked: {
// mediaPlayer.play()
// }
// }
// focus: true
// Keys.onSpacePressed: mediaPlayer.playbackState == MediaPlayer.PlayingState ? mediaPlayer.pause() : mediaPlayer.play()
// Keys.onLeftPressed: mediaPlayer.seek(mediaPlayer.position - 5000)
// Keys.onRightPressed: mediaPlayer.seek(mediaPlayer.position + 5000)
// }
//播放进度条
Rectangle {
id: progressBar
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: parent.bottom
anchors.margins: 0
height: 10
color: "lightGray"
Rectangle {
anchors.left: parent.left
anchors.top: parent.top
anchors.bottom: parent.bottom
width: mediaPlayer.duration>0?parent.width*mediaPlayer.position/mediaPlayer.duration:0
color: "darkGreen"
}
MouseArea {
property int pos
anchors.fill: parent
onClicked: {
if (mediaPlayer.seekable)
pos = mediaPlayer.duration * mouse.x/width
mediaPlayer.seek(pos)
}
}
}
//选择播放文件窗口
FileDialog {
id: fileDialog
title: "Please choose a file"
onAccepted: {
path = fileDialog.fileUrls[0].toString();
console.log("You chose: ",path)
mediaPlayer.source = path
}
onRejected: {
console.log("Canceled")
}
}
menuBar: MenuBar {
Menu {
title: qsTr("&File")
MenuItem {
text: qsTr("&Open")
onTriggered: {
fileDialog.open()
}
}
MenuItem {
text: qsTr("E&xit")
onTriggered: Qt.quit();
}
}
}
MessageDialog {
id: messageDialog
title: qsTr("May I have your attention, please?")
function show(caption) {
messageDialog.text = caption;
messageDialog.open();
}
}
//测试代码
// Item {
// anchors.fill: parent
// MediaPlayer {
// id: mediaplayer
// source: "file:///e:/dome.mp4"
// autoPlay: true
// }
// VideoOutput {
// anchors.fill: parent
// source: mediaplayer
// }
// MouseArea {
// id: playArea
// anchors.fill: parent
// onPressed: mediaplayer.play();
// }
// }
}