[FFmpeg-user] streamselect in a realtime application
Michael Koch
astroelectronic at t-online.de
Thu Jun 16 10:15:10 EEST 2022
Am 13.06.2022 um 22:20 schrieb Michael Koch:
> Hello,
>
> I'm using FFmpeg for a realtime wormhole simulation in a planetarium.
> There are two inputs:
> a) An equirectangular video for the environment.
> b) A realtime stream from a 360° camera, this is mapped inside the
> wormhole.
>
> Both inputs are stitched together with xstack, and then a suitable
> remap function is applied. The output is in fisheye format and
> streamed to the planetarium projector. So far, that's working fine.
>
> But I also want to switch the wormhole on and off at certain times (t1
> and t2). To do this, I did try two approaches:
>
> Approach 1:
> Two streams are generated, one without and the other with wormhole.
> Then one of them is selected by a streamselect filter. The drawback of
> this approach is that double CPU power is required. Both streams must
> be generated by remap filters, although only one of them is used.
>
> Approach 2:
> I use two sets of xmap and ymap files for the remap filter. One set
> without and the other set with wormhole:
> [xmap1][xmap2]streamselect at 1=map=0[xmap];[ymap1][ymap2]streamselect at 2=map=0[ymap];[a][xmap][ymap]remap...
>
> The drawback of this approach is that I must use -loop 1 before each
> of the four mapping file inputs. Which means the files are reloaded
> for each frame. This is a huge waste of time. If I don't use -loop 1,
> then it seems the streamselect filters don't work.
I would like to understand why in some cases -loop 1 is required before
the input files, and in some cases it can be omitted.
This works without -loop 1:
ffmpeg -i in.mp4 -i xmap.pgm -i ymap.pgm -lavfi [0][1][2]remap out.mp4
When I use streamselect to select one of two mapping files, it doesn't
work. There is no error message, but it's always the first input used,
regardless which commands I send to the streamselect filers:
ffmpeg -i in.mp4 -i x1.pgm -i x2.pgm -i y1.pgm -i y2.pgm -lavfi
[1][2]streamselect at 1=map=0[xmap];[3][4]streamselect at 2=map=0[ymap];[0][xmap][ymap]remap
out.mp4
However the same example does work when I add -loop 1 before each
mapping file:
ffmpeg -i in.mp4 -loop 1 -i x1.pgm -loop 1 -i x2.pgm -loop 1 -i y1.pgm
-loop 1 -i y2.pgm -lavfi
[1][2]streamselect at 1=map=0[xmap];[3][4]streamselect at 2=map=0[ymap];[0][xmap][ymap]remap
out.mp4
Another question:
Does -loop 1 mean the file is reloaded from disk for each frame? Or is
it copied from an internal buffer?
Michael
More information about the ffmpeg-user
mailing list