Python - 如何构建多列表for循环?

Python - how to build a multi-list for loop?

在我的应用程序中,我使用 FFmpeg 以 HLS 格式打包用于 Web 传输的视频。 在开发过程中,我编写了以下 for 循环以创建 master.m3u8 播放列表。基本上,这工作正常,除了我目前不明白的一件事。如果我有多个视频作业,我怎样才能使它以完全相同的方式工作。意思是,我在位置 [0] 有一份工作,在 [1] 有第二份工作?

for agroup_name, agroup in a_groups.items():
    streaminf = f'#EXT-X-STREAM-INF:BANDWIDTH={int(job["config"]["output_options"]["stream_bandwidth_multiplier"] * (job["video"][0]["bitrate"] + max(audio["bitrate"] for audio in agroup)))}'
    streaminf += f',RESOLUTION={str(job["video"][0]["width"])}x{str(job["video"][0]["height"])}'
    streaminf += f',CODECS="{",".join([job["video"][0]["hls"]["codec"], *set(map(lambda x: x["hls"]["codec"], agroup))])}"'
    streaminf += f',AUDIO="{agroup_name}"'

    if has_subtitles:
        # We expect only one subtitle group -> Will always be [0]
        subtitle_group_name = list(s_groups.values())[0][0]
        streaminf += f',SUBTITLES="{build_groupname(subtitle_group_name["hls"]["group_id"][0], "subtitle")}"'

    write_file_newlines(file, [
        streaminf,
        build_name(job["video"][0]) + "/master.m3u8",
        ""
    ])

目前,输出如下所示:

#EXT-X-STREAM-INF:BANDWIDTH=12238336,RESOLUTION=3840x1606,CODECS="avc1.640033,ac-3",AUDIO="a-0",SUBTITLES="s-0"
v-h264/master.m3u8

#EXT-X-STREAM-INF:BANDWIDTH=11815936,RESOLUTION=3840x1606,CODECS="avc1.640033,mp4a.40.2",AUDIO="a-1",SUBTITLES="s-0"
v-h264/master.m3u8

但最终它必须看起来像这样。所有这些信息都包含在视频作业元素中:

#EXT-X-STREAM-INF:BANDWIDTH=12238336,RESOLUTION=3840x1606,CODECS="avc1.640033,ac-3",AUDIO="a-0",SUBTITLES="s-0"
v-h264/master.m3u8

#EXT-X-STREAM-INF:BANDWIDTH=11815936,RESOLUTION=3840x1606,CODECS="avc1.640033,mp4a.40.2",AUDIO="a-1",SUBTITLES="s-0"
v-h264/master.m3u8

#EXT-X-STREAM-INF:BANDWIDTH=15238336,RESOLUTION=3840x1606,CODECS="hev1.1.6.L93.B0,ac-3",AUDIO="a-0",SUBTITLES="s-0"
v-hevc/master.m3u8

#EXT-X-STREAM-INF:BANDWIDTH=14815936,RESOLUTION=3840x1606,CODECS="hev1.1.6.L93.B0,mp4a.40.2",AUDIO="a-1",SUBTITLES="s-0"
v-hevc/master.m3u8

所以我不知何故需要遍历作业,但是这个总数让我很痛苦^^

提前致谢

如果 position [0] 表示 job["video"][0] 并且 position [1] 表示 job["video"][1] 那么您应该将外部 for 循环与 for item in job['video']: 一起使用,然后再使用item 而不是 job["video"][0]

像这样:

for item in job['video']:

    for agroup_name, agroup in a_groups.items():
        streaminf = f'#EXT-X-STREAM-INF:BANDWIDTH={int(job["config"]["output_options"]["stream_bandwidth_multiplier"] * (item["bitrate"] + max(audio["bitrate"] for audio in agroup)))}'
        streaminf += f',RESOLUTION={item["width"]}x{item["height"]}'
        streaminf += f',CODECS="{",".join([item["hls"]["codec"], *set(map(lambda x: x["hls"]["codec"], agroup))])}"'
        streaminf += f',AUDIO="{agroup_name}"'
    
        if has_subtitles:
            # We expect only one subtitle group -> Will always be [0]
            subtitle_group_name = list(s_groups.values())[0][0]
            streaminf += f',SUBTITLES="{build_groupname(subtitle_group_name["hls"]["group_id"][0], "subtitle")}"'
    
        write_file_newlines(file, [
            streaminf,
            build_name(item) + "/master.m3u8",
            ""
        ])

如果您将 [0] 与其他变量一起使用,那么您可能需要 for i in range(len(job['video'])):,然后在 job['video'][i]other_variable[i]

中使用 [i]