Hardware Accelerated QtMultimedia Backend for Raspberry Pi and OpenGL Shaders on Video
EDIT: This article is outdated. Refer to newer posts for properly working builds, instructions on how to build etc… In particular: “Using POT Builds” and “Build Procedure for PiOmxTextures“.
EDIT: The software described in this post only supports Qt 5.
In some previous posts I developed a custom QML component to render video in a QML scene using hardware accelerated decoding capabilities and rendering without passing buffers to the ARM CPU. This resulted in good performance of the Raspberry Pi even with 1080p high profile h264 videos.
Many bugs need to be fixed, code should be refactored a little but still it shows it is possible and that it works fine. So I decided to move to the following step: modifying Qt to make it possible to use the “standard” QtMultimedia module to access the same decoding/rendering implementation. This would make it possible to better integrate with Qt and allow users to recompile an application without changing anything in its implementation.
The QtMultimedia module uses gstreamer on Linux to provide multimedia capabilities: gstreamer is unfortunately not hardware accelerated on the Pi unless you use something like gst-omx (which never worked properly for me).
Therefore, I started to look into the QtMultimedia module sources in Qt5 and found out (as I was hoping), that Qt guys have done, as usual, a very good job in designing it, providing the classic plugin structure also for multimedia backends. Unfortunately, also as usual, not much documentation is provided on how to implement a new backend, but it is not that difficult anyway by looking at the other implementations.
Design
At the end, I came up with a structure like this: I implemented a new QtMultimedia backend providing the MediaPlayer and VideoOutput minimal functionalities leveraging a “library-version” of the PiOmxTextures sample code which in turn uses a “bundled” version of omxplayer implemented using the OpenMAX texture render component as a sink for the video.
As said, Qt guys have done a good job! I didn’t have to change anything in the Qt Multimedai module; all the implementation is inside the plugin.
Results
The result is pretty good, I don’t see many differences from the previous custom QML component (the decoding and rendering code is the same and the QML component is implemented using the same exact principle, so nothing really changed).
I’m only beginning to play a little bit with this, I just tried a couple of things. In the video you can see the “standard” qmlvideo and qmlvideofx examples provided with the Qt sources.
Code is available on GitHub here: https://github.com/carlonluca/pot.
Have fun! 😉
Ok i think i found the issue, was coming from obviously using the wrong ffmpeg branch, which means that piOmxTexture doesnt seem to build on ffmpeg 2.4 ..
I'm sorry. I'm working on many projects at the moment so I don't know whether I'll be interested in trying new Qt versions or firmwares.
to be a bit more precise here is the issue i'm facing :
i can get ffmpeg to build, although i needed to add -b to the git checkout n.2.2 line in compile_ffmpeg.sh script
then when i use the prepare script i get a warning (not sure this is normal)
Project MESSAGE: This project is using private headers and will therefore be tied to this specific Qt module build version.
Project MESSAGE: Running this project against other versions of the Qt modules may crash at any arbitrary point.
Project MESSAGE: This is not a bug, but a result of using Qt internals. You have been warned!
it seems tocontinue though, but then when it starts building i'm getting :
omx_mediaprocessor.cpp
In file included from ../../../omxplayer_lib/OMXPlayerAudio.h:27:0,
from ../../../omx_playeraudio.h:30,
from ../../../omx_mediaprocessor.cpp:37:
../../../omxplayer_lib/DllAvFilter.h: In member function ‘virtual int DllAvFilter::avfilter_graph_parse(AVFilterGraph*, const char*, AVFilterInOut**, AVFilterInOut**, void*)’:
../../../omxplayer_lib/DllAvFilter.h:127:75: error: cannot convert ‘AVFilterInOut**’ to ‘AVFilterInOut*’ for argument ‘3’ to ‘int avfilter_graph_parse(AVFilterGraph*, const char*, AVFilterInOut*, AVFilterInOut*, void*)’
../../../omx_mediaprocessor.cpp: In member function ‘void OMX_MediaProcessor::mediaDecoding()’:
../../../omx_mediaprocessor.cpp:731:13: warning: suggest braces around empty body in an ‘if’ statement [-Wempty-body]
In file included from ../../../omxplayer_lib/OMXPlayerAudio.h:27:0,
from ../../../omx_playeraudio.h:30,
from ../../../omx_mediaprocessor.cpp:37:
../../../omxplayer_lib/DllAvFilter.h: In member function ‘virtual int DllAvFilter::avfilter_graph_parse(AVFilterGraph*, const char*, AVFilterInOut**, AVFilterInOut**, void*)’:
../../../omxplayer_lib/DllAvFilter.h:128:3: warning: control reaches end of non-void function [-Wreturn-type]
make: *** [omx_mediaprocessor.o] Error 1
Any thoughts about where this could come from ?
Hey Luca,
Now that qt 5.4RC is out i tried to build you work against it, but with no luck.
Any plans to update your instructions for qt 5.4 ? thanks.
Problem solved. Only I need run "fixQualifiedLibraryPaths" script.
Hi guys, today I probe to compile qt5.3 but this dont work. Always I get this next message:
qlibrary_unix.cpp:(.text+0x111c): aviso: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/mnt/rasp-pi-rootfs/usr/lib/arm-linux-gnueabihf/libdl.a(dlopen.o): En la funci?n `dlopen':
(.text+0xc): referencia a `__dlopen' sin definir
/mnt/rasp-pi-rootfs/usr/lib/arm-linux-gnueabihf/libdl.a(dlclose.o): En la funci?n `dlclose':
(.text+0x0): referencia a `__dlclose' sin definir
/mnt/rasp-pi-rootfs/usr/lib/arm-linux-gnueabihf/libdl.a(dlsym.o): En la funci?n `dlsym':
(.text+0xc): referencia a `__dlsym' sin definir
/mnt/rasp-pi-rootfs/usr/lib/arm-linux-gnueabihf/libdl.a(dlerror.o): En la funci?n `dlerror':
(.text+0x0): referencia a `__dlerror' sin definir
/mnt/rasp-pi-rootfs/usr/lib/arm-linux-gnueabihf/libm.a(feholdexcpt.o): En la funci?n `feholdexcept':
(.text+0x48): referencia a `_dl_hwcap' sin definir
/mnt/rasp-pi-rootfs/usr/lib/arm-linux-gnueabihf/libm.a(fesetenv.o): En la funci?n `fesetenv':
(.text+0x64): referencia a `_dl_hwcap' sin definir
collect2: error: ld returned 1 exit status
make[2]: *** [../../lib/libQt5Core.so.5.3.0] Error 1
make[2]: Leaving directory `/home/andres/opt/qt5/qtbase/src/corelib'
make[1]: *** [sub-corelib-make_first] Error 2
make[1]: Leaving directory `/home/andres/opt/qt5/qtbase/src'
make: *** [sub-src-make_first] Error 2
I have Ubuntu 14.04 x64.
Someone know soution to this problem ??
Thanks.
You're probably better off reading a crossbuilding guide for that.
i read the script. I dont understand what path i must use instread RPI_SYS_ROOT
yes first bilding was very slowly. it was for 2 days)).
Those script are for crossbuilding, sorry. I never built directly on the Pi, it is too slow. If you need to do that you'll have to read the scripts and do the same on the Pi.
sorry for noob's questions. what location must i specify. I dont use rpi_sys_root folder for cross compile, becouse i use native bild qt5 on pi. My QT5 installed into /usr/local/qt5
And where can i specify this location.
Correct, you have to specify the location of your sysroot.
>For a step by step guide read the article. There is a paragraph titled "How to Build".
I cloned your git to home. I ran pi-master/tools $ sudo ./compile_ffmpeg.sh 2 and got error "
./compile_ffmpeg.sh: 20: ./compile_ffmpeg.sh: RPI_SYSROOT: Please, set the path to your sysroot in RPI_SYSROOT first."
As far as I know there is no relation whatsoever between omxplayer and Qt. PiOmxTextures does not interfere in any way with libQt5OpenGL. It only modifies libQt5Multimedia.
I installed libqt5multimedia5-plugins, after this i can play video from omxplayer. Before this installation i did not play video from omxplayer. After instalation libqt5multimedia5-plugins i can not make any examples, o got error: /usr/bin/ld: warning: libGLESv2.so.2, needed by /usr/lib/arm-linux-gnueabihf/libQt5OpenGL.so.5, not found (try using -rpath or -rpath-link)
/usr/lib/arm-linux-gnueabihf/libQt5OpenGL.so.5: undefined reference to `QFontEngine::glyphCache(void const*, QFontEngineGlyphCache::Type, QTransform const&) const'
collect2: ld returned 1 exit status
make: *** [player] Error 1
For a step by step guide read the article. There is a paragraph titled "How to Build".
pi@raspberrypi ~/opt/qt5/qtmultimedia/examples/multimedia/POCPlayer $ ./POCPlayer
defaultServiceProvider::requestService(): no service found for – "org.qt-project.qt.mediaplayer"
file:///usr/local/qt5/qml/QtQuick/Controls/Private/SourceProxy.qml:84: TypeError: Type error
file:///usr/local/qt5/qml/QtQuick/Controls/Private/SourceProxy.qml:84: TypeError: Type error
file:///usr/local/qt5/qml/QtQuick/Controls/Private/SourceProxy.qml:84: TypeError: Type error
file:///usr/local/qt5/qml/QtQuick/Controls/Private/SourceProxy.qml:84: TypeError: Type error
file:///usr/local/qt5/qml/QtQuick/Controls/Private/FastGlow.qml:132:25: Unable to assign [undefined] to QByteArray
file:///usr/local/qt5/qml/QtQuick/Controls/Private/FastGlow.qml:131:23: Unable to assign [undefined] to QByteArray
file:///usr/local/qt5/qml/QtQuick/Controls/Private/BasicButton.qml:146:29: Unable to assign [undefined] to QString
file:///usr/local/qt5/qml/QtQuick/Controls/Button.qml:85:22: Unable to assign [undefined] to QString
file:///usr/local/qt5/qml/QtQuick/Controls/Private/BasicButton.qml:146:29: Unable to assign [undefined] to QString
file:///usr/local/qt5/qml/QtQuick/Controls/Private/BasicButton.qml:146:29: Unable to assign [undefined] to QString
file:///usr/local/qt5/qml/QtQuick/Controls/Private/BasicButton.qml:146:29: Unable to assign [undefined] to QString
file:///usr/local/qt5/qml/QtQuick/Controls/Private/BasicButton.qml:146:29: Unable to assign [undefined] to QString
Can't find extension for .
Can't find extension for image/jp2.
Can't find extension for image/vnd.microsoft.icon.
Can't find extension for image/x-dds.
Can't find extension for image/x-icns.
Can't find extension for image/x-mng.
Hello Luca. Sorry with my english. I dont use cross compiling. I will create i small project (it will loop playing 720p h.264 video on Pi). I bilt qt5 on Pi for native using (using this http://qt-project.org/wiki/Native_Build_of_Qt5_on_a_Raspberry_Pi). Now i can qmake and make project on Pi. I ran examles sach as analogclock, cube it are work. But then i start /home/pi/opt/qt5/qtmultimedia/examples/multimediawidgets/player i have got the error "The QMediaPlayer object does not have a valid service. Please check the media service plugins are installed"
In your article i see that you able to play video from qt5 on Pi. I don't understand how i can install your lib to my envoirment for playng video. Can you help me, i need step by step guide.
Now i downloaded POCPlayer into my Pi, run qmake and make. I ran POCPlayer and have got :
> Why is it?
Why what? Why you need to scp?
> Should I create rasp_sysroot on my home folder?
If that is a good location for you yes.
> Should I copy /lib,/usr/lib,/usr/include,/opt to rasp_sysroot?
Yes.
Hello. Thanks for your job.
Can you help me with video on my Raspberry pi.
I installed QT5 using this article http://qt-project.org/wiki/Native_Build_of_Qt5_on_a_Raspberry_Pi .I can native build sample.
Now i want to install hardware acselerating for playing video.I clone your git. I ran pi/tools/compile_ffmpeg.sh and got "Please, set the path to your sysroot in RPI_SYSROOT first." what RPI_SYSROOT it?
From your article http://thebugfreeblog.blogspot.it/2013/03/bring-up-qt-501-on-raspberry-pi-with.html i read that "Instead of the loopback mount of the image on your system to get a correct sysroot, I quickly scp'ed the needed binaries from my board to a newly created sysroot. In particular I copied:
/lib
/usr/lib
/usr/include
/opt
I'll refer to the directory containing all of this as rasp_sysroot. Quick and dirty. You might also consider using rsync though.
As a final note on this I have to say that scp has the somehow pleasant collateral effect of following the symlinks in libs."
Why is it? Should I create rasp_sysroot on my home folder? Should I copy /lib,/usr/lib,/usr/include,/opt to rasp_sysroot?
Hello! Thanks for sharing.
Yes, as I pointed out in a recent post on the blog (http://thebugfreeblog.blogspot.it/2014/04/updates-on-hardware-accelerated-qt.html), I uploaded a new patch to Qt Multimedia. Maybe Broadcom fixed something in the omx component and now the patch I had to add is no more needed.
Bye!
hello again.
libopenmaxilmediaplayer ..running good on eglfs ,
but if i update rpi firmware ,video canvas become mirroring upside down.
thank's for your sharing ….
soory with my english
This comment has been removed by the author.
You're missing a Qt module. I don't know for the other part, sorry. Maybe it is caused by the missing module, I don't know.
Hi,
First, thanks for your job with qt and omx!
After cross compiling your scripts, when I tryed to run the example on the tools folder, it showed my the following error:
qrc:///qml/main.qml:80:5: Type POC_MetaData unavailable
qrc:///qml/POC_MetaData.qml:29:1: Type POC_AnimatedOverlay unavailable
qrc:///qml/POC_AnimatedOverlay.qml:25:1: module "QtQuick.Layouts" is not installed
The QtQuick issue should be my fault. I'll check if I missed some cross compiling, but what about the MetaData? Did happen before to you?
Thanks!
This comment has been removed by the author.
Sources are available already on guthub.
Hello, I am trying to find a method to play video in my QML application using Qtcreator 4.7. I am designing a UI for a Kiosk and i need the video to play in a never ending loop when the project is run. Cn youhelp me with an example of how the coding should be for this?
It seems like you're using a wrong toolchain as c++11 should be supported with linaro.
Hello ,soryy about my english first.I'm newby to on everything.
I try to compile pi-master on ubuntu 13. with raspberry toolchain.
./compile_ffmpeg.sh 1 .. done ok.
./prepare_openmaxil_backend.sh 1 ..error on make
.
cc1plus: error: unrecognized command line option '-std=c++11'
.
"-std=c++11" i not know from where the option come from ,may everyone can resolve this
thak's
Hello, were right!.
Works perfectly was a problem with my cross-compile
Sorry for the inconvenience, Thanks
I tested again with Qt tag v5.2.0 and the latest Raspbian image (2013.12.20). I had no issues.
Hello. I have already tested on 5.2 months ago and I had no problems. What are you experiencing?
I stopped to work on this many months ago as it seems the challenging part is completed, so not much is needed at the moment.
Hello,
Great job!
I have begun testing on 5.2 and have a problem.
You have plans to continue the code?
Tomorrow I try to send some pull request if I can fix the problem.
thanks
Hey, good work!
However I can't make it work. It finally compiled successfully and it produced the libraries here:
ls /usr/local/qt5pi/plugins/mediaservice/
libopenmaxilmediaplayer.so libqtmedia_audioengine.so
Also i copied all 3rdparty libraries to /usr/local/:
ls /usr/local/3rdparty/
PiOmxTextures ffmpeg
I set up ldconfig with this file:
cat /etc/ld.so.conf.d/omx.conf
/usr/local/3rdparty/PiOmxTextures/lib
/usr/local/3rdparty/ffmpeg/lib
ldconfig -v shows how he properly finds all libraries form these new directories.
Also I checked with ldd, and all libs seems present in the system…
Also the test project was cleaned and recompiled, but i still get this error:
Module 'QtMultimedia' does not contain a module identifier directive – it cannot be protected from external registrations.
defaultServiceProvider::requestService(): no service found for – "org.qt-project.qt.mediaplayer"
Any idea what I'm doing wrong?
This comment has been removed by the author.
You'll need the Linaro toolchain for Raspberry (you can find it online) and a sysroot that you can create from the image you say you have. The older posts about building Qt may help you (although you don't have to actually rebuild Qt, that is already available in the image). That patch should only be applied to PiOmxTextures if I remember correctly.
Quick question, the compile_ffmpeg-tools seems to assume that I have a raspbian cross-compilation toolchain ready to use, which I do not. Which are the necessary steps I need to take before I can fully build this? I'm on a pretty much clean install of a Xubuntu host machine.
I managed to get my hands on a pre-built package of yours, which worked very well I might add, with the exception of looping video, which I saw that you have fixed in your latest changes, why I need to patch the image.
Not sure whether that will work. That example is QWidget based. I only tested QML-based applications. If you want to test a standard Qt example I suggest the qml examples.
Well I was trying to see if the plugin would work in this example:
http://qt-project.org/doc/qt-5.0/qtmultimedia/multimediawidgets-videowidget.html
The console suggest the openmaxil-plugin is activating but no output is displayed. Though if the problem mentioned above might have something to do with it, but you're probably right that it's related to eglfs.
What do you mean by "videowidget"? Anyway, that message should not be related to PiOmxTextures or the openmaxil plugin. I suppose that is related to the eglfs plugin.
Got the plugin to work after your commit that improved the rotations. I misunderstood the system earlier and it did use EGLFS all along but for some reason just didn't work. Now that I've got it to work though it sometimes produces this error:
Requesting control for org.qt-project.qt.videowindowcontrol/5.0…
Requesting control for org.qt-project.qt.videorenderercontrol/5.0…
[0;34mvirtual void OpenMAXILVideoRendererControl::setSurface(QAbstractVideoSurface*)
[0;37m
This plugin does not support propagateSizeHints()
When I for example try to use it in a videowidget. Any Ideas as to what might be causing it? Awesome work overall by the way!
Hello everyone.
I use QT 5.1.1 from git, and i encounter the following problems:
1. The stop method doesnt work. there is no way to stop a video (however pause and play after pause do work)
2. After the video finished playing, there is no way to play it again.
From those of you who managed to make this work, do you encounter the same problems?
Thanks in advance.
If the plugin can find its libs it should load fine. Some more debugging information is needed, maybe try with QT_DEBUG_PLUGINS=1.
Hey, good work!
However I can't make it work. It finally compiled successfully and it produced the libraries here:
ls /usr/local/qt5pi/plugins/mediaservice/
libopenmaxilmediaplayer.so libqtmedia_audioengine.so
Also i copied all 3rdparty libraries to /usr/local/:
ls /usr/local/3rdparty/
PiOmxTextures ffmpeg
I set up ldconfig with this file:
cat /etc/ld.so.conf.d/omx.conf
/usr/local/3rdparty/PiOmxTextures/lib
/usr/local/3rdparty/ffmpeg/lib
ldconfig -v shows how he properly finds all libraries form these new directories.
Also I checked with ldd, and all libs seems present in the system…
Also the test project was cleaned and recompiled, but i still get this error:
Module 'QtMultimedia' does not contain a module identifier directive – it cannot be protected from external registrations.
defaultServiceProvider::requestService(): no service found for – "org.qt-project.qt.mediaplayer"
Any idea what I'm doing wrong?
X11 is rarely used when it comes to embedded hardware. Performance is bad and rarely hw acceleration is supported in there. I'm not sure for Raspberry. Anyway I've never tested the plugin on X11 nor I've tested on Wayland. I've always used eglfs. I might have omit that information.
Yes, I can run the qmlvideo-example up until the point that I have to "tap" to display the video. Same thing in qmlvideofx, as soon as the program tries to start displaying a video the app crashes. Does the openmaxil-backend require wayland to run? It's not really mentioned in the post/documentation or then I might have just missed it. I've only compiled QT and applied the instructions in this post, I haven't touched either Wayland or xcb, so I assume that it uses the default plugins and X11.
I'm sorry, I don't exactly know. Are you able to run any Qt/QML application at all? Seems like it is trying to use X11… Are you using the xcb platform plugin by any chance?
Thank you for the replies. I think I figured out how to link the libraries and while I've stopped getting the "no decoder available"-error, now when I try to start a video in the application(same in qmlvideo and qmlvideofx) the application crashes with:
bash: line 1: 2167 Illegal instruction DISPLAY=:0.0 /home/pi/multimedia/video/qmlvideofx/qmlvideofx
Remote application finished with exit code 132.
Any suggestions what might cause it?
Yes, if you recently cloned the repo, no modification is needed to the application.
For specific information about plugins location, refer to the Qt documentation. Anyway, I suggest you remove the old gstreamer plugin, so that there is no ambiguity. Only keep the OpenMAXIL plugin and place it in the correct location.
As for the rest, I suggest you have a look at some manuals. You need some understanding of Linux. However, libs needed by the linker must be placed in the default locations or otherwise specified with LD_LIBRARY_PATH.
I interpreted the problem like you said, that Qt is trying to use gstreamer instead of openmaxil, but attributed the problem to probably not having the correct libraries in the correct places (I'm quite new to both linux and Qt). Surprised that there was no warning about the libraries not being found though. But I understood it as when all files are in place, the qmlvideo-example should use the openmaxil-backend without needing to adjust the code in the example? Still a bit unsure of specifically which of the folders should go where, like I said I haven't had any warnings of missing files. I interpret it as the contents of the created openmaxil_backend-folder should be directly copied to /usr/local/qt5pi/plugins on the pi and the libPiOmxTextures.so file goes into ../qt5pi/plugins/mediaservice? Should the ffmpeg-folder created be copied to /usr/lib? Sorry if these questions are very elementary.
I've been given the task to try and create a lightweight browser for the RPi that can play a 720p-video stream at a certain location in the window, figured I could try building a Qt-webkit-browser with your openmaxil-plugin.
You have to provide the system all that is needed to load the Qt Multimedia implementation, which means: the Qt beckend goes into the proper directory for Qt to find (plugins/mediaservice), the modified version of the Qt module after the patch was applied, the correct version of ffmpeg according to the scripts provided on github and the libPiOmxTextures library, which is currently shared lib (I plan to switch to a static version, makes more sense). Put all this into your Pi and ensure the dynamic linker links to those libs. No re-flash.
The error you report suggests more something related to encoding, like Qt is trying to decode using the gstreamer plugin… Is this possible?
Hello! Thanks for some really nice guides on how to compile QT for the RPI. As a comment, I tried compiling the latest version (after the 25.6 edit) but it resulted in compilation errors. They were solved by installing libv4l2-dev (libv4l2.h missing in omx_camerasurfaceelement.cpp) and libboost1.5-dev (boost missing in omxplayersubtitles.h). Once those were installed everything compiled as it should.
However, I still have some problems getting the examples to run. I've run all the tools succesfully and copied the resulting folder to the qtmultimedia plugin-folder as instructed, then I patched and re-installed the qtmultimedia-module with the instructed config. However, I still get "Warning: "No decoder available for type 'video/x-h264.." when I try to run the qmlvideo-example. I'm not sure if ffmpeg didn't install correctly or if I'm missing something else. I'm not sure what the last part means "Of cuorse, you'll have to copy the Qt libraries that are built to your Pi, together with libPiOmxTextures.so.." does this mean anything else than having to re-flash the SD-card with the new installs? I'm not very familiar in this environment.
Thank you.
This comment has been removed by the author.
Hi Guys, Today I tried to compile the project PIOmxTexture but I had problems with the following error:
omxplayer_lib/utils/traits.hpp:141:5: error: expected unqualified-id before ‘using’
Someone can give me a hand ??
Thanks.
Hello, thx for fix
I started again with qt 5.01, now the qmlvideo example "work" !
I still cannot change source :(, it block in "deferring…."
———————————————–
time elapsed =>58
time elapsed =>59
time elapsed =>60
virtual void OpenMAXILPlayerControl::stop()
Stop
Waiting for the stop command to finish.Cleaning up…
Stopping OMX clock…
Closing players…
Closing players…
Stop command issued.
virtual void OpenMAXILPlayerControl::setMedia(const QMediaContent&, QIODevice*)
/video.avi
setMedia thread is: 0x4d87b8.
Deferring setMedia()…
virtual void OpenMAXILPlayerControl::play()
Deferring play() command…
Cleanup done.
Freeing texture…
virtual void OpenMAXILPlayerControl::freeTexture(OMX_TextureData*)
void OpenMAXILVideoRendererControl::onTextureInvalidated()
time elapsed =>61
time elapsed =>62
———————————————–
i am not sure what onTextureInvalidated means :/
I understand the situation.
Thank you very much for the great contribution.
Those objects were only used to present the concept, I won't update those anymore. Now you should use the QtMultimedia backend. The events provided anyway should be those exposed in the header: https://github.com/carlonluca/pi/blob/master/omx_mediaprocessorelement.h. Never tested anyway.
Sorry, I think I did not explain enough. What I do is use an event let me know when the video has reached its end and then perform the action of destroying the video object. As an example I set the code above, where used alpha effect but in my case would be to detect the end of the video playback.
In short, what are the events supported by "OMXMediaProcessor" and "OMXVideoSurface"???
Thank you very much.
I committed a quick fix to allow reset of the source. Very simple, just a missing implementation. Anyway, still there are cases where omxlpayer code asserts, mostly when rapidly restting, so I closer look is needed. Bye.
If by event you mean animation then I suppose alpha may not work. You can do other animations anyway as shown in the videos.
If you want something more you might want to have a look at the QtMultimedia backend instead of the custom components. That might support something more through shaders.
I never test for more than a couple of minutes so it is likely to fail a long play. As said in the other article, this is just a proof of concept.
Anyway, your test is interesting: 6 hours of continuous play? Or you mean 6 hours changing the video source? Or only play after the video is finished?
Well, now I'm doing more tests but the only problem presented to me is that resource consumption rises too much and ends up freezing the application. Now I'm looking for some kind of event that can be assigned to the object "OMXMediaProcessor" or "OMXVideoSurface". Here is a example:
Rectangle {
id: rect
width: 80, height: 80
color: "red"
NumberAnimation on opacity {
to: 0
duration: 1000
onRunningChanged {
if (! running) {
console.log ("Destroying …")
rect.destroy ();
}
}
}
}
This is the event I'd like to use but in "OMXMediaProcessor" and "OMXVideoSurface" can not be used.
It may do something similar???
Thank you.
in tests I did and everything worked fine, I did keep track of time (about 6 hours) and finally the app froze. The last info was that I used a lot of memory (about 800MB) and reached 60% CPU usage.
I realize that I can not release the entire video object and is the reason why the app fails.
I will continue testing.
Greetings.
A other test, show that when using the qtmultimedia, video need to be play at the start, if i dynamicaly create qml video after start, i get deffering ;o ( like in the example bellow )
But with the piomxtextures project, this work ( but i have some "glitch" on the video ) :
Next step is to read your cpp code 😉
Item{
id: containerVideo
width: 1920; height: 1080
property int elapsedTimeVideo: 0
property variant videoQml: 0
Timer {
interval: 1000; running: true; repeat: true
onTriggered: {
containerVideo.elapsedTimeVideo += 1;
console.log('time elapsed =>'+containerVideo.elapsedTimeVideo);
function player_video(url_video){
containerVideo.videoQml = Qt.createQmlObject('import QtQuick 2.0;import com.luke.qml 1.0; Item{ OMXMediaProcessor { id: mediaProcessor; source: "'+url_video+'" } OMXVideoSurface {id: omxVideoSurface; width: 1920; height: 1080; x: 0; y: 0; source: mediaProcessor } } ', containerVideo, "dynamicSnippet1");
}
if(containerVideo.elapsedTimeVideo == 1){
player_video('/video/video1.avi');
}else if(containerVideo.elapsedTimeVideo == 109){
player_video('/video/video2.avi');
}else if(containerVideo.elapsedTimeVideo == 226){
player_video('/video/video3.avi');
}else if(containerVideo.elapsedTimeVideo == 370){
player_video('/video/video4.avi');
}
}
}
}
I need to defer because the set of a new media must be done in the rendering thread where the OpenGL and the EGL contexts are available. Those calls arrive from Qt in a different thread.
Anyway, I don't think I ever tried to change the media resetting the source, I think qmlvideo and qmlvideofx free the media object entirely. It must be fixed, file the issue on github and I may have a look later.
Hello,
I apply the patch that add -rdynamic and add your class in the qmlvideo example.
After test, the change of source completely fail, the pause / stop also, i can get the position / duration data without problem.
Some output of the source change ( video.avi to test1.avi ):
root@raspberrypi:~/qt5_video# ./video
Module 'QtMultimedia' does not contain a module identifier directive – it cannot be protected from external registrations.
Creating player service…
Instantiating QMediaService…
OpenMAXILPlayerControl::OpenMAXILPlayerControl(QObject*)
Requesting control for org.qt-project.qt.metadatareadercontrol/5.0…
Requesting control for org.qt-project.qt.mediaavailabilitycontrol/5.0…
Requesting control for org.qt-project.qt.mediaplayercontrol/5.0…
Requesting control for org.qt-project.qt.medianetworkaccesscontrol/5.0…
virtual QMediaPlayer::State OpenMAXILPlayerControl::state() const
virtual QMediaPlayer::MediaStatus OpenMAXILPlayerControl::mediaStatus() const
virtual QMediaPlayer::MediaStatus OpenMAXILPlayerControl::mediaStatus() const
virtual void OpenMAXILPlayerControl::play()
Deferring play() command…
Requesting control for org.qt-project.qt.videorenderercontrol/5.0…
virtual void OpenMAXILVideoRendererControl::setSurface(QAbstractVideoSurface*)
virtual void OpenMAXILPlayerControl::stop()
Stop
virtual void OpenMAXILPlayerControl::setMedia(const QMediaContent&, QIODevice*)
/video.avi
setMedia thread is: 0x1e207b8.
Deferring setMedia()…
virtual void OpenMAXILPlayerControl::play()
Deferring play() command…
Renderer thread is: 0x1e4e3d8.
Processing post play()…
void OpenMAXILPlayerControl::playInt()
Play
Processing post setMedia()…
void OpenMAXILPlayerControl::setMediaInt(const QMediaContent&)
Opening…
Input #0, avi, from '/video.avi':
Metadata:
encoder : Lavf54.25.100
Duration: 00:01:49.37, start: 0.000000, bitrate: 1263 kb/s
Stream #0:0: Video: h264 (Constrained Baseline) (H264 / 0x34363248), yuv420p , 720×406, 25 fps, 25 tbr, 25 tbn, 50 tbc
Stream #0:1: Audio: aac ([255][0][0][0] / 0x00FF), 44100 Hz, stereo, fltp, 1 51 kb/s
Initializing OMX clock…
Opening video using OMX…
virtual OMX_TextureData* OpenMAXILPlayerControl::instantiateTexture(QSize)
Video codec omx-h264 width 720 height 406 profile 578 fps 25.000000
Opening audio using OMX…
Audio codec aac channels 2 samplerate 44100 bitspersample 16
Executing clock…
Processing post play()…
void OpenMAXILPlayerControl::playInt()
Play
Starting thread.
Decoding thread started.
Buffering timed out.
void OpenMAXILVideoRendererControl::onTextureReady(const OMX_TextureData*)
Status: 1
States: undefined
virtual qint64 OpenMAXILPlayerControl::duration() const
Duration: 109365
virtual qint64 OpenMAXILPlayerControl::position() const
Position: 5921088
virtual void OpenMAXILPlayerControl::stop()
Stop
Waiting for the stop command to finish.
Cleaning up…
Stopping OMX clock…
Closing players…
Closing players…
Freeing texture…
virtual void OpenMAXILPlayerControl::freeTexture(OMX_TextureData*)
Stop command issued.
virtual void OpenMAXILPlayerControl::setMedia(const QMediaContent&, QIODevice*)
/test1.avi
setMedia thread is: 0x1e207b8.
Deferring setMedia()…
virtual void OpenMAXILPlayerControl::play()
Deferring play() command…
virtual void OpenMAXILPlayerControl::play()
Cleanup done.
Deferring play() command…
void OpenMAXILVideoRendererControl::onTextureInvalidated()
Don't understand why "deffering .. " 🙁
I just tried and qmlvideo seems to work for me at the moment, although I have to say I might be using a slightly different version at the moment, which makes my test a little useless. Did you apply the changes to qmlvideo to export the sysmbol?
Hi,
I make it work with a simple multimedia test, it work, bug it seems that change the source of the player make it crash ( and i guess this is why the qt multimedia example crash too )
import QtQuick 2.0
import QtMultimedia 5.0
Rectangle {
MouseArea {
anchors.fill: parent
onClicked: {
player.source = "/test1.avi";
}
}
width: 1920
height: 1080
color: "black"
MediaPlayer {
id: player
source: "/video.avi"
autoPlay: true
}
VideoOutput {
id: videoOutput
source: player
anchors.fill: parent
}
}
Hello,
great functionnality !
I success compiled and play video with PiOmxTexture ( APP )
But with the basic qmlvideo example, i get
—————————————————————
Module 'QtMultimedia' does not contain a module identifier directive – it cannot be protected from external registrations.
Creating player service…
Instantiating QMediaService…
OpenMAXILPlayerControl::OpenMAXILPlayerControl(QObject*)
Requesting control for org.qt-project.qt.metadatareadercontrol/5.0…
Requesting control for org.qt-project.qt.mediaavailabilitycontrol/5.0…
Requesting control for org.qt-project.qt.mediaplayercontrol/5.0…
Requesting control for org.qt-project.qt.medianetworkaccesscontrol/5.0…
virtual QMediaPlayer::State OpenMAXILPlayerControl::state() const
virtual QMediaPlayer::MediaStatus OpenMAXILPlayerControl::mediaStatus() const
virtual QMediaPlayer::MediaStatus OpenMAXILPlayerControl::mediaStatus() const
Requesting control for org.qt-project.qt.videorenderercontrol/5.0…
virtual void OpenMAXILVideoRendererControl::setSurface(QAbstractVideoSurface*)
virtual int OpenMAXILPlayerControl::volume() const
virtual void OpenMAXILPlayerControl::setVolume(int)
[qmlvideo] Content.initialize: complete
[qmlvideo] SceneBasic.onClicked, started = false
[qmlvideo] Content.start
virtual void OpenMAXILPlayerControl::stop()
Stop
virtual void OpenMAXILPlayerControl::setMedia(const QMediaContent&, QIODevice*)
/root/piomxtextures/vans.avi
setMedia thread is: 0x88b6f8.
Deferring setMedia()…
virtual void OpenMAXILPlayerControl::setPosition(qint64)
virtual void OpenMAXILPlayerControl::play()
Deferring play() command…
——————————————————————–
and nothing on the display :s
Hi. Sorry never tried, I build my own Qt. The plugin should be compatible with any Qt 5.0 build I suppose, but there is a modification in QtMultimedia.
Has anyone tried the QT5 sources for raspberry from "http://twolife.be/raspbian/"??? I've done it and I've managed to create some things smoothly. I tried even the samples Luca and I work (of course I had to install additional libraries but everything goes on errors) and are already pulling the 5.0.2 version but still a qtbase package to install / upgrade files new version. Maybe they could try this repo.
Luca I ask a question??, You have tested this repo?? We will have to make many changes in the script to install the new backend for qtmultimedia??
Greetings and thanks.
yes, I was referring to the image that was on the other post and I've already gotten so I'll try a few things with this.
Thank you very much.
I found it:Need to add -I/opt/vc/include/interface/vmcs_host/linux to CFLAGS.
Hello.
After the upgrade I've lost my directory -vchi_local/vchost_config.h in /mnt/rasp-pi-rootfs/opt/vc/include/interface/vmcs_host/ .
I see this error:"make: *** No rule to make target `/mnt/rasp-pi-rootfs/opt/vc/include/interface/vmcs_host/vchi_local/vchost_config.h', needed by `.obj/release-shared/openmaxiltextureloader.o'. Stop."
Tell me please what to do?Can copy a lost directory from the old version(copy before upgrade)?
Thanks.
That probably means Qt was unable to load the plugin because the dyn linker returned an error. If you're new to C++ then you should learn it before doing this.
Yes, i checked in the mediaservice on the pi, and deleted all .so related to gstreamer ( only keep libopenmaxilmediaplayer.so )
and now !
Module 'QtMultimedia' does not contain a module identifier directive – it cannot be protected from external registrations.
defaultServiceProvider::requestService(): no service found for – "org.qt-project.qt.mediaplayer"
When you say 'ffmpeg and libPiOmxTextures.so in the linker path', i just copy ffmpeg lib libPiOmxTextures from 3rdparty in /usr … i am new to cpp :/
thx
If you get that it probably means you still have the gstreamer plugin in your Pi. Remove that and add the openmax based plugin. Also you'll need to have the correct version of ffmpeg and libPiOmxTextures.so in the linker path.
Yes sorry …, but now i have qt5.0.0rc2 working !
And about this post … when i test the example qmlvideo .. the video don't play and i have some error about gstreamer*** ( because the error is about gstreamer, i guess that it's not using your openmaxil plugin :(. )
I have in qt tree /qtmultimedia/plugins/mediaservice/
– libopenmaxilmediaplayer.so
and nothing about gstreamer, ( i copy 3rdparty/PiOmxTextures and ffmpeg in /usr in my pi
I don't see how this is related to the post… Anyway I don't think you want to use the xcb plugin and run the applications on X11. If you do, you'll have to install all the libxcb* packages.
"Perhaps you could try to compile the module QtMultimedia for other tests with this backend."
What do you mean?
"Do I have the image that you had uploaded and the links do not work for me but I will try to compile all qt in the system and start over from scratch."
Not understanding this either… Are you talking about the image with Qt and whatever inside from the other post? If yes, I said I'll not provide the FTP anymore. Use the edonkey network.
okay .. i downloaded the QT 5.0.0 RC2, it seems to success to make qtbase …
i guess that the git qt5 give me 5.1 version, and something is wrong with it ….
I am going to do the next, thx a lot for your blog !
Hello,
So damn, i dream to make it work, but i always have error 🙁
1/ Install a ubuntu 13.04 on computer ( fresh install )
2/ Install a raspbian on raspberry ( install package mentioned )
3/ Install crosscompile tools ( + fix symlink )
4/ SCP specified folder from raspberry
5/ Clone qt5 raspberry
6/ Go to qt5/qtbase for ./configure …, configure is fine, but it say "XCB = system", i think i need XCB = NO … but note sure
6.A/ First configure had error about that it want -qt-xcb or something like that … i did a ln -s libXext.so.6.4.0 libXext.so in rpi sysroot, and configure is now "okay"
7/ make => compile for 1 hour and then a error about XCB platform.
Following error :
root/opt/vc/include -I/opt/rpi/sysroot/opt/vc/include/interface/vcos/pthreads -I/opt/rpi/sysroot/opt/vc/include/interface/vmcs_host/linux -o .obj/release-shared/qxcbnativeinterface.o qxcbnativeinterface.cpp
qxcbnativeinterface.cpp: In member function âvoid QXcbNativeInterface::beep()â:
qxcbnativeinterface.cpp:97:5: error: â::Displayâ has not been declared
qxcbnativeinterface.cpp:97:16: error: âdisplayâ was not declared in this scope
qxcbnativeinterface.cpp:97:27: error: â::Displayâ has not been declared
qxcbnativeinterface.cpp:97:38: error: expected primary-expression before â)â token
qxcbnativeinterface.cpp:97:39: error: expected â;â before ânativeResourceForScreenâ
qxcbnativeinterface.cpp:316:1: error: expected â}â at end of input
qxcbnativeinterface.cpp: At global scope:
qxcbnativeinterface.cpp:86:1: warning: âqXcbResourceMapâ defined but not used [-Wunused-variable]
make[5]: *** [.obj/release-shared/qxcbnativeinterface.o] Error 1
make[5]: Leaving directory `/root/qt5/qtbase/src/plugins/platforms/xcb'
make[4]: *** [sub-xcb-plugin-pro-make_first-ordered] Error 2
make[4]: Leaving directory `/root/qt5/qtbase/src/plugins/platforms/xcb'
make[3]: *** [sub-xcb-make_first] Error 2
make[3]: Leaving directory `/root/qt5/qtbase/src/plugins/platforms'
make[2]: *** [sub-platforms-make_first] Error 2
make[2]: Leaving directory `/root/qt5/qtbase/src/plugins'
make[1]: *** [sub-plugins-make_first] Error 2
make[1]: Leaving directory `/root/qt5/qtbase/src'
make: *** [sub-src-make_first] Error 2
So Luca, I'm using the same method (createQmlObject) but found the error checking examples. The problem is that inside the method "createQmlObject" I can not create multiple individual items so that the right way was:
== Start ==
objStr var = 'import QtQuick 2.0; import com.luke.qml 1.0;
Rectangle {
id: box, color: "red", width: 20, height: 20;
OMXMediaProcessor {
id: mediaProcessor '+ indexVideo +';
source: "'+ url +'"
}
OMXVideoSurface {
id: omxVideoSurface;
width: 1370;
height: 770;
x: 0;
y: 0;
source: mediaProcessor '+ indexVideo +'
}
} ';
var dynamicObj1 = Qt.createQmlObject (objStr, mainRectangle "dynamicObject");
// dynamicObj1.destroy ((duration-1) * 1000); <- if I enable this, the application does not work
== End ==
The application now works for me but there are times that when you upload a video, the application freezes. This does not happen often but still happens.
The other thing that I can not get is to destroy the object created dynamically but I monitored for a time and system resources do not fall.
I will continue to debug the code and trying other things to let it run best. Perhaps you could try to compile the module QtMultimedia for other tests with this backend.
Do I have the image that you had uploaded and the links do not work for me but I will try to compile all qt in the system and start over from scratch.
I hope to have better results.
Thank you.
… and report the entire command line that resulted in that error.
Did you try using the QtScript object to check what error exactly is thrown? http://qt-project.org/doc/qt-4.8/qml-qt.html#createQmlObject-method
I tested with a semicolon and two points but it does not work. I realized that what does not work is when I add "OMXMediaProcessor {id: mediaProcessor};". Will not recognized as QML native object??? I do not know, well, if I keep looking and I'll leave the solution here for everyone.
Thanks Guru.
PS: You could send me your email?
Never used createQmlObject(), but maybe a missing semicolon after import com.luke.qml?
Hi guys, well, I have been looking for ways to create objects dynamically and for this I can use the method "createQmlObject". My intention is to create and destroy the object of video "OMXMediaProcessor" and "OMXVideoSurface" for each video that has to display. I have seen many examples but I always get the error "Qt.createQmlObject (): failed to create object '. I've checked the syntax and I can not find the problem.
My code to create objects is as follows:
var objStr = "import QtQuick 2.0;import com.luke.qml
OMXMediaProcessor {id:mediaProcessor}
OMXVideoSurface {id:omxVideoSurface;width:1370;height:770;x:0;y:0;source:mediaProcessor}";
var dynamicObject = Qt.createQmlObject(objStr,mainRectangle,"firstObject");
I hope someone can help with this.
Thank you very much.
That pkg config path seems to be the one from your host… anyway, file the issue on github and if I'll have the time I'll have a look. You might try to simply enable the exceptions.
"freetype" is found(export PKG_CONFIG_PATH=/usr/lib/i386-linux-gnu/pkgconfig:$PKG_CONFIG_PATH).
Following error:
../../../openmaxiltextureloader.cpp: In member function ‘bool OpenMAXILTextureLoader::loadTextureFromImage(QString, EGLDisplay, EGLContext, GLuint&)’:
../../../openmaxiltextureloader.cpp:107:28: error: exception handling disabled, use -fexceptions to enable
make: *** [.obj/release-shared/openmaxiltextureloader.o] Error 1
PiOmxTextures built. Copying libs and headers…
cp: failed stat for «build-PiOmxTextures/piomxtextures/*»: no such file or directory
Cleaning up…
Thanks.
omxplayer requires freetype. It seems it is not found in your sysroot.
Hello.
Can not build.
I did as you said – created a directory 3rdparty/ffmpeg in …/pi.
I start script compile_ffmpeg.sh .
Ok.
I start script prepare_openmaxil_backend.sh . Does not start.
I created a directory 3rdparty in ..pi/openmaxil_backend .
I start script prepare_openmaxil_backend.sh .
Error:not found freetype2.
export PKG_CONFIG_PATH=/usr/lib/i386-linux-gnu/pkgconfig:$PKG_CONFIG_PATH.
I again start script.Error:
../../../openmaxiltextureloader.cpp: In member function ‘bool OpenMAXILTextureLoader::loadTextureFromImage(QString, EGLDisplay, EGLContext, GLuint&)’:
../../../openmaxiltextureloader.cpp:107:28: error: exception handling disabled, use -fexceptions to enable
make: *** [.obj/release-shared/openmaxiltextureloader.o] Error 1
PiOmxTextures built. Copying libs and headers…
cp: failed stat for «build-PiOmxTextures/piomxtextures/*»: no such file or directory
Cleaning up…
It seems like your toolchain binaries are not in the path.
Hi again, when I compile ffmpeg I recive the following warning/error:
WARNING: arm-linux-gnueabihf-pkg-config not found, library detection may fail.
/bin/sh: 1: arm-linux-gnueabihf-ar: not found
make: *** [libavdevice/libavdevice.a] Error 127
Cleaning up…
mv: cannot `stat' over «ffmpeg_compiled/include»: no such file or directory
mv: cannot `stat' over «ffmpeg_compiled/lib»: no such file or directory
Done! Bye bye! 😉
Thanks
What is the error when compiling ffmpeg? Maybe it is the case to open issues on github. If I find the time, I can have a look at those, but my time is limited and I have other projects.
Well, the truth is that I need to get the application as it is something very important for the final development. No I have great knowledge in debug these applications but clearly I'm giving everything I know to get it.
The final development is that the application has the ability to read an XML file where is the list of content to be reproduced, so that all contents are displayed one after the other without interruption.
I'm putting in another separate example, the same application but you can read to display web addresses and these addresses can be web pages, videos, widgets, etc..
Ultimately I want to create a very complete media player for raspberry and remain as open-source project for the use of all.
I hope I will continue investigating accomplish what I need.
Perhaps the easiest way is to use QTMultimedia but still can not compile ffmpeg. I hope to have good results in the next test.
Thank you.
If resetting the source is not working then something is wrong in the implementation: you'll need to have a look and see what is wrong. The qmlvideo applications where loading and unloading the object; I never looked deeply into that documentation, but those seemed to use a Loader. Try to debug a little and see what is crashing.
I noticed that some deinit of the hardware libs was making it segfault: I didn't have time to analyze so I simply omitted that. Still it might be the case to have a look if you need this.
Hello Again, I have previous solution worked perfectly but now I have a problem that occurs when I want to load a new video to "video object (mediaProcessor)". I created a timer that runs an object XmlListModel, and in X seconds I reload a new video on the subject mediaProcessor.
When I use "mediaProcessor.source" to upload a new video, my application crashes. I tried to use it the following way:
mediaProcessor.source = "newvideo.mp4";
mediaProcessor.play ();
but still not working.
I do not know which way to load a new video and I've tried several ways.
I thought about creating an object "OMXMediaProcessor" for each file I want to load but do not know which way I can delete the previous object and create a new runtime.
I hope I can help.
Thank you.
PS: I tried to compile ffmpeg for use qtmultimedia but it does not work, perhaps qtmultimedia I work much easier but still can not work. I followed the guide and although it looks very easy, I can not compile ffmpeg.
Why restarting again? That only means you're not providing libv4l2. In PiOmxTextures there is some experimental code to acquire from camera (never completed because Pi seemed to have bad issues with USB drivers). Either remove that class that needs libv4l2 or provide headers and libs.
ouch … i block with
#sh prepare_openmaxil_backend.sh 2
…….
../../../omx_camerasurfaceelement.cpp:44:21: fatal error: libv4l2.h: No such file or directory
compilation terminated.
ffmpeg seems to be compiled fine but … 🙁
i will try again from 0 ..
Certainly I have not tried to point to the file that way. The strange thing is that in the example that works using the module "XmlListModel", I use the relative path of the form "playlist.xml" and absolute "/home/pi/playlist.xml" and it works both ways. In the project you created beam (PiOmxTextures) did not recognize such path's.
I hope your solution works.
Thanks Guru.
Have you tried to specify a URL instead of a relative or absolute path? So if the abs path to the file is:
/home/pi/file.xml
have you tried with:
file:///home/pi/file.xml?
hi guys, I'm testing with "XmlListModel" using "PiOmxTextures" but have not had good results. I tried "XmlListModel" on a separate example using only this module and it works perfect but when I use it in conjunction with "PiOmxTextures" always gives me the same error and is as follows:
Error opening :/ playlist.xml: Unknown Error
The path to the file "playlist.xml" is correct in the program, including an address I gave you absolute that would something like "/ home / pi / playlist.xml" but still giving the same error.
What I try to do is a video player listed in a XML.
Someone could help me??
Thank you.
PS: The file "main.qml" would be as follows:
import QtQuick 2.0
import QtQuick.XmlListModel 2.0
import com.luke.qml 1.0
Rectangle {
id: mainRectangle
//property int indexFlippable: 0
property int indexVideo: 0
property int durationVideo: 0
property int elapasedTime: 0
width: 1280
height: 720
color: "grey"
focus: true
XmlListModel {
id: xmlModel
source: "playlist.xml" // <- THIS FAILS
query: "/contenidos/contenido"
XmlRole { name: "url"; query: "url/string()" }
XmlRole { name: "tipo"; query: "tipo/string()" }
XmlRole { name: "duracion"; query: "duracion/string()" }
XmlRole { name: "orden"; query: "orden/string()" }
onStatusChanged: {
console.log(errorString());
}
}
Timer {
interval: 1000; running: true; repeat: true
onTriggered: {
if (durationVideo < elapasedTime) {
if (indexVideo < xmlModel.count ) {
var url = xmlModel.get(indexVideo).url;
var tipo = xmlModel.get(indexVideo).tipo;
var duracion = xmlModel.get(indexVideo).duracion;
var orden = xmlModel.get(indexVideo).orden;
durationVideo = duracion;
mediaProcessor.source = url;
mediaProcessor.play();
//showXmlData.text = "url: " + url + "n" +
// "tipo: " + tipo + "n" +
// "duracion: " + duracion + "n" +
// "orden: " + orden + "n";
indexVideo++;
if (indexVideo == xmlModel.count) {
indexVideo=0;
}
showXmlData.text = url;
}
elapasedTime=0;
durationVideo=10;
} else {
elapasedTime++;
}
console.log("Position: " + mediaProcessor.streamPosition + ".");
showXmlData.text = "Position: " + mediaProcessor.streamPosition + ".";
}
}
OMXMediaProcessor {
id: mediaProcessor
source: "updating.mp4"
}
OMXVideoSurface {
id: omxVideoSurface
width: 1370 //1280
height: 770 //720
x: 0
y: 0
source: mediaProcessor
SequentialAnimation {
id: theAnimation
PropertyAnimation {
target: omxVideoSurface
property: "opacity"
to: 0.0
duration: 1000
}
PropertyAnimation {
target: omxVideoSurface
property: "opacity"
to: 1.0
duration: 1000
}
}
}
Text {
id: showXmlData
anchors.centerIn: parent
text: "show xml"
}
}
Create the dir 3rdparty/ffmpeg in the root and do not move the script.
Create the directory 3rdparty/ffmpeg in the root. My bad, I forgot to commit it maybe.
Hello.
I decided that I should start with a script – ffmpeg.
I'm trying to run a script compile_ffmpeg.sh – "Dir structure is not correct! Aborting. Bye bye."
Trying for another.Created these directories -PiOmxTextures/openmaxil_backend/3rdparty/ffmpeg.
Copied the script to a folder "ffmpeg" – run – "Dir structure is not correct! Aborting. Bye bye."
How do I start compiling PiOmxTextures?
Hello
Seems nice !
But i block width
#sh compile_ffmpeg.sh
Downloading ffmpeg sources from git…
Dir structure is not correct! Aborting. Bye bye.
Yes i don't have a 3rdparty folder ;o how to get it ?
thx !
Awesome job! Regarding gst-omx on the Pi, in the beginning of the month I was able to build and use GStreamer-1.0 and gst-omx on the Pi, and get accelerated video output.
I didn't get very far hacking QtMultimedia into using GStreamer-1.0 instead of 0.10 but reading your post now, maybe this could also be achieved? I guess it would be a parallel solution to the one you've been working on.
Regardless, awesome job, I had your app running before, made a slight change – included the qtquick2applicationviewer.pri file in order to build, deploy and remotely run the project from Qt Creator.