大概的原理就是,先使用一个自定义的InputFormat将视频文件从HDFS里面读到内存,这时是以二进制字节的形式存在,然后对视频文件根据其编码类型,比如x264或者xvid格式,对这些二进制的字节流进行截取,转换成一个个的桢。这时将“帧流”以key-value的方式输入到Map Task中进行处理。

其实我们之前一直存在一个误区,就是opencv的API读取的是文件路径,这两个对不上啊。但是,opencv利用VideoCapture读取文件之后还是会把它转成一个个的帧,因此,我们的Map Task其实就只要处理现成的帧就好了。这样才符合MapReduce的模型!

另外,其实Spark和Hadoop处理视频的思路应该是一样的。


相关参考资料:

  1. JAVE:ffmpeg 项目的 Java 语言封装 http://www.sauronsoftware.it/projects/jave/index.php 

  2. JavaCv–获取视频帧并保存 http://www.lvzejun.cn/?p=698 

  3. Hadoop InputFormat浅析  http://hi.baidu.com/_kouu/item/dc8d727b530f40346dc37cd1 

  4. 自定义hadoop的InputFormat  http://blog.csdn.net/zhongyifly/article/details/25156145 

  5. hadoop 自定义inputformat和outputformat  http://blackproof.iteye.com/blog/1806263 

  6. 自定义hadoop map/reduce输入文件切割InputFormat  http://hi.baidu.com/lzpsky/item/0d9d84c05afb43ba0c0a7b27 

  7. 在Hadoop的streaming中使用自定义的inputformat和outputformat  http://www.codesky.net/article/201204/172486.html 

  8. javaCV http://blog.sina.com.cn/s/blog_72cc84c001019nzd.html 

  9. Java中如何使用OpenCV http://blog.sina.com.cn/s/blog_7b4a5b550101ifi7.html