没考虑timecode v2文件里有空白行的情况
另外,别告诉我cframe初始值取-2是试出来的...老实说我囧了...
你取cframe=-1的时候对应的ctime是第0帧的,后面也是如此,cframe=n的时候的ctime是第n+1帧的,结果在算第一个node和最后一个node的framerate的时候却又按照ctime是第n帧的时间算的,所以第一个node和最后一个node算出来的帧率是错的
例如下面这个timcode
- # timecode v2
- 0
- 10
- 20
- 30
- 40
- 60
- 80
- 100
- 120
- 140
- 150
- 160
- 170
- 180
- 190
- 210
- 230
- 250
- 270
- 290
- 300
- 310
- 320
- 330
- 340
- 350
- 370
- 390
- 410
- 430
- 450
用你的代码算出来的timecode v1是这样
- # timecode v1
- #startframe,endframe,framerate#starttime,endtime
- 0,3,75 #0,40
- 4,8,50 #60,140
- 9,13,100#150,190
- 14,18,50#210,290
- 19,24,100 #300,350
- 25,30,16#370,450
因为大部分视频每个node动辄上千帧所以1帧的错算出来的framerate近似没错吧,实际用的时候看不出来
还有个严重错误...最后一个Node你把分子和分母放反了...[/KH]
然后,如果你写的其他程序也是用的这个库的话,恐怕你还有一个错误(虽然已经不是这个库本身的错误了..),不然就不会一直没发现上述错误,恐怕你调用这个链表的时候用的是类似
- while(p->next) {
- p=p->next;
- //further processing
- }
这样的结构吧,并且用到的timeocode v2文件最后一帧的时间后面还有个回车(就是说文件最后有一个空白行);这样读取链表的时候实际上你会漏掉最后一个Node。由于你没考虑到空白行的处理,最后那个空白行也被当作一帧读入,而atof返回了0,结果就有个时长为0的1帧(本来不存在的一帧)的node存在,正好错误的遍历链表方法把这个node忽略了,而本来是最后一个node的timecode段也因为这个不该存在的node而变成了倒数第二个node从而避开了分母分子反了的错误而算出了正确framerate;而也因为最后一个node的分母分子放反了,所以在计算最后这个0时长的node的framerate的时候也没产生除0错误....