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]
在我的应用程序中,我使用 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]