I thought I should explain the process I’m using to create the HDR avif files I’m using on the ACES ODT Candidates page:
https://alexfry.github.io/ACES_ODT_Candidates_Examples/
I’m using the avifenc
command line tool, which is part of the libavif bunde
of tools from here:
I’m on a Mac, and just installed it via: brew install libavif
To make the process of generating the images a bit simpler for myself, I’ve made a very basic nuke wrapper for the tool, which you can see if you open the nukescript I’m using to generate the images here:
The Write nodes are all dumping out 16nit png files, preencoded as Rec.2020 PQ, and there are a couple of custom user knobs added to each node.
One for setting the path where I want to write the final avif files (which is just based off the name of the png files, with a new destination and extension)
And 3 for setting the CICP Coding-independent code points - Wikipedia metadata flags.
Then, under the python tab, there is a simple “after each frame” callback, that runs the python code below after each frame:
import sys
from subprocess import Popen
node = nuke.thisNode()
#node = nuke.selectedNode()
sourcePath = node.knob('file').evaluate()
destinationPath = node.knob('destinationPath').evaluate()
cicp_P = str(int(node.knob('cicp_P').value()))
cicp_T = str(int(node.knob('cicp_T').value()))
cicp_M = str(int(node.knob('cicp_M').value()))
cicp_string = '/'.join([cicp_P,cicp_T,cicp_M])
commandString = '/usr/local/bin/avifenc --cicp %s \"%s\" \"%s\" ; rm \"%s\"' % (cicp_string,sourcePath,destinationPath,sourcePath)
print(commandString)
os.system(commandString)
proc = Popen([commandString], shell=True,
stdin=None, stdout=None, stderr=None, close_fds=True)
In short, it just grabs the input png path, the output avif path, the cicp flags, forms an avifenc command, runs it, then deletes the orginal png frame.
Something like:
/usr/local/bin/avifenc --cicp 9 16 9 original.png output.avif
rm original.png
Just Render, and the avif files are ready to go.
If anyone is interested in the code used to generate the webpages themselves, the code is all in here: