[Libav-user] How to corretly setting container and stream information when using an external encoder and using libavformat to pack the movie container
dev at irieger.net
Sat Oct 26 11:26:03 EEST 2019
I'm currently working on integrating Cineform file read and write into a
small toy project for processing image sequences. Worked with exr
sequences up until now but those are so storage heavy I decided to
include a intermediate video format and with it being the only freely
available one I decided to give cineform a go.
Therefore I implemented a small file reader first using libavformat to
open video containers and unpacking the stream while passing the frames
to the Cineform-sdk for decompressing to have the reference decoder.
Works fine so far.
Now I'm trying the other way round and pack the frames with the cineform
encoder and then create a movie container. I tried several approaches
from several samples and ours of going through the Doxygen documentation
and google searches etc.
I'm able to write a file that works correct with my simple reader that
will just extract package for package from the video stream and gets the
number of frames right and the result looks fine. But there are still a
few points I haven't managed to get to work correctly related to
metadata of the container and the stream:
1. Set correct container and stream metadata. I copied the codec
parameters I extracted from a read cineform example (exported from
Blackmagic DaVinci Resolve) to begin with as I found no better solution
for this use case yet.
- Bit rate is just the value from one sample and depends very much on
the input resolution, I think the value is from a 4K sample file. Does
this really matter? The value reported from "ffmpeg -i testout.mov" is
completely different anyway, I assume it is calculated when calling
2. Correct frame rate/time base settings. Tried several examples, tried
replicating what I extracted from them and made of the documentation
regarding libav I found about this topic but as the link below (ffmpeg
-i output) shows, the framerate is always wrong. Had combinations of
parameters where I had clips with 16k fps etc.
3. Setting start time code of the stream/clip like in the example.
4. Set stream metadata like encoder information.
Can somebody give me a hint how to set those data to have valid, well
I have the basic structure of calls I do to libav extracted from my
framework and packed it in a gist for better readability:
Also there is the output of an "ffmpeg -i" call for each the reference
file and the generated output in the file ffmpeg.
Looking forward to some tips how to tackle this task.
More information about the Libav-user