0

语境 :

出于视频编辑的目的,我收到带有镜头名称、开始和结束时间码的 CSV。有趣的 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

谢谢你

4

0 回答 0