<div dir="auto"><div><br><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Le jeu. 9 mars 2023, 22 h 27, <a href="mailto:amindfv@mailbox.org">amindfv@mailbox.org</a> <<a href="mailto:amindfv@mailbox.org">amindfv@mailbox.org</a>> a écrit :<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Thu, Mar 09, 2023 at 06:28:19PM -0500, Nicolas Dufresne wrote:<br>
> Hi,<br>
> <br>
> Le jeu. 9 mars 2023, 09 h 00, amindfv--- via gstreamer-devel <<br>
> <a href="mailto:gstreamer-devel@lists.freedesktop.org" target="_blank" rel="noreferrer">gstreamer-devel@lists.freedesktop.org</a>> a écrit :<br>
> <br>
> > I've got an A420_10LE video stream I'd like to write to a file, preserving<br>
> > its alpha channel.<br>
> ><br>
> > I've found that I can use ProRes, with a pipeline like:<br>
> ><br>
> >     ... ! video/x-raw,format=A420_10LE ! videoconvert !<br>
> > video/x-raw,format=A444_10LE ! avenc_prores ! qtmux ! filesink<br>
> ><br>
> > This works but it's slow and results in massive files (almost 5GB for 30<br>
> > seconds of 1080p video).<br>
> ><br>
> > Are there faster+smaller options (encoders and maybe muxers) for writing<br>
> > to files with alpha? And in the spirit of learning to fish, how could I<br>
> > have found them (e.g. with `gst-inspect`)?<br>
> ><br>
<br>
Thanks for the advice. A few questions:<br>
<br>
> For higher compression, I'd opt for lossy compression. At 1080p, VP9, H.264<br>
> would be good option. VP9 + webm (matroska) seems the shortest path.<br>
> <br>
> I'd basically wrap 2 vp9enc into a bin.<br>
<br>
Just out of curiosity, is a bin necessary or just for convenience?<br></blockquote></div></div><div dir="auto"><br></div><div dir="auto">It is to reuse existing decoders/encoders without modification. It's not required, but complexity of doing this in a single encoder/decoder is high. See next answer for more details.</div><div dir="auto"><br></div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
> Adding a simple element alphasplit,<br>
> to seperate the stream in two, and finally having a vp9alphacombine that<br>
> takes two vp9 streams and attach the alpha using the existing meta into the<br>
> color stream. The final step would to to add matroskamux support.<br>
<br>
`vp9alphacombine` doesn't already exist, right? Also, what is the advantage to encoding as vp9 then combining alphas, vs combining alphas as "video/x-raw" then encoding as vp9? (Of course, I notice `vp9enc` doesn't currently support any pixel formats with alpha).<br></blockquote></div></div><div dir="auto"><br></div><div dir="auto">Maybe this will be compressedalphacombine or something.</div><div dir="auto"><br></div><div dir="auto">The key aspect is that VP9 does not support alpha at all. Instead, convert the alpha to I420 and later we ignore the chromacity.</div><div dir="auto"><br></div><div dir="auto">It's the same for h.264 and h.265. Except that you don't need third party muxer capabilities to embed the alpha. The bitstream has auxiliary stream support.</div><div dir="auto"><br></div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
As to `matroskamux`, would it be getting a "video/x-vp9" stream from the `vp9alphacombine`? If so, is it necessary to add support for vp9 with an alpha channel to matroskamux? Or would matroskamux simply mux without "caring" about the internal vp9 stream?<br></blockquote></div></div><div dir="auto"><br></div><div dir="auto">For vp9, the muxer needs to know, the encoders don't. For h.264/h.265, this is something to design, but I like the idea of using unmodified encoders and create element to add the auxiliary into the bitstream.</div><div dir="auto"><br></div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
> But if implementing this is not for you, FFMPEG fully support this, you can<br>
> add FFMPEG element, or wrap it with appsrc/sink.<br>
<br>
Are there any links/information about an ffmpeg element? Is this something that's been built before?<br>
<br>
Also if going the appsrc/sink route, is the idea to convert GstBuffers to AVFrames and use the ffmpeg/libav libraries?<br></blockquote></div></div><div dir="auto"><br></div><div dir="auto">I don't have a very helpful link for you, but you'll find the parameters one may pass to FFMPEG cmdl, I never used that at the C level. I think kdenlive uses that too.</div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Thanks,<br>
Tom<br>
</blockquote></div></div></div>