语境 :
出于视频编辑的目的,我收到带有镜头名称、开始和结束时间码的 CSV。有趣的 CSV 数据是这样格式化的:
输入/输出源需要转换为帧范围(如 1-24),因此基本上提取镜头sequence('shot','framerange')如下:`SQ010,('010','150-1000')。一个序列可以(或不)有多个镜头和多次相同的镜头,具有相似或不同的输入和输出源。一个编辑(CSV)可以有多个序列
问题 :
1/ 我无法以预期的方式合并具有重叠帧范围的重复镜头,即:
[ ('SQ010', ('010', '0-81'),('010', '10-250') ), ('SQ020', (...) ) ]
如果同一镜头的剪辑不重叠,则结果必须是:
[ ('SQ010', ('050', '0-65,70-81'),('070', '10-250') ), ('SQ020', (...) ) ]
2/ 当我有重复的镜头时,我无法运行我们背后的所有脚本,因为他们期望独特的镜头。所以我不能(现在)改变预期的结果格式
3/由于某种原因,由于我的代码重复拍摄,列表中可能会出现一些“无”。我真的不明白如何避免它们。
我现在能做的:
我能够提取序列、镜头、时间码并对其进行转换,但不能合并重复的镜头时间码。
import csv
import re
import sys
import os
with open(writeClean, 'r') as clearSL:
reader = csv.DictReader(clearSL)
data = {}
for row in reader:
for header, value in row.items():
try:
data[header].append(value)
except KeyError:
data[header] = [value]
# extract from CSV
seqLine = []
shotLine= []
for i in data['Name']:
if i.startswith('SQ') :
seq,shot=i.split('_')
seqLine.append(seq)
shotLine.append(shot)
else:
pass
fInLine=[]
durationTCtoFrame=[]
#read framerate from the first usable shot TODO: do it per shot for precision
framerate = int( float( list( set(data['Source FPS']) )[0] ) )
#convert Timecode to frame
for TC in data['Source In']:
inTCtoFrame = int(round(tcToFrames(TC,framerate)))
fInLine.append(inTCtoFrame)
for TC in data['Source Out']:
duration = int(round(tcToFrames(TC,framerate)))
durationTCtoFrame.append(duration)
fRange = ["{}-{}".format(*i) for i in zip(fInLine, fOutLine)] #merge first frame and last frame in string format usable by GCC
shotList = list(map(lambda x,y:(x,y),shotLine,fRange)) # merge shotname with framerange
#TEST - print(shotList)
seqInfo = map(lambda x,y:(x,y),seqLine,shotList) # merge sequence and shot
#TEST - print(seqInfo)
seqClean = list(set(seqInfo)) # remove duplicate with set()
seqClean.sort() # order all
#TEST - print(seqClean)
seqList = [(i,) + tuple(i[1] for i in e) for i, e in groupby(seqClean, lambda x: x[0])] #group shots per sequences
#TEST - print(seqList)
这给了我这种类型的结果:
[('SQ010', ('050', '0-81'), ('050', '0-65'),(...)]
如果有帮助,我可以提供完整的 CSV
谢谢你
