最初由 alphaa 发布
LGPL就是Lesser GPL,与GPL最大的不同就是LGPL允许源码私有。
[原创][最后更新: 2008-01-02]Timecode format v2文件分析,C语言代码
雷鸣@2007-12-25 19:27
编写各种和timecode v2有关又需要分析timecode v2的时候可以用MeteorRain@2007-12-25 21:06
你看,你要把「LGPL」的版权信息嵌入到源代码里才算应用了协议哟海波湛蓝@2007-12-26 16:28
嗯?雷在C有突破了咯?alphaa@2007-12-26 17:08
LGPL就是Lesser GPL,与GPL最大的不同就是LGPL允许源码私有。海波湛蓝@2007-12-26 20:20
嗯.原来如此..程序语言小白我飘过..暗影翔@2007-12-27 09:21
看不懂的白白飘过MeteorRain@2007-12-27 15:34
LGPL只允许可以被二进制链接到非LGPL/GPL的程序里。GPL严禁二进制链接。引用最初由 alphaa 发布
LGPL就是Lesser GPL,与GPL最大的不同就是LGPL允许源码私有。
雷鸣@2007-12-27 18:54
引用最初由 MeteorRain 发布
你看,你要把「LGPL」的版权信息嵌入到源代码里才算应用了协议哟
绿叶之砚@2007-12-29 09:44
我喷……你还真的放出来了不败的魔术师@2007-12-30 12:02
=.=重点是 楼上的你喷什么出来=,=adamhj@2007-12-30 13:44
没考虑timecode v2文件里有空白行的情况GOD_HIKARU MK2@2007-12-30 21:24
你很强大 我进来测试签名雷鸣@2007-12-31 11:28
引用最初由 绿叶之砚 发布
我喷……你还真的放出来了
引用最初由 adamhj 发布
没考虑timecode v2文件里有空白行的情况
另外,别告诉我cframe初始值取-2是试出来的...老实说我囧了...
引用你取cframe=-1的时候对应的ctime是第0帧的,后面也是如此,cframe=n的时候的ctime是第n+1帧的,结果在算第一个node和最后一个node的framerate的时候却又按照ctime是第n帧的时间算的,所以第一个node和最后一个node算出来的帧率是错的
例如下面这个timcode
(略)
用你的代码算出来的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错误....
雷鸣@2008-01-02 14:13
改了一下思想,起始时间是这一个帧率段的第一帧的开始时间,中止时间是这一个帧率段的最后一帧播放结束的时间(也就是下一个帧率段的第一帧开始播放的时间),delta想成是上一帧的持续时间,通过侦测持续时间的变化得到帧速率变化的点。adamhj@2008-01-02 19:14
这次你代码都没贴全...囧囧囧...