Cryptonaut
Cryptonaut

Reputation: 75

Python FFmpeg: Setting VBR and BT.709

I'm using this Python library to programmatically generate a short video using an image (.png) as input. The video needs to match the specifications of another video created by someone else.

The key differences between my output and the other are the following (these are the media attributes I desire to have):

How would I achieve VBR? It was my understanding ProRes 422 HQ natively used unconstrained VBR yet my output specifies CBR.

Secondly, as can be seen from my code, I'm attempting to conform to BT.709. However, my media information output does not specify this. What am I doing incorrectly?

Here's my code:

    image = ffmpeg.input(input_image, t='00:00:10', framerate='24000/1001', loop='1', probesize='42M')

    output = ffmpeg.output(image, output_video,
    f='mov',
    vcodec='prores_ks',
    vprofile='3',
    pix_fmt='yuv422p10le',
    g='48',
    video_track_timescale='24000',
    movflags='use_metadata_tags',
    timecode='00:00:00:00',
    color_primaries='bt709',
    color_trc='bt709',
    colorspace='bt709',
    qcomp='1',
    # BT.709 issue solved by adding the bsf option as seen via the line below
    bsf='prores_metadata=color_primaries=bt709:color_trc=bt709:colorspace=bt709', 
    vf='scale=in_range=full:in_color_matrix=bt709:out_range=full:out_color_matrix=bt709')

    output.run()

Here's the media information produced by my output:

{
   "media":{
      "@ref":"Redacted",
      "track":[
         {
            "@type":"General",
            "VideoCount":"1",
            "OtherCount":"1",
            "FileExtension":"mov",
            "Format":"MPEG-4",
            "Format_Profile":"QuickTime",
            "CodecID":"qt  ",
            "CodecID_Version":"0000.02",
            "CodecID_Compatible":"qt  ",
            "FileSize":"196366623",
            "Duration":"10.010",
            "OverallBitRate":"156936362",
            "FrameRate":"23.976",
            "FrameCount":"240",
            "StreamSize":"2463",
            "HeaderSize":"28",
            "DataSize":"196364172",
            "FooterSize":"2423",
            "IsStreamable":"No",
            "File_Created_Date":"UTC 2019-12-13 19:26:37.150",
            "File_Created_Date_Local":"2019-12-13 19:26:37.150",
            "File_Modified_Date":"UTC 2019-12-13 19:27:20.303",
            "File_Modified_Date_Local":"2019-12-13 19:27:20.303"
         },
         {
            "@type":"Video",
            "StreamOrder":"0",
            "ID":"1",
            "Format":"ProRes",
            "Format_Version":"0",
            "Format_Profile":"422 HQ",
            "CodecID":"apch",
            "Duration":"10.010",
            "BitRate_Mode":"CBR",
            "BitRate":"156934237",
            "Width":"1920",
            "Height":"1080",
            "Sampled_Width":"1920",
            "Sampled_Height":"1080",
            "PixelAspectRatio":"1.000",
            "DisplayAspectRatio":"1.778",
            "Rotation":"0.000",
            "FrameRate_Mode":"CFR",
            "FrameRate":"23.976",
            "FrameCount":"240",
            "ColorSpace":"YUV",
            "ChromaSubsampling":"4:2:2",
            "ScanType":"Progressive",
            "Delay":"0.000",
            "StreamSize":"196364160",
            "Encoded_Library":"Lavc",
            "colour_description_present":"Yes",
            "colour_description_present_Source":"Stream",
            "colour_primaries_Source":"Stream",
            "transfer_characteristics_Source":"Stream",
            "matrix_coefficients_Source":"Stream"
         },
         {
            "@type":"Other",
            "StreamOrder":"1",
            "ID":"2",
            "Type":"Time code",
            "Format":"QuickTime TC",
            "Duration":"10.010",
            "FrameRate":"23.976",
            "TimeCode_FirstFrame":"00:00:00:00",
            "TimeCode_Striped":"Yes",
            "Language":"en",
            "Default":"No"
         }
      ]
   }
}

Here's the media information spec I'm trying to match:

