Stream: helpdesk (published)

Topic: How to play video from a file?


view this post on Zulip Lilith Hafner (Feb 06 2024 at 21:29):

I'm trying to read a video from a file and perform some basic computer vision. As a part of this, I'd like to display the video (with some CV annotations) live. Is there a good Julia package for this?

The best I've go so far is

using VideoIO
using GLMakie

f = Figure()
display(f)
a = Axis(f)

r = openvideo("video.MOV")
img = read(r)
while !eof(r)
    read!(r, img)
    image!(a, img)
end

Which

For comparison, in Python I would use cv.imshow(img) which is performant enough to display a full video live with a stable framerate.

view this post on Zulip Marcin Koculak (Feb 07 2024 at 02:36):

Can you time the reading of a frame just to be sure it is fast enough for the desired framerate?

As for the Makie part, it looks like at every iteration you are generating a new plot - which is not optimal. You would want to plot once and then update the underlying data. One option is to use Observables - it might just be enough to give a smooth playback.
If not, there is also an undocumented Buffer type that I use to update lineplots with lot of points as fast as possible.

view this post on Zulip jar (Feb 07 2024 at 02:48):

fyi Makie's official support is on Discourse and Discord

view this post on Zulip Marcin Koculak (Feb 07 2024 at 03:38):

That's true, Discord is the easiest way to reach devs I guess.

However, this seems to work for me reasonably well (with FullHD video):

using VideoIO
using GLMakie

f = Figure()
a = Axis(f[1,1])

r = openvideo("D:\\Downloads\\file_example_MOV_1920_2_2MB.mov")
img = Observable(read(r))
rot_img = lift(rotr90, img)
image!(a, rot_img)
while !eof(r)
    img[] = read(r)
    sleep(1/60) #fps
end

view this post on Zulip Lilith Hafner (Feb 07 2024 at 15:40):

jar said:

fyi Makie's official support is on Discourse and Discord

Thanks for letting me know

However, this seems to work for me reasonably well (with FullHD video):

That works for me too; I added aspect=DataAspect() to preserve the aspect ratio and am now looking for a way to check if the Figure has been closed by a user, but this looks quite promising. Thanks!

view this post on Zulip Lilith Hafner (Feb 07 2024 at 15:42):

Can you time the reading of a frame just to be sure it is fast enough for the desired framerate?

I can read frames at 2000-3000 FPS


Last updated: Nov 06 2024 at 04:40 UTC