我要using this Python library以图像(.png)作为输入以编程方式生成短视频。该视频需要与其他人创建的其他视频的规格匹配。

我的输出与其他输出之间的主要区别如下(这些是我希望拥有的媒体属性):


BitRate_Mode:VBR
colour_primaries:BT.709(Solved via the comment made by Rotem-更新了我的代码示例以包括解决方案)


我将如何实现VBR?我的理解是ProRes 422 HQ本机使用了不受约束的VBR,但我的输出指定了CBR。

其次,从我的代码可以看出,我试图符合BT.709。但是,我的媒体信息输出未指定。我做错了什么?

这是我的代码:

    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()


这是我的输出产生的媒体信息:

{
   "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"
         }
      ]
   }
}


这是我要匹配的媒体信息规范:

{
   "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"
            }
         }
      ]
   }
}

最佳答案

我找到了解决方案here

q='1'添加到输出参数列表:

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')




更新:
llogan的评论是正确的:“静态映像不需要VBR”。
对于多张图像,q='1'标志进行VBR输出。
如果没有q='1',则输出视频为CBR。

使用来自here的5张Tiff图像序列进行测试

我使用以下代码进行测试:

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()


使用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": "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"
}
]
}
}


没有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"
}
]
}
}


如您在q='1'中所看到的:


  “ BitRate_Mode”:“ VBR”


没有q='1'


  “ BitRate_Mode”:“ CBR”,

07-26 09:40