{
   "media":{
      "@ref":"Redacted",
      "track":[
         {
            "@type":"General",
            "VideoCount":"1",
            "OtherCount":"1",
            "FileExtension":"mov",
            "Format":"MPEG-4",
            "Format_Profile":"QuickTime",
            "CodecID":"qt  ",
            "CodecID_Version":"2005.03",
            "CodecID_Compatible":"qt  ",
            "FileSize":"1397430682",
            "Duration":"70.737",
            "OverallBitRate_Mode":"VBR",
            "OverallBitRate":"158042403",
            "FrameRate":"23.976",
            "FrameCount":"1696",
            "StreamSize":"9898",
            "HeaderSize":"28",
            "DataSize":"1397420796",
            "FooterSize":"9858",
            "IsStreamable":"No",
            "Encoded_Date":"UTC 2019-04-29 22:26:32",
            "Tagged_Date":"UTC 2019-04-29 22:26:32",
            "File_Created_Date":"UTC 2019-12-12 16:52:57.215",
            "File_Created_Date_Local":"2019-12-12 16:52:57.215",
            "File_Modified_Date":"UTC 2019-12-12 17:25:58.903",
            "File_Modified_Date_Local":"2019-12-12 17:25:58.903",
            "Encoded_Application":"DVP Factory r561 (2019-04-25), Host: dvp07"
         },
         {
            "@type":"Video",
            "StreamOrder":"0",
            "ID":"1",
            "Format":"ProRes",
            "Format_Version":"0",
            "Format_Profile":"422 HQ",
            "CodecID":"apch",
            "Duration":"70.737",
            "Duration_LastFrame":"-0.000",
            "BitRate_Mode":"VBR",
            "BitRate":"158040381",
            "Width":"1920",
            "Height":"1080",
            "Sampled_Width":"1920",
            "Sampled_Height":"1080",
            "PixelAspectRatio":"1.000",
            "DisplayAspectRatio":"1.778",
            "Rotation":"0.000",
            "FrameRate_Mode":"CFR",
            "FrameRate":"23.976",
            "FrameCount":"1696",
            "ColorSpace":"YUV",
            "ChromaSubsampling":"4:2:2",
            "ScanType":"Progressive",
            "Delay":"0.000",
            "StreamSize":"1397420784",
            "Encoded_Library":"agi0",
            "Language":"en",
            "Encoded_Date":"UTC 2019-04-29 22:26:32",
            "Tagged_Date":"UTC 2019-04-29 22:26:32",
            "colour_description_present":"Yes",
            "colour_description_present_Source":"Container / Stream",
            "colour_primaries":"BT.709",
            "colour_primaries_Source":"Container",
            "colour_primaries_Original_Source":"Stream",
            "transfer_characteristics":"BT.709",
            "transfer_characteristics_Source":"Container",
            "transfer_characteristics_Original_Source":"Stream",
            "matrix_coefficients":"BT.709",
            "matrix_coefficients_Source":"Container / Stream"
         },
         {
            "@type":"Other",
            "StreamOrder":"1",
            "ID":"2",
            "Type":"Time code",
            "Format":"QuickTime TC",
            "Duration":"70.737",
            "FrameRate":"23.976",
            "TimeCode_FirstFrame":"00:00:00:00",
            "TimeCode_Striped":"Yes",
            "Language":"en",
            "extra":{
               "Encoded_Date":"UTC 2019-04-29 22:26:32",
               "Tagged_Date":"UTC 2019-04-29 22:26:32"
            }
         }
      ]
   }
}

Upvotes: 1

Views: 1141

Answers (1)

Rotem
Rotem

Reputation: 32084

I found the solution here:

Add q='1' to the output arguments list:

output = ffmpeg.output(image, output_video,
f='mov',
vcodec='prores_ks',
vprofile='3',
q='1',
pix_fmt='yuv422p10le',
g='48',
video_track_timescale='24000',
movflags='use_metadata_tags',
timecode='00:00:00:00',
color_primaries='bt709',
color_trc='bt709',
colorspace='bt709',
qcomp='1',
# BT.709 issue solved by adding the bsf option as seen via the line below
bsf='prores_metadata=color_primaries=bt709:color_trc=bt709:colorspace=bt709', 
vf='scale=in_range=full:in_color_matrix=bt709:out_range=full:out_color_matrix=bt709')

Update:
llogan's comment is correct: "A static image doesn't need VBR".
For multiple images, the q='1' flag makes a VBR output.
Without the q='1' the output video is CBR.

Tested using a sequence of 5 Tiff images from here

I used the following code for testing:

import ffmpeg

input_image = 'seq_01_intro_0200_%04d.tif'

output_video = 'output.mov'

image = ffmpeg.input(input_image, framerate='24000/1001', probesize='42M')

output = ffmpeg.output(image, output_video,
f='mov',
vcodec='prores_ks',
vprofile='3',
pix_fmt='yuv422p10le',
g='48',
q='1',
video_track_timescale='24000',
movflags='use_metadata_tags',
timecode='00:00:00:00',
color_primaries='bt709',
color_trc='bt709',
colorspace='bt709',
qcomp='1',
bsf='prores_metadata=color_primaries=bt709:color_trc=bt709:colorspace=bt709',
vf='scale=in_range=full:in_color_matrix=bt709:out_range=full:out_color_matrix=bt709')

output.run()

With q='1' (output of Media info):

{
"media": {
"@ref": "output.mov",
"track": [
{
"@type": "General",
"VideoCount": "1",
"OtherCount": "1",
"FileExtension": "mov",
"Format": "MPEG-4",
"Format_Profile": "QuickTime",
"CodecID": "qt  ",
"CodecID_Version": "0000.02",
"CodecID_Compatible": "qt  ",
"FileSize": "4121640",
"Duration": "0.209",
"OverallBitRate_Mode": "VBR",
"OverallBitRate": "157766124",
"FrameRate": "23.976",
"FrameCount": "5",
"StreamSize": "1527",
"HeaderSize": "28",
"DataSize": "4120125",
"FooterSize": "1487",
"IsStreamable": "No",
"File_Created_Date": "UTC 2019-12-14 22:14:12.446",
"File_Created_Date_Local": "2019-12-15 00:14:12.446",
"File_Modified_Date": "UTC 2019-12-14 22:16:14.442",
"File_Modified_Date_Local": "2019-12-15 00:16:14.442"
},
{
"@type": "Video",
"StreamOrder": "0",
"ID": "1",
"Format": "ProRes",
"Format_Version": "0",
"Format_Profile": "422 HQ",
"CodecID": "apch",
"Duration": "0.209",
"BitRate_Mode": "VBR",
"BitRate": "158054127",
"Width": "1280",
"Height": "720",
"Sampled_Width": "1280",
"Sampled_Height": "720",
"PixelAspectRatio": "1.000",
"DisplayAspectRatio": "1.778",
"Rotation": "0.000",
"FrameRate_Mode": "CFR",
"FrameRate": "23.976",
"FrameCount": "5",
"ColorSpace": "YUV",
"ChromaSubsampling": "4:2:2",
"ScanType": "Progressive",
"Delay": "0.000",
"StreamSize": "4120113",
"Encoded_Library": "Lavc",
"colour_description_present": "Yes",
"colour_description_present_Source": "Stream",
"colour_primaries": "BT.709",
"colour_primaries_Source": "Stream",
"transfer_characteristics": "BT.709",
"transfer_characteristics_Source": "Stream",
"matrix_coefficients": "BT.709",
"matrix_coefficients_Source": "Stream"
},
{
"@type": "Other",
"StreamOrder": "1",
"ID": "2",
"Type": "Time code",
"Format": "QuickTime TC",
"Duration": "0.209",
"FrameRate": "23.976",
"TimeCode_FirstFrame": "00:00:00:00",
"TimeCode_Striped": "Yes",
"Language": "en",
"Default": "No"
}
]
}
}

Without q='1':

{
"media": {
"@ref": "output.mov",
"track": [
{
"@type": "General",
"VideoCount": "1",
"OtherCount": "1",
"FileExtension": "mov",
"Format": "MPEG-4",
"Format_Profile": "QuickTime",
"CodecID": "qt  ",
"CodecID_Version": "0000.02",
"CodecID_Compatible": "qt  ",
"FileSize": "2394009",
"Duration": "0.209",
"OverallBitRate": "91636708",
"FrameRate": "23.976",
"FrameCount": "5",
"StreamSize": "1531",
"HeaderSize": "28",
"DataSize": "2392490",
"FooterSize": "1491",
"IsStreamable": "No",
"File_Created_Date": "UTC 2019-12-14 22:14:12.446",
"File_Created_Date_Local": "2019-12-15 00:14:12.446",
"File_Modified_Date": "UTC 2019-12-14 22:22:47.178",
"File_Modified_Date_Local": "2019-12-15 00:22:47.178"
},
{
"@type": "Video",
"StreamOrder": "0",
"ID": "1",
"Format": "ProRes",
"Format_Version": "0",
"Format_Profile": "422 HQ",
"CodecID": "apch",
"Duration": "0.209",
"BitRate_Mode": "CBR",
"BitRate": "91779284",
"Width": "1280",
"Height": "720",
"Sampled_Width": "1280",
"Sampled_Height": "720",
"PixelAspectRatio": "1.000",
"DisplayAspectRatio": "1.778",
"Rotation": "0.000",
"FrameRate_Mode": "CFR",
"FrameRate": "23.976",
"FrameCount": "5",
"ColorSpace": "YUV",
"ChromaSubsampling": "4:2:2",
"ScanType": "Progressive",
"Delay": "0.000",
"StreamSize": "2392478",
"Encoded_Library": "Lavc",
"colour_description_present": "Yes",
"colour_description_present_Source": "Stream",
"colour_primaries": "BT.709",
"colour_primaries_Source": "Stream",
"transfer_characteristics": "BT.709",
"transfer_characteristics_Source": "Stream",
"matrix_coefficients": "BT.709",
"matrix_coefficients_Source": "Stream"
},
{
"@type": "Other",
"StreamOrder": "1",
"ID": "2",
"Type": "Time code",
"Format": "QuickTime TC",
"Duration": "0.209",
"FrameRate": "23.976",
"TimeCode_FirstFrame": "00:00:00:00",
"TimeCode_Striped": "Yes",
"Language": "en",
"Default": "No"
}
]
}
}

As you can see with q='1':

"BitRate_Mode": "VBR"

Without q='1':

"BitRate_Mode": "CBR",

Upvotes: 1

Related Questions