视频文件上传如何排重?

例如网盘、视频等网站,当用户上传文件时,有可能传的是同一个文件,如何在存储层对其进行排重,这里涉及到文件的存储方式及校验。我再说明一下吧,例如:A用户上传了一部10G的《阿凡达》高清电影,然后B用户也上传了一部一模一样的《阿凡达》高清(前提是一模一样),这时如何解决校验(如何判断B上传的文件和A上传的文件是一样的呢?)及排重的问题?

还有一种情况是:用户A传了一部高清《阿凡达》完整的电影,B用户传了一部没有片头的高清《阿凡达》电影,其它内容一样,或者是没有片尾的《阿凡达》,这时如何排重?

大家可以根据自己的经验和理解说说自己的想法,我不要从百度、Google等搜索引擎Copy过来的答案,请不要粘贴......

Geo5
Geo5
463
编辑于2012-03-20
评论 (0)链接2012-03-20 

对大文件进行一遍hash确实很耗时, 可以采用取病毒特征码的方式, 先比较文件大小, 然后从文件随机取几段内容进行hash, 如果一样的话, 就可以认为是同一个文件。如果能容忍低错误率的话, 可以采用这个方案。

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (3)链接 • 2012-03-20
  • 0 支持
    就像你说的,这个解决方案如果对容错率较宽的话是可以考虑,不过就像我说的第二种方式的文件,可能就会被归为两个不同的文件,这样对存储可能会很不利。很感谢您的回答。 – 浪际天涯 2012-03-20
  • 0 支持
    需要用指纹算法,不过也会不准,google youtube的指纹算法就闹了一笑话,把人录制的小鸟的叫声,识别成有版权保护的歌曲。 – Geo5 2012-03-20
  • 1 支持
    如果是youtube这种用户上传的模式,别人去除片头或者更改码流、更改编码方式后重新上传,我认为从产品上来讲就应该认为是不同的视频。 – 邵辉 2012-05-08

帮你搜索了下一些参考,你这问题属于视频指纹技术范畴有点大:

基本原理是:首先解码视频格式,然后应用很多特质提取算法,提取视频特征,生成一个较小的二进制文件,但该文件不能逆转变成原视频,该文件可以方便的存储在数据库字段中,用于比较。

视频指纹算法需要考虑如下几点:

  1. 健壮性:防止别人通过压缩视频、修改视频大小、修改某些视频帧欺骗
  2. 识别性:能够通过它把其他视频文件区别出来
  3. 压缩性:视频算法生成的文件较小,便于存储和比较。
  4. 复杂性低:快速的生成与匹配

提取视频特质的算法需要设计的领域很多,比如直方图,比如等,具体可以参考该ppt

视频指纹技术与应用:

Geo5
编辑于 2012-03-20
该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (5)链接 • 2012-03-20
  • 0 支持
    准确只是相对的,牺牲一些准确性和存储空间,提高易用性也未尝不可啊,就像视频网站,为了安全性和服务效率,本身就是要做数据的冗余。 – 王辉 2012-03-20
  • 0 支持
    土豆和优酷是不排重的,他们做的是social video.但出于版权考虑需要视频指纹的技术。 – Geo5 2012-03-20
  • 1 支持
    他们已经有海量的内容了,对于新上传的内容再进行复杂的指纹抽取和匹配我感觉很可能得不偿失,还不如做个简单的文件大小检查+李振春说的抽样hash检查,如果对于漏网的内容也不能容忍的话,我猜中国的公司宁可去雇一帮人天天看视频删视频:) – 邵辉 2012-05-08
  • 0 支持
    @邵辉 哈哈,的确是。先过滤,然后人力搞定,毕竟自己愿意去修改视频的人太少了。 – Geo5 2012-05-08
显示更多隐藏的评论

这时如何解决校验(如何判断B上传的文件和A上传的文件是一样的呢?)
这个很好解决,譬如php,md5_file取得文件的唯一值,到数据库里检索相同的文件

第二种情况,对视频解码算法和相似率 没有研究。 表示关注!

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (2)链接 • 2012-03-20
  • 0 支持
    md5_file对于小文件来说倒是可以,但是对一个例如10G的大的文件进行md5是不可行的,你可以试试就知道了(不知道半个小时够不够,而且内存要够大),md5_file是要将文件加载进内存进行计算的。 – 浪际天涯 2012-03-20
  • 0 支持
    感谢您的回答! – 浪际天涯 2012-03-20

想提几个算法之外的建议:
0、首先比较文件大小;
1、再比较视频的长度、压缩格式、编码等视频文件独有的信息;

只有上边两者均不一样是,再使用算法等进行文件的比较

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-07-02

每个文件应该都可以取得一个hash如md5值,将md5值进行对比就可以了,
$filename = "a.txt";
$md5file = md5_file($filename);
echo $md5file
md5_file取得的是文件的md5值,所以只要文件内容没有改变,重命名md5值也是一样的,可以避免文件重复

舒克
编辑于 2012-07-04
该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (2)链接 • 2012-07-04
  • 0 支持
    文件小的话可以行得通,大文件就不灵了。
    md5_file太太太太耗时
    – 迷上姐弟恋 2012-08-10
  • 0 支持
    可是对于浪迹天涯所说的第二种情况就行不通了,只要有一个字节的改动都会生成不同的MD5 – dapper 2012-11-25

我发现QQ,115网盘等是通过md5校验的;
如果用户特别会用影片工具修改,这种方式会失效。

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-11-27
德问是一个专业的编程问答社区,请 登录注册 后再提交答案