Компонент QML «Видео» не может воспроизводить видеофайлы из файлов ресурсов Qt

Весь проект можно найти здесь:

QML Video Test Project

Я сделал пример приложения с тремя кнопками, одним изображением и одним видеоплеером. При нажатии кнопок должно воспроизводиться видео. Вот что отличает кнопки:

  1. Доступ к видеофайлу в той же папке, что и исполняемый файл приложения.
  2. Доступ к видеофайлу, добавленному в файл Qt Resource.
  3. Доступ к видеофайлу из внешнего двоичного файла Qt Resource без сжатия.

В моем приложении работает только кнопка 1. Причина этого поста в том, что у меня закончилась идея, почему кнопки 2. и 3. не могут воспроизвести видео.

Изображение, включенное в приложение, представляет собой изображение, упакованное вместе с видеофайлом во внешний двоичный файл Qt Resource. Это изображение успешно прочитано из файла внешнего ресурса. Это означает, что доступ к файлу внешнего ресурса не является проблемой.

Вот файл main.qml:

import QtQuick 2.4
import QtQuick.Window 2.2
import com.qml.externalresourcemanager 1.0
import QtMultimedia 5.4
import QtQuick.Controls 1.2

Window {
visible: true

minimumHeight: 700
minimumWidth: 400

property string imageSelected: ""property string videoSelected: ""
ExternalResourceManager {
id: externalResourceManager

Component.onCompleted: {
console.log("External resource registered: " + registerExternalResource("file:/../../VideoTest/binaryExpansionFile.rcc"))
imageSelected = "externalImage.jpg"}
}

Button {
id: button0
width: parent.width
height: parent.height / 7
anchors.top: parent.top
text: "Click me to play as local file"onClicked: {
console.log(installPath + "local.mp4")
videoSelected = installPath + "local.mp4"}
}

Button {
id: button1
width: parent.width
height: parent.height / 7
anchors.top: button0.bottom
text: "Click me to play local resource file"onClicked: {
videoSelected = "local.mp4"}
}

Button {
id: button2
width: parent.width
height: parent.height / 7
anchors.top: button1.bottom
text: "Click me to play external resource file"onClicked: {
videoSelected = "external.mp4"}
}

Image {
id: image
source: imageSelected
width: parent.width
height: parent.height * 2 / 7
anchors.top: button2.bottom
}

Video {
id: video
source: videoSelected
height: parent.height * 2 / 7
width: parent.width
anchors.top: image.bottom
fillMode: VideoOutput.PreserveAspectFit

onStatusChanged: {
var temp

switch (playbackState)
{
case MediaPlayer.NoMedia:
temp = "MediaPlayer.NoMedia"break;

case MediaPlayer.Loading:
temp = "MediaPlayer.Loading"break;

case MediaPlayer.Loaded:
temp = "MediaPlayer.Loaded"break;

case MediaPlayer.Buffering:
temp = "MediaPlayer.Buffering"break;

case MediaPlayer.Stalled:
temp = "MediaPlayer.Stalled"break;

case MediaPlayer.Buffered:
temp = "MediaPlayer.Buffered"break;

case MediaPlayer.EndOfMedia:
temp = "MediaPlayer.EndOfMedia"break;

case MediaPlayer.InvalidMedia:
temp = "MediaPlayer.InvalidMedia"break;

case MediaPlayer.UnknownStatus:
temp = "MediaPlayer.UnknownStatus"break;
}

console.log(temp)

if (status === MediaPlayer.Loaded)
{
video.play()
}
}
onBufferProgressChanged: {
console.log("Buffering: " + bufferProgress * 100)
}
onSourceChanged: {
console.log("Source: " + source)
}
onAvailabilityChanged: {
console.log("Availability: " + availability)
}
onErrorChanged: {
console.log("Error: " + error)
}
onErrorStringChanged: {
console.log("Error String: " + errorString.toString())
}
onHasVideoChanged: {
console.log("Has video: " + hasVideo)
}
onPlaybackStateChanged: {
var temp

switch (playbackState)
{
case MediaPlayer.PlayingState:
temp = "MediaPlayer.PlayingState"break;

case MediaPlayer.PausedState:
temp = "MediaPlayer.PausedState"break;

case MediaPlayer.StoppedState:
temp = "MediaPlayer.StoppedState"break;
}

console.log(temp)
}
}
}

При нажатии кнопки 1 мое приложение выводит это:

Resource path:  "file:/../../VideoTest/binaryExpansionFile.rcc"qml: External resource registered: true
qml: file:/C:/Users/MisterX/Documents/QtProjects/build-VideoTest-Desktop_Qt_5_4_2_MinGW_32bit-Debug/debug/local.mp4
qml: Source: file:///C:/Users/MisterX/Documents/QtProjects/build-VideoTest-Desktop_Qt_5_4_2_MinGW_32bit-Debug/debug/local.mp4
qml: MediaPlayer.UnknownStatus
qml: Has video: true
qml: MediaPlayer.UnknownStatus
qml: MediaPlayer.NoMedia
qml: MediaPlayer.PlayingState

При нажатии кнопки 2 мое приложение выводит это:

Resource path:  "file:/../../VideoTest/binaryExpansionFile.rcc"qml: External resource registered: true
qml: Source: qrc:/local.mp4
qml: MediaPlayer.UnknownStatus
qml: Has video: false
qml: MediaPlayer.UnknownStatus
qml: MediaPlayer.NoMedia
qml: MediaPlayer.PlayingState

Весь проект можно найти здесь:
QML Video Test Project

1

Решение

Это ошибка при использовании компилятора MinGW, который использует бэкэнд DirectShow. Видеть это ссылка на сообщение об ошибке для дополнительной информации.

1

Другие решения


По вопросам рекламы [email protected]