Unsolved video doesn't display on LCD screen
-
How are you feeding your pipeline ?
-
Seems that I cannot upload my source code here. It is pretty simple, first I use opencv to capture a image, and emit the frame.
forever{ try { if (!normal_video.isOpened()) { continue; } cv::Mat normal_frame; normal_video >> normal_frame; emit updateCameraFrame(normal_frame.clone()); }
Then in another thread, the frame is handled:
void VideoManager::frameReceived(const cv::Mat &frame) { if(mRunning){ cv::Mat image(frame); mCameraProducer->updateFrame(Mat2QImage(image)); } } ...... void VideoProducer::updateFrame(QImage image) { if(image.size() != mFormat.frameSize()) { qDebug() << "newSize: " << image.size(); closeSurface(); mFormat = QVideoSurfaceFormat( image.size(), QVideoFrame::PixelFormat::Format_RGB32); mSurface->start(mFormat); } mSurface->present( QVideoFrame( image ) ); }
As shown above, everything is working unless last step: mSurface->present(), which cannot really present the image/video on screen.
-
@Jeffff said in video doesn't display on LCD screen:
VideoProducer
Is that one in a different thread than the main thread ?
-
Yes, sure. video capturing and displaying are 2 different threads, they are sync by signal.
-
That I understood, my question is: does the displaying happen in the main thread of your application ? Not a secondary thread that you created.
-
Yes, it is the main thread of my application. As I've mentioned at the beginning, the same code can run on my Ubuntu.
-
@Jeffff said in video doesn't display on LCD screen:
multimedia.video: media object is QObject(0x0)
This one looks pretty odd and is likely related to your 0 frame rate.
Can you test with a minimal QVideoWidget to compare ?
-
I did some test by qmlvideo sample App, which runs good on same imx6 board. As qmlvideo runs smoothly, it means my running environment is good.
On the other hand, I found that if I use small resolution image frame(such as 480*270), it is working. All frames are display on preset windows(800*480), obviously, it should be gstreamer which enlarges the frame. The very weird thing is that other large resolutions, such as (640*360, 1280*720, 1920*1080), are not OK to be displayed, in replace, the area keeps dark.
With the logging enabled , I can also find the gstreamer plugin inserted as below figure shows even though video cannot be displayed.
-
For my own app and the qmlvideo app, I also dump their lib dependency as below:
file:///mnt/hgfs/Share/Screenshot%20from%202021-12-01%2023-30-58.png
Another strange part to me: the Qt5Multimediea appears in my app, while it doesn't appear in qmlvideo example. As I described before, my app cannot display video frame, while qmlvideo can display... -
-
-
Ok, the sample does not link to the QtMultimedia library directly because it does not use it directly as is your C++ application.
The QVideoWidget class, if memory serves well does not support the same number of formats as the QtQuick Video item.