[Interest] [Qt3D] Render to video

Harald Vistnes harald.vistnes at gmail.com
Mon Apr 18 15:46:14 CEST 2016


If anyone try out Sean's suggestion and get it to work, it would be great
it they share an example so we don't all have to reinvent the wheel :)

Harald


2016-04-18 15:28 GMT+02:00 Andy <asmaloney at gmail.com>:

> On Mon, Apr 18, 2016 at 9:05 AM, Sean Harmer <sean.harmer at kdab.com> wrote:
>
>> Hi,
>>
>> I think it's possible, although it's not an out of the box feature yet, as
>> Harald pointed out.
>>
>> Have a look into this kind of approach:
>>
>> * Implement something similar to the Scene3DItem that allows to embed Qt
>> 3D
>> into a Qt Quick 2 scene
>>
>
> Thanks Sean.  I wouldn't have thought to go through Qt Quick since I've
> never used it and it's not on my radar.
>
>
>>
>> * This requires using a little bit of private (for now) API to feed the
>> Qt 3D
>> renderer your own OpenGL context and to ask it to render when needed.
>>
>> * Use an FBO (as the Scene3D item does) as the render target - take care
>> to
>> tell the framegraph the size of this "external" render target.
>>
>> * Then, once the scene is rendered on your custom context, either:
>>
>> a) use glReadPixels to grab the contents of the texture you attached to
>> the
>> FBO and pass it to a software encoder.
>>
>> or
>>
>> b) use the texture id to pass the data to a hardware encoder such as nvenc
>> without needing a round trip from the GPU->CPU->GPU.
>>
>> I think that can be made to work.
>>
>
> nvenc looks like it would be a big win for those with NVIDIA cards, and I
> see AMD has the analogous VCE.
>
>
> Thanks everyone for helping me get a better sense of the problem I'm
> trying to solve!
>
>
>>
>> Cheers,
>>
>> Sean
>>
>> On Monday 18 April 2016 08:38:21 Andy wrote:
>> > On Mon, Apr 18, 2016 at 3:26 AM, Harald Vistnes <
>> harald.vistnes at gmail.com>
>> >
>> > wrote:
>> > > Hi Andy,
>> > >
>> > > An alternative is to use the FFMPEG encoding library instead of the
>> > > command line tools. Then you can pass each frame to the video encoder
>> as
>> > > you generate it without writing them all to disk first.
>> >
>> > This is non-GPL software, so I can't use the lib directly (I should have
>> > mentioned that).  I haven't found a BSD or MIT lib that encodes the
>> common
>> > formats - is anyone aware of one?
>> >
>> > > The natural way to generate the QImages would be to render to an
>> offscreen
>> > > surface of the desired resolution, and then pass each frame to the
>> video
>> > > encoder.
>> >
>> > Great - so I'm on the right track!
>> >
>> > > Unfortunately, reading back the content of offscreen surfaces is
>> missing
>> > > in Qt3D. According to these it will not come before 5.8.
>> > >
>> > > https://bugreports.qt.io/browse/QTBUG-52136
>> > > https://bugreports.qt.io/browse/QTBUG-52074
>> > >
>> > > So AFAIK we just have to wait with generating images and videos with
>> Qt3D.
>> >
>> > Thanks Harald.  Your report is exactly what I'm looking for...  That's
>> > unfortunate though - a real showstopper.
>> >
>> > > Cheers,
>> > > Harald
>> > >
>> > > 2016-04-18 5:46 GMT+02:00 Andy <asmaloney at gmail.com>:
>> > >> Goal: generate video with a user-specified resolution, frame rate, &
>> > >> container/codec format from an animation in my Qt3D window
>> > >>
>> > >> (Disclaimer: I've never worked with video files before!)
>> > >>
>> > >> As far as I can tell, Qt doesn't provide a way to generate video
>> files
>> > >> directly, so I think I have to write a series of QImages to disk and
>> use
>> > >> them to generate a video using ffmpeg.  This seems like it will take
>> a
>> > >> large amount of disk space, be pretty heavy on the I/O, and
>> generally be
>> > >> slow.  Are there better solutions?
>> > >>
>> > >> If I need to do it that way though, I must generate QImages from my
>> > >> existing Qt3DCore::QAspectEngine in my QWindow-derived class.  I
>> don't
>> > >> see
>> > >> a clear/elegant way to do this.
>> > >>
>> > >> I think I need to create an offscreen surface? window? with the
>> correct
>> > >> resolution and then somehow render & animate my scene to it, saving
>> > >> snapshots as I move the camera.  (I am already using
>> QAbstractAnimation
>> > >> to
>> > >> move the camera, so I would use it to grab the snapshots as well.)
>> Can I
>> > >> use the same root entity in multiple QAspectEngines? (i.e.
>> > >> setRootEntity()
>> > >> to my root entity in the new offscreen and tell it to render.)
>> > >>
>> > >> Has anyone done this before?  Is this even close to the right
>> approach?
>> > >>
>> > >> (I'm using straight C++ - no QML.)
>> > >>
>> > >> Thanks!
>> > >>
>> > >> ---
>> > >> Andy Maloney  //  https://asmaloney.com
>> > >> twitter ~ @asmaloney <https://twitter.com/asmaloney>
>> > >>
>> > >>
>> > >> _______________________________________________
>> > >> Interest mailing list
>> > >> Interest at qt-project.org
>> > >> http://lists.qt-project.org/mailman/listinfo/interest
>> >
>> > ---
>> > Andy Maloney  //  https://asmaloney.com
>> > twitter ~ @asmaloney <https://twitter.com/asmaloney>
>>
>> --
>> Dr Sean Harmer | sean.harmer at kdab.com | Managing Director UK
>> KDAB (UK) Ltd, a KDAB Group company
>> Tel. +44 (0)1625 809908; Sweden (HQ) +46-563-540090
>> Mobile: +44 (0)7545 140604
>> KDAB - Qt Experts
>>
>
> ---
> Andy Maloney  //  https://asmaloney.com
> twitter ~ @asmaloney <https://twitter.com/asmaloney>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20160418/7765403f/attachment.html>


More information about the Interest mailing list