I'm trying to extract the frames of a video as individual images but it's really slow, except when I'm using jpeg. The obvious issue with jpegs is the data loss from the compression, I want the images to be lossless. Extracting them as jpegs manages about 50-70 fps but as pngs it's only 4 fps and it seems to continue getting slower, after 1 minute of the 11 minute video it's only 3.5 fps.

I suspect it's because I'm doing this on an external 5tb hard drive, connected over USB 3.0 and the write speed can't keep up. So my idea was to use a different image format. I tried lossless jpeg xl and lossless webp but both of them are even slower, only managing to extract at about 0.5 fps or something. I have no idea why that's so slow, the files are a lot smaller than png, so it can't be because of the write speed.

I would appreciate it if anyone could help me with this.

  • drwankingstein@lemmy.dbzer0.com
    ·
    edit-2
    4 months ago

    A) Export using a lower effort, with libjxl effort 2 or something will be fine.

    B) Export to a faster image format like QOI or TIFF or PPM/PNM etc.

    PNG, JXL, WEBP, all have fairly high encode times by default with ffmpeg. lower the effort or use a faster format

    If you think that it really could be write speed limitations, encode to a ramdisk first then transfer if you have the spare ram, but using a different and faster format will probably help as PNG is still very slow to encode. (writing to /tmp is fine for this)

    • Fisch@discuss.tchncs.de
      hexagon
      ·
      edit-2
      4 months ago

      A) I actually didn't know about this before, do you know what option I need to use in ffmpeg to set the effort?

      B) I tried those but it's the same issue as with png, that the hard drive's write speed is too slow (or it's the USB 3 connection but the result is the same)

      Edit: Just found out how to set the effort. Setting it to 1 is quite a bit faster but still slow at only 3.8 fps.

      • drwankingstein@lemmy.dbzer0.com
        ·
        edit-2
        4 months ago

        what are your system specs? at a low effort you should be getting a lot more FPS, what cli command are you using? but I guess it would be best for you to export to /tmp given enough ram and then go from there

        EDIT: for context, when encoding libjxl I would do -distance 0 -effort 2 for lossless output

        • Fisch@discuss.tchncs.de
          hexagon
          ·
          4 months ago

          I have a Ryzen 5 3600. My command was ffmpeg -i video.mp4 -threads 12 -distance 0 -effort 1 extract/%06d.jxl